From d8f673568b2d7b04e4832261630daef08e967fdf Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 19 Aug 2016 14:16:41 +0100 Subject: [PATCH] Add RISC-V architecture support The original port of strace was done by Palmer Dabbelt (eecs.berkeley.edu), based on strace 4.9. * configure.ac: Define RISCV for riscv*. * clone.c [RISCV]: Define ARG_* macros as for OR1K. * defs.h [RISCV] (SUPPORTED_PERSONALITIES): Define to 2. [RISCV] (NEED_UID16_PARSERS): Define to 1. * linux/riscv/arch_regs.c: New file. * linux/riscv/errnoent1.h: Likewise. * linux/riscv/get_error.c: Likewise. * linux/riscv/get_scno.c: Likewise. * linux/riscv/get_syscall_args.c: Likewise. * linux/riscv/ioctls_arch0.h: Likewise. * linux/riscv/ioctls_arch1.h: Likewise. * linux/riscv/ioctls_inc0.h: Likewise. * linux/riscv/ioctls_inc1.h: Likewise. * linux/riscv/signalent1.h: Likewise. * linux/riscv/stat32.h: Likewise. * linux/riscv/syscallent.h: Likewise. * linux/riscv/syscallent1.h: Likewise. * Makefile.am (EXTRA_DIST): Add them. Signed-off-by: Richard W.M. Jones --- 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 3125a572..32d2092c 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 0138631f..604a695e 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 0800f1f0..bbd41109 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 6f2a844e..070f2b34 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 00000000..40be17d9 --- /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 00000000..2a5c728c --- /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 00000000..be640d0a --- /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 00000000..0ca1ed34 --- /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 00000000..746e085c --- /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 00000000..9c039fc8 --- /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 00000000..41d00f92 --- /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 00000000..f9939faa --- /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 00000000..4aecf983 --- /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 00000000..39891b8f --- /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 00000000..b6fedf6d --- /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 00000000..7c416ef1 --- /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 00000000..22eff673 --- /dev/null +++ b/linux/riscv/syscallent1.h @@ -0,0 +1 @@ +#include "32/syscallent.h" -- 2.40.0