[PATCH v2] Build strace for RISC-V

Richard W.M. Jones rjones at redhat.com
Fri Aug 19 10:56:05 UTC 2016


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 <rjones at 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





More information about the Strace-devel mailing list