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 <rjo...@redhat.com> --- Makefile.am | 13 +++++++++++++ clone.c | 2 +- configure.ac | 5 +++++ defs.h | 2 ++ file.c | 4 ++-- 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 + 18 files changed, 66 insertions(+), 3 deletions(-) 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/file.c b/file.c index 2ff0ac7..24b10b1 100644 --- a/file.c +++ b/file.c @@ -148,7 +148,7 @@ SYS_FUNC(fstat) } #if defined STAT32_PERSONALITY && !defined HAVE_STRUCT_STAT64 -# if defined AARCH64 || defined X86_64 || defined X32 +# if defined AARCH64 || defined X86_64 || defined X32 || defined RISCV /* * Linux x86_64 and x32 have unified `struct stat' but their i386 personality * needs `struct stat64'. @@ -186,7 +186,7 @@ struct stat64 { # endif ; # define HAVE_STRUCT_STAT64 1 -# else /* !(AARCH64 || X86_64 || X32) */ +# else /* !(AARCH64 || X86_64 || X32 || RISCV) */ # warning FIXME: check whether struct stat64 definition is needed for this architecture! # endif #endif /* STAT32_PERSONALITY && !HAVE_STRUCT_STAT64 */ 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..802610e --- /dev/null +++ b/linux/riscv/stat32.h @@ -0,0 +1 @@ +#include "x86_64/stat32.h" 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 ------------------------------------------------------------------------------ _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel