configure: Merge riscv32 and riscv64 host architectures
authorRichard Henderson <richard.henderson@linaro.org>
Fri, 17 Sep 2021 18:08:09 +0000 (11:08 -0700)
committerRichard Henderson <richard.henderson@linaro.org>
Sat, 30 Oct 2021 16:52:04 +0000 (09:52 -0700)
The existing code for safe-syscall.inc.S will compile
without change for riscv32 and riscv64.  We may also
drop the meson.build stanza that merges them for tcg/.

Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
configure
linux-user/host/riscv/hostdep.h [new file with mode: 0644]
linux-user/host/riscv/safe-syscall.inc.S [new file with mode: 0644]
linux-user/host/riscv32/hostdep.h [deleted file]
linux-user/host/riscv64/hostdep.h [deleted file]
linux-user/host/riscv64/safe-syscall.inc.S [deleted file]
meson.build

index 039467c04b16d142d38affdc3f9701d190588197..d57ad58342d3421bbcfd1c9a73a1d0cf8199818b 100755 (executable)
--- a/configure
+++ b/configure
@@ -570,11 +570,7 @@ elif check_define __s390__ ; then
     cpu="s390"
   fi
 elif check_define __riscv ; then
-  if check_define _LP64 ; then
-    cpu="riscv64"
-  else
-    cpu="riscv32"
-  fi
+  cpu="riscv"
 elif check_define __arm__ ; then
   cpu="arm"
 elif check_define __aarch64__ ; then
@@ -587,7 +583,7 @@ ARCH=
 # Normalise host CPU name and set ARCH.
 # Note that this case should only have supported host CPUs, not guests.
 case "$cpu" in
-  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
+  ppc|ppc64|s390x|sparc64|x32|riscv)
   ;;
   ppc64le)
     ARCH="ppc64"
