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:
Richard W.M. Jones 2016-08-19 14:16:41 +01:00 committed by Dmitry V. Levin
parent 714a162048
commit d8f673568b
17 changed files with 64 additions and 1 deletions

View File

@ -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 \

View File

@ -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

View File

@ -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
View File

@ -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
View 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
View File

@ -0,0 +1,2 @@
/* RISC-V rv32 and rv64 */
#include "../errnoent.h"

10
linux/riscv/get_error.c Normal file
View 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
View 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;
}

View 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;
}

View File

@ -0,0 +1 @@
/* Generated by ioctls_gen.sh from definitions found in $linux/arch/riscv/include/ tree. */

View File

@ -0,0 +1 @@
#include "ioctls_arch0.h"

View File

@ -0,0 +1 @@
#include "64/ioctls_inc.h"

View File

@ -0,0 +1 @@
#include "32/ioctls_inc.h"

2
linux/riscv/signalent1.h Normal file
View File

@ -0,0 +1,2 @@
/* RISC-V rv32 and rv64 */
#include "../signalent.h"

1
linux/riscv/stat32.h Normal file
View File

@ -0,0 +1 @@
/* no 32-bit stat */

1
linux/riscv/syscallent.h Normal file
View File

@ -0,0 +1 @@
#include "64/syscallent.h"

View File

@ -0,0 +1 @@
#include "32/syscallent.h"