[PATCH v3] Build strace for RISC-V
Richard W.M. Jones
rjones at redhat.com
Fri Aug 19 13:16:41 UTC 2016
The original port of strace was done by Palmer Dabbelt
(eecs.berkeley.edu), based on strace 4.9.
Signed-off-by: Richard W.M. Jones <rjones at redhat.com>
---
Makefile.am | 13 +++++++++++++
clone.c | 2 +-
configure.ac | 5 +++++
defs.h | 2 ++
linux/riscv/arch_regs.c | 3 +++
linux/riscv/errnoent1.h | 2 ++
linux/riscv/get_error.c | 10 ++++++++++
linux/riscv/get_scno.c | 7 +++++++
linux/riscv/get_syscall_args.c | 12 ++++++++++++
linux/riscv/ioctls_arch0.h | 1 +
linux/riscv/ioctls_arch1.h | 1 +
linux/riscv/ioctls_inc0.h | 1 +
linux/riscv/ioctls_inc1.h | 1 +
linux/riscv/signalent1.h | 2 ++
linux/riscv/stat32.h | 1 +
linux/riscv/syscallent.h | 1 +
linux/riscv/syscallent1.h | 1 +
17 files changed, 64 insertions(+), 1 deletion(-)
create mode 100644 linux/riscv/arch_regs.c
create mode 100644 linux/riscv/errnoent1.h
create mode 100644 linux/riscv/get_error.c
create mode 100644 linux/riscv/get_scno.c
create mode 100644 linux/riscv/get_syscall_args.c
create mode 100644 linux/riscv/ioctls_arch0.h
create mode 100644 linux/riscv/ioctls_arch1.h
create mode 100644 linux/riscv/ioctls_inc0.h
create mode 100644 linux/riscv/ioctls_inc1.h
create mode 100644 linux/riscv/signalent1.h
create mode 100644 linux/riscv/stat32.h
create mode 100644 linux/riscv/syscallent.h
create mode 100644 linux/riscv/syscallent1.h
diff --git a/Makefile.am b/Makefile.am
index 3125a57..32d2092 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -499,6 +499,19 @@ EXTRA_DIST = \
linux/powerpc64/syscallent1.h \
linux/powerpc64/userent.h \
linux/ptp_clock.h \
+ linux/riscv/arch_regs.c \
+ linux/riscv/errnoent1.h \
+ linux/riscv/get_error.c \
+ linux/riscv/get_scno.c \
+ linux/riscv/get_syscall_args.c \
+ linux/riscv/ioctls_arch0.h \
+ linux/riscv/ioctls_arch1.h \
+ linux/riscv/ioctls_inc0.h \
+ linux/riscv/ioctls_inc1.h \
+ linux/riscv/signalent1.h \
+ linux/riscv/stat32.h \
+ linux/riscv/syscallent.h \
+ linux/riscv/syscallent1.h \
linux/s390/arch_regs.c \
linux/s390/arch_regs.h \
linux/s390/arch_sigreturn.c \
diff --git a/clone.c b/clone.c
index 0138631..604a695 100644
--- a/clone.c
+++ b/clone.c
@@ -59,7 +59,7 @@
# define ARG_PTID 2
# define ARG_CTID ((current_personality != 1) ? 3 : 4)
# define ARG_TLS ((current_personality != 1) ? 4 : 3)
-#elif defined ALPHA || defined TILE || defined OR1K
+#elif defined ALPHA || defined TILE || defined OR1K || defined RISCV
# define ARG_FLAGS 0
# define ARG_STACK 1
# define ARG_PTID 2
diff --git a/configure.ac b/configure.ac
index 0800f1f..bbd4110 100644
--- a/configure.ac
+++ b/configure.ac
@@ -187,6 +187,11 @@ xtensa*)
AC_DEFINE([XTENSA], 1, [Define for the Xtensa architecture])
;;
+riscv*)
+ arch=riscv
+ AC_DEFINE([RISCV], 1, [Define for the RISC-V architecture])
+ ;;
+
*)
AC_MSG_RESULT([NO!])
AC_MSG_ERROR([architecture $host_cpu is not supported by strace])
diff --git a/defs.h b/defs.h
index 6f2a844..070f2b3 100644
--- a/defs.h
+++ b/defs.h
@@ -156,6 +156,7 @@ extern char *stpcpy(char *dst, const char *src);
# define PERSONALITY2_WORDSIZE 4
#elif defined AARCH64 \
|| defined POWERPC64 \
+ || defined RISCV \
|| defined SPARC64 \
|| defined TILE \
|| defined X32
@@ -357,6 +358,7 @@ extern const struct xlat whence_codes[];
|| defined(BFIN) \
|| defined(M68K) \
|| defined(MICROBLAZE) \
+ || defined(RISCV) \
|| defined(S390) \
|| defined(SH) || defined(SH64) \
|| defined(SPARC) || defined(SPARC64) \
diff --git a/linux/riscv/arch_regs.c b/linux/riscv/arch_regs.c
new file mode 100644
index 0000000..40be17d
--- /dev/null
+++ b/linux/riscv/arch_regs.c
@@ -0,0 +1,3 @@
+static struct user_regs_struct riscv_regs;
+#define ARCH_REGS_FOR_GETREGSET riscv_regs
+#define ARCH_PC_REG riscv_regs.pc
diff --git a/linux/riscv/errnoent1.h b/linux/riscv/errnoent1.h
new file mode 100644
index 0000000..2a5c728
--- /dev/null
+++ b/linux/riscv/errnoent1.h
@@ -0,0 +1,2 @@
+/* RISC-V rv32 and rv64 */
+#include "../errnoent.h"
diff --git a/linux/riscv/get_error.c b/linux/riscv/get_error.c
new file mode 100644
index 0000000..be640d0
--- /dev/null
+++ b/linux/riscv/get_error.c
@@ -0,0 +1,10 @@
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(riscv_regs.a0)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -riscv_regs.a0;
+ } else {
+ tcp->u_rval = riscv_regs.a0;
+ }
+}
diff --git a/linux/riscv/get_scno.c b/linux/riscv/get_scno.c
new file mode 100644
index 0000000..0ca1ed3
--- /dev/null
+++ b/linux/riscv/get_scno.c
@@ -0,0 +1,7 @@
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = riscv_regs.a7;
+ return 1;
+}
diff --git a/linux/riscv/get_syscall_args.c b/linux/riscv/get_syscall_args.c
new file mode 100644
index 0000000..746e085
--- /dev/null
+++ b/linux/riscv/get_syscall_args.c
@@ -0,0 +1,12 @@
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = riscv_regs.a0;
+ tcp->u_arg[1] = riscv_regs.a1;
+ tcp->u_arg[2] = riscv_regs.a2;
+ tcp->u_arg[3] = riscv_regs.a3;
+ tcp->u_arg[4] = riscv_regs.a4;
+ tcp->u_arg[5] = riscv_regs.a5;
+ return 1;
+}
diff --git a/linux/riscv/ioctls_arch0.h b/linux/riscv/ioctls_arch0.h
new file mode 100644
index 0000000..9c039fc
--- /dev/null
+++ b/linux/riscv/ioctls_arch0.h
@@ -0,0 +1 @@
+/* Generated by ioctls_gen.sh from definitions found in $linux/arch/riscv/include/ tree. */
diff --git a/linux/riscv/ioctls_arch1.h b/linux/riscv/ioctls_arch1.h
new file mode 100644
index 0000000..41d00f9
--- /dev/null
+++ b/linux/riscv/ioctls_arch1.h
@@ -0,0 +1 @@
+#include "ioctls_arch0.h"
diff --git a/linux/riscv/ioctls_inc0.h b/linux/riscv/ioctls_inc0.h
new file mode 100644
index 0000000..f9939fa
--- /dev/null
+++ b/linux/riscv/ioctls_inc0.h
@@ -0,0 +1 @@
+#include "64/ioctls_inc.h"
diff --git a/linux/riscv/ioctls_inc1.h b/linux/riscv/ioctls_inc1.h
new file mode 100644
index 0000000..4aecf98
--- /dev/null
+++ b/linux/riscv/ioctls_inc1.h
@@ -0,0 +1 @@
+#include "32/ioctls_inc.h"
diff --git a/linux/riscv/signalent1.h b/linux/riscv/signalent1.h
new file mode 100644
index 0000000..39891b8
--- /dev/null
+++ b/linux/riscv/signalent1.h
@@ -0,0 +1,2 @@
+/* RISC-V rv32 and rv64 */
+#include "../signalent.h"
diff --git a/linux/riscv/stat32.h b/linux/riscv/stat32.h
new file mode 100644
index 0000000..b6fedf6
--- /dev/null
+++ b/linux/riscv/stat32.h
@@ -0,0 +1 @@
+/* no 32-bit stat */
diff --git a/linux/riscv/syscallent.h b/linux/riscv/syscallent.h
new file mode 100644
index 0000000..7c416ef
--- /dev/null
+++ b/linux/riscv/syscallent.h
@@ -0,0 +1 @@
+#include "64/syscallent.h"
diff --git a/linux/riscv/syscallent1.h b/linux/riscv/syscallent1.h
new file mode 100644
index 0000000..22eff67
--- /dev/null
+++ b/linux/riscv/syscallent1.h
@@ -0,0 +1 @@
+#include "32/syscallent.h"
--
2.7.4
More information about the Strace-devel
mailing list