diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2020-03-29 22:50:54 +0000 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2020-03-30 23:14:24 +0200 |
commit | 2429c69961e2598902bded9c02dd601b362b66b4 (patch) | |
tree | ea115bf99b33356ec6bc08dea89307a23bde43e2 | |
parent | e948229914d830f51175e39520f84468577c925f (diff) | |
download | strace-2429c69961e2598902bded9c02dd601b362b66b4.tar.gz |
xtensa: switch to PTRACE_GETREGS API
Implement PTRACE_GETREGS API introduced on xtensa by Linux kernel commit
v2.6.13-rc1~68^2~366.
* configure.ac [xtensa]: Remove arch_enable_Werror=no.
* linux/xtensa/get_syscall_result.c: Remove.
* Makefile.am (EXTRA_DIST): Remove it.
* linux/xtensa/arch_regs.c (xtensa_regs): New variable.
(ARCH_REGS_FOR_GETREGS, ARCH_PC_REG, ARCH_SP_REG): New macros.
(xtensa_a2, ARCH_PC_PEEK_ADDR, ARCH_SP_PEEK_ADDR): Remove.
* linux/xtensa/get_error.c (arch_get_error): Use xtensa_regs.a[2].
* linux/xtensa/get_syscall_args.c (arch_get_syscall_args): Use
xtensa_regs.a.
* linux/xtensa/set_error.c (arch_set_error, arch_set_success): Use
xtensa_regs.a[2].
* NEWS: Mention this change.
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | linux/xtensa/arch_regs.c | 7 | ||||
-rw-r--r-- | linux/xtensa/get_error.c | 6 | ||||
-rw-r--r-- | linux/xtensa/get_syscall_args.c | 16 | ||||
-rw-r--r-- | linux/xtensa/get_syscall_result.c | 12 | ||||
-rw-r--r-- | linux/xtensa/set_error.c | 8 |
8 files changed, 15 insertions, 38 deletions
diff --git a/Makefile.am b/Makefile.am index 54d7ff679..9afd430c8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -947,7 +947,6 @@ EXTRA_DIST = \ linux/xtensa/get_error.c \ linux/xtensa/get_scno.c \ linux/xtensa/get_syscall_args.c \ - linux/xtensa/get_syscall_result.c \ linux/xtensa/ioctls_arch0.h \ linux/xtensa/ioctls_inc0.h \ linux/xtensa/raw_syscall.h \ @@ -13,7 +13,7 @@ Noteworthy changes in release ?.? (????-??-??) * Ability to set precision for the absolute timestamp, relative timestamp, and syscall time output (using --absolute-timestamps, --relative-timestamps, and --syscall-times options, respectively). - * Implemented PTRACE_GETREGS API support on hppa, sh, and sh64. + * Implemented PTRACE_GETREGS API support on hppa, sh, sh64, and xtensa. * Enhanced decoding of BPF_MAP_CREATE and BPF_PROG_ATTACH bpf syscall commands. * Updated lists of BPF_* constants. diff --git a/configure.ac b/configure.ac index 4ca867c40..ac566c4e0 100644 --- a/configure.ac +++ b/configure.ac @@ -198,7 +198,6 @@ x86?64*) ;; xtensa*) arch=xtensa - arch_enable_Werror=no AC_DEFINE([XTENSA], 1, [Define for the Xtensa architecture]) ;; *) diff --git a/linux/xtensa/arch_regs.c b/linux/xtensa/arch_regs.c index 557e5bacd..616cd8d7c 100644 --- a/linux/xtensa/arch_regs.c +++ b/linux/xtensa/arch_regs.c @@ -5,6 +5,7 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -static unsigned long xtensa_a2; -#define ARCH_PC_PEEK_ADDR REG_PC -#define ARCH_SP_PEEK_ADDR (REG_A_BASE + 1) +static struct user_pt_regs xtensa_regs; +#define ARCH_REGS_FOR_GETREGS xtensa_regs +#define ARCH_PC_REG xtensa_regs.pc +#define ARCH_SP_REG xtensa_regs.a[1] diff --git a/linux/xtensa/get_error.c b/linux/xtensa/get_error.c index 7fc8ac2c0..5ffd57918 100644 --- a/linux/xtensa/get_error.c +++ b/linux/xtensa/get_error.c @@ -10,10 +10,10 @@ static void arch_get_error(struct tcb *tcp, const bool check_errno) { - if (check_errno && is_negated_errno(xtensa_a2)) { + if (check_errno && is_negated_errno(xtensa_regs.a[2])) { tcp->u_rval = -1; - tcp->u_error = -xtensa_a2; + tcp->u_error = -xtensa_regs.a[2]; } else { - tcp->u_rval = xtensa_a2; + tcp->u_rval = xtensa_regs.a[2]; } } diff --git a/linux/xtensa/get_syscall_args.c b/linux/xtensa/get_syscall_args.c index 69b981c36..8d937e064 100644 --- a/linux/xtensa/get_syscall_args.c +++ b/linux/xtensa/get_syscall_args.c @@ -9,19 +9,9 @@ static int arch_get_syscall_args(struct tcb *tcp) { - /* arg0: a6, arg1: a3, arg2: a4, arg3: a5, arg4: a8, arg5: a9 */ - static const int xtensaregs[MAX_ARGS] = { - REG_A_BASE + 6, - REG_A_BASE + 3, - REG_A_BASE + 4, - REG_A_BASE + 5, - REG_A_BASE + 8, - REG_A_BASE + 9 - }; - unsigned int i; + static const unsigned int syscall_regs[MAX_ARGS] = { 6, 3, 4, 5, 8, 9 }; - for (i = 0; i < n_args(tcp); ++i) - if (upeek(tcp, xtensaregs[i], &tcp->u_arg[i]) < 0) - return -1; + for (unsigned int i = 0; i < n_args(tcp); ++i) + tcp->u_arg[i] = xtensa_regs.a[syscall_regs[i]]; return 1; } diff --git a/linux/xtensa/get_syscall_result.c b/linux/xtensa/get_syscall_result.c deleted file mode 100644 index bbb091c92..000000000 --- a/linux/xtensa/get_syscall_result.c +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2015-2018 The strace developers. - * All rights reserved. - * - * SPDX-License-Identifier: LGPL-2.1-or-later - */ - -static int -get_syscall_result_regs(struct tcb *tcp) -{ - return upeek(tcp, REG_A_BASE + 2, &xtensa_a2) < 0 ? -1 : 0; -} diff --git a/linux/xtensa/set_error.c b/linux/xtensa/set_error.c index cd6d627bc..c8dba2df4 100644 --- a/linux/xtensa/set_error.c +++ b/linux/xtensa/set_error.c @@ -8,13 +8,13 @@ static int arch_set_error(struct tcb *tcp) { - xtensa_a2 = -tcp->u_error; - return upoke(tcp, REG_A_BASE + 2, xtensa_a2); + xtensa_regs.a[2] = -tcp->u_error; + return set_regs(tcp->pid); } static int arch_set_success(struct tcb *tcp) { - xtensa_a2 = tcp->u_rval; - return upoke(tcp, REG_A_BASE + 2, xtensa_a2); + xtensa_regs.a[2] = tcp->u_rval; + return set_regs(tcp->pid); } |