summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2020-03-29 22:50:54 +0000
committerEugene Syromyatnikov <evgsyr@gmail.com>2020-03-30 23:14:24 +0200
commit2429c69961e2598902bded9c02dd601b362b66b4 (patch)
treeea115bf99b33356ec6bc08dea89307a23bde43e2
parente948229914d830f51175e39520f84468577c925f (diff)
downloadstrace-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.am1
-rw-r--r--NEWS2
-rw-r--r--configure.ac1
-rw-r--r--linux/xtensa/arch_regs.c7
-rw-r--r--linux/xtensa/get_error.c6
-rw-r--r--linux/xtensa/get_syscall_args.c16
-rw-r--r--linux/xtensa/get_syscall_result.c12
-rw-r--r--linux/xtensa/set_error.c8
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 \
diff --git a/NEWS b/NEWS
index 46f83f638..4632ac0ff 100644
--- a/NEWS
+++ b/NEWS
@@ -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);
}