diff --git a/linux-user/host/riscv/hostdep.h b/linux-user/host/riscv/hostdep.h
new file mode 100644 (file)
index 0000000..2ba0745
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * hostdep.h : things which are dependent on the host architecture
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef RISCV_HOSTDEP_H
+#define RISCV_HOSTDEP_H
+
+/* We have a safe-syscall.inc.S */
+#define HAVE_SAFE_SYSCALL
+
+#ifndef __ASSEMBLER__
+
+/* These are defined by the safe-syscall.inc.S file */
+extern char safe_syscall_start[];
+extern char safe_syscall_end[];
+
+/* Adjust the signal context to rewind out of safe-syscall if we're in it */
+static inline void rewind_if_in_safe_syscall(void *puc)
+{
+    ucontext_t *uc = puc;
+    unsigned long *pcreg = &uc->uc_mcontext.__gregs[REG_PC];
+
+    if (*pcreg > (uintptr_t)safe_syscall_start
+        && *pcreg < (uintptr_t)safe_syscall_end) {
+        *pcreg = (uintptr_t)safe_syscall_start;
+    }
+}
+
+#endif /* __ASSEMBLER__ */
+
+#endif
diff --git a/linux-user/host/riscv/safe-syscall.inc.S b/linux-user/host/riscv/safe-syscall.inc.S
new file mode 100644 (file)
index 0000000..9ca3fbf
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * safe-syscall.inc.S : host-specific assembly fragment
+ * to handle signals occurring at the same time as system calls.
+ * This is intended to be included by linux-user/safe-syscall.S
+ *
+ * Written by Richard Henderson <rth@twiddle.net>
+ * Copyright (C) 2018 Linaro, Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+       .global safe_syscall_base
+       .global safe_syscall_start
+       .global safe_syscall_end
+       .type   safe_syscall_base, @function
+       .type   safe_syscall_start, @function
+       .type   safe_syscall_end, @function
+
+       /*
+        * This is the entry point for making a system call. The calling
+        * convention here is that of a C varargs function with the
+        * first argument an 'int *' to the signal_pending flag, the
+        * second one the system call number (as a 'long'), and all further
+        * arguments being syscall arguments (also 'long').
+        * We return a long which is the syscall's return value, which
+        * may be negative-errno on failure. Conversion to the
+        * -1-and-errno-set convention is done by the calling wrapper.
+        */
+safe_syscall_base:
+       .cfi_startproc
+       /*
+        * The syscall calling convention is nearly the same as C:
+        * we enter with a0 == *signal_pending
+        *               a1 == syscall number
+        *               a2 ... a7 == syscall arguments
+        *               and return the result in a0
+        * and the syscall instruction needs
+        *               a7 == syscall number
+        *               a0 ... a5 == syscall arguments
+        *               and returns the result in a0
+        * Shuffle everything around appropriately.
+        */
+       mv      t0, a0          /* signal_pending pointer */
+       mv      t1, a1          /* syscall number */
+       mv      a0, a2          /* syscall arguments */
+       mv      a1, a3
+       mv      a2, a4
+       mv      a3, a5
+       mv      a4, a6
+       mv      a5, a7
+       mv      a7, t1
+
+       /*
+        * This next sequence of code works in conjunction with the
+        * rewind_if_safe_syscall_function(). If a signal is taken
+        * and the interrupted PC is anywhere between 'safe_syscall_start'
+        * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
+        * The code sequence must therefore be able to cope with this, and
+        * the syscall instruction must be the final one in the sequence.
+        */
+safe_syscall_start:
+       /* If signal_pending is non-zero, don't do the call */
+       lw      t1, 0(t0)
+       bnez    t1, 0f
+       scall
+safe_syscall_end:
+       /* code path for having successfully executed the syscall */
+       ret
+
+0:
+       /* code path when we didn't execute the syscall */
+       li      a0, -TARGET_ERESTARTSYS
+       ret
+       .cfi_endproc
+
+       .size   safe_syscall_base, .-safe_syscall_base
diff --git a/linux-user/host/riscv32/hostdep.h b/linux-user/host/riscv32/hostdep.h
deleted file mode 100644 (file)
index adf9edb..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef RISCV32_HOSTDEP_H
-#define RISCV32_HOSTDEP_H
-
-#endif
diff --git a/linux-user/host/riscv64/hostdep.h b/linux-user/host/riscv64/hostdep.h
deleted file mode 100644 (file)
index 865f0fb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * hostdep.h : things which are dependent on the host architecture
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#ifndef RISCV64_HOSTDEP_H
-#define RISCV64_HOSTDEP_H
-
-/* We have a safe-syscall.inc.S */
-#define HAVE_SAFE_SYSCALL
-
-#ifndef __ASSEMBLER__
-
-/* These are defined by the safe-syscall.inc.S file */
-extern char safe_syscall_start[];
-extern char safe_syscall_end[];
-
-/* Adjust the signal context to rewind out of safe-syscall if we're in it */
-static inline void rewind_if_in_safe_syscall(void *puc)
-{
-    ucontext_t *uc = puc;
-    unsigned long *pcreg = &uc->uc_mcontext.__gregs[REG_PC];
-
-    if (*pcreg > (uintptr_t)safe_syscall_start
-        && *pcreg < (uintptr_t)safe_syscall_end) {
-        *pcreg = (uintptr_t)safe_syscall_start;
-    }
-}
-
-#endif /* __ASSEMBLER__ */
-
-#endif
diff --git a/linux-user/host/riscv64/safe-syscall.inc.S b/linux-user/host/riscv64/safe-syscall.inc.S
deleted file mode 100644 (file)
index 9ca3fbf..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * safe-syscall.inc.S : host-specific assembly fragment
- * to handle signals occurring at the same time as system calls.
- * This is intended to be included by linux-user/safe-syscall.S
- *
- * Written by Richard Henderson <rth@twiddle.net>
- * Copyright (C) 2018 Linaro, Inc.
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-       .global safe_syscall_base
-       .global safe_syscall_start
-       .global safe_syscall_end
-       .type   safe_syscall_base, @function
-       .type   safe_syscall_start, @function
-       .type   safe_syscall_end, @function
-
-       /*
-        * This is the entry point for making a system call. The calling
-        * convention here is that of a C varargs function with the
-        * first argument an 'int *' to the signal_pending flag, the
-        * second one the system call number (as a 'long'), and all further
-        * arguments being syscall arguments (also 'long').
-        * We return a long which is the syscall's return value, which
-        * may be negative-errno on failure. Conversion to the
-        * -1-and-errno-set convention is done by the calling wrapper.
-        */
-safe_syscall_base:
-       .cfi_startproc
-       /*
-        * The syscall calling convention is nearly the same as C:
-        * we enter with a0 == *signal_pending
-        *               a1 == syscall number
-        *               a2 ... a7 == syscall arguments
-        *               and return the result in a0
-        * and the syscall instruction needs
-        *               a7 == syscall number
-        *               a0 ... a5 == syscall arguments
-        *               and returns the result in a0
-        * Shuffle everything around appropriately.
-        */
-       mv      t0, a0          /* signal_pending pointer */
-       mv      t1, a1          /* syscall number */
-       mv      a0, a2          /* syscall arguments */
-       mv      a1, a3
-       mv      a2, a4
-       mv      a3, a5
-       mv      a4, a6
-       mv      a5, a7
-       mv      a7, t1
-
-       /*
-        * This next sequence of code works in conjunction with the
-        * rewind_if_safe_syscall_function(). If a signal is taken
-        * and the interrupted PC is anywhere between 'safe_syscall_start'
-        * and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
-        * The code sequence must therefore be able to cope with this, and
-        * the syscall instruction must be the final one in the sequence.
-        */
-safe_syscall_start:
-       /* If signal_pending is non-zero, don't do the call */
-       lw      t1, 0(t0)
-       bnez    t1, 0f
-       scall
-safe_syscall_end:
-       /* code path for having successfully executed the syscall */
-       ret
-
-0:
-       /* code path when we didn't execute the syscall */
-       li      a0, -TARGET_ERESTARTSYS
-       ret
-       .cfi_endproc
-
-       .size   safe_syscall_base, .-safe_syscall_base
index 2c5b53cbe2e532bc372824c1e1dc0724c52f5f84..90e3e85f20b671736b7b089d5aa7c1c52d70a52d 100644 (file)
@@ -55,7 +55,7 @@ have_block = have_system or have_tools
 python = import('python').find_installation()
 
 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
-supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
+supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
   'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
 
 cpu = host_machine.cpu_family()
@@ -351,8 +351,6 @@ if not get_option('tcg').disabled()
     tcg_arch = 'i386'
   elif config_host['ARCH'] == 'ppc64'
     tcg_arch = 'ppc'
-  elif config_host['ARCH'] in ['riscv32', 'riscv64']
-    tcg_arch = 'riscv'
   endif
   add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
                         language: ['c', 'cpp', 'objc'])