]> granicus.if.org Git - strace/commitdiff
Add RISC-V architecture support
authorRichard W.M. Jones <rjones@redhat.com>
Fri, 19 Aug 2016 13:16:41 +0000 (14:16 +0100)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 21 Aug 2016 22:03:05 +0000 (22:03 +0000)
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>
17 files changed:
Makefile.am
clone.c
configure.ac
defs.h
linux/riscv/arch_regs.c [new file with mode: 0644]
linux/riscv/errnoent1.h [new file with mode: 0644]
linux/riscv/get_error.c [new file with mode: 0644]
linux/riscv/get_scno.c [new file with mode: 0644]
linux/riscv/get_syscall_args.c [new file with mode: 0644]
linux/riscv/ioctls_arch0.h [new file with mode: 0644]
linux/riscv/ioctls_arch1.h [new file with mode: 0644]
linux/riscv/ioctls_inc0.h [new file with mode: 0644]
linux/riscv/ioctls_inc1.h [new file with mode: 0644]
linux/riscv/signalent1.h [new file with mode: 0644]
linux/riscv/stat32.h [new file with mode: 0644]
linux/riscv/syscallent.h [new file with mode: 0644]
linux/riscv/syscallent1.h [new file with mode: 0644]

index 3125a57241f6e5d0c6d6d81364446f7a1f089901..32d2092cb4d74a90aebdadb46bdcb27659e84911 100644 (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     \
diff --git a/clone.c b/clone.c
index 0138631f4c63f57f8af52629ff4ffaeed675e848..604a695eaea10476fa2dd02da1ab62dad71dde97 100644 (file)
--- 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
index 0800f1f01d9e96de48696e5c1e8f1a8b43bfdc20..bbd411090206f4d472d4af6b5ad96e495a71fde9 100644 (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])
diff --git a/defs.h b/defs.h
index 6f2a844e69c032815357fed892aa77757019cfbe..070f2b3486485419fa0491bed92a6c27c91c0603 100644 (file)
--- 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 (file)
index 0000000..40be17d
--- /dev/null
@@ -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 (file)
index 0000000..2a5c728
--- /dev/null
@@ -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 (file)
index 0000000..be640d0
--- /dev/null
@@ -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 (file)
index 0000000..0ca1ed3
--- /dev/null
@@ -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 (file)
index 0000000..746e085
--- /dev/null
@@ -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 (file)
index 0000000..9c039fc
--- /dev/null
@@ -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 (file)
index 0000000..41d00f9
--- /dev/null
@@ -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 (file)
index 0000000..f9939fa
--- /dev/null
@@ -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 (file)
index 0000000..4aecf98
--- /dev/null
@@ -0,0 +1 @@
+#include "32/ioctls_inc.h"
diff --git a/linux/riscv/signalent1.h b/linux/riscv/signalent1.h
new file mode 100644 (file)
index 0000000..39891b8
--- /dev/null
@@ -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 (file)
index 0000000..b6fedf6
--- /dev/null
@@ -0,0 +1 @@
+/* no 32-bit stat */
diff --git a/linux/riscv/syscallent.h b/linux/riscv/syscallent.h
new file mode 100644 (file)
index 0000000..7c416ef
--- /dev/null
@@ -0,0 +1 @@
+#include "64/syscallent.h"
diff --git a/linux/riscv/syscallent1.h b/linux/riscv/syscallent1.h
new file mode 100644 (file)
index 0000000..22eff67
--- /dev/null
@@ -0,0 +1 @@
+#include "32/syscallent.h"