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 <rjones@redhat.com>
This commit is contained in:
parent
714a162048
commit
d8f673568b
13
Makefile.am
13
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 \
|
||||
|
2
clone.c
2
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
|
||||
|
@ -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])
|
||||
|
2
defs.h
2
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) \
|
||||
|
3
linux/riscv/arch_regs.c
Normal file
3
linux/riscv/arch_regs.c
Normal file
@ -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
|
2
linux/riscv/errnoent1.h
Normal file
2
linux/riscv/errnoent1.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* RISC-V rv32 and rv64 */
|
||||
#include "../errnoent.h"
|
10
linux/riscv/get_error.c
Normal file
10
linux/riscv/get_error.c
Normal file
@ -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;
|
||||
}
|
||||
}
|
7
linux/riscv/get_scno.c
Normal file
7
linux/riscv/get_scno.c
Normal file
@ -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;
|
||||
}
|
12
linux/riscv/get_syscall_args.c
Normal file
12
linux/riscv/get_syscall_args.c
Normal file
@ -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;
|
||||
}
|
1
linux/riscv/ioctls_arch0.h
Normal file
1
linux/riscv/ioctls_arch0.h
Normal file
@ -0,0 +1 @@
|
||||
/* Generated by ioctls_gen.sh from definitions found in $linux/arch/riscv/include/ tree. */
|
1
linux/riscv/ioctls_arch1.h
Normal file
1
linux/riscv/ioctls_arch1.h
Normal file
@ -0,0 +1 @@
|
||||
#include "ioctls_arch0.h"
|
1
linux/riscv/ioctls_inc0.h
Normal file
1
linux/riscv/ioctls_inc0.h
Normal file
@ -0,0 +1 @@
|
||||
#include "64/ioctls_inc.h"
|
1
linux/riscv/ioctls_inc1.h
Normal file
1
linux/riscv/ioctls_inc1.h
Normal file
@ -0,0 +1 @@
|
||||
#include "32/ioctls_inc.h"
|
2
linux/riscv/signalent1.h
Normal file
2
linux/riscv/signalent1.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* RISC-V rv32 and rv64 */
|
||||
#include "../signalent.h"
|
1
linux/riscv/stat32.h
Normal file
1
linux/riscv/stat32.h
Normal file
@ -0,0 +1 @@
|
||||
/* no 32-bit stat */
|
1
linux/riscv/syscallent.h
Normal file
1
linux/riscv/syscallent.h
Normal file
@ -0,0 +1 @@
|
||||
#include "64/syscallent.h"
|
1
linux/riscv/syscallent1.h
Normal file
1
linux/riscv/syscallent1.h
Normal file
@ -0,0 +1 @@
|
||||
#include "32/syscallent.h"
|
Loading…
x
Reference in New Issue
Block a user