qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v15 4/9] linux-user: Add LoongArch syscall support


From: WANG Xuerui
Subject: Re: [PATCH v15 4/9] linux-user: Add LoongArch syscall support
Date: Thu, 9 Jun 2022 18:04:27 +0800
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:103.0) Gecko/20100101 Thunderbird/103.0a1

On 2022/6/9 10:42, Song Gao wrote:
We should disable '__BITS_PER_LONG' at [1] before run gensyscalls.sh

  [1] arch/loongarch/include/uapi/asm/bitsperlong.h

I'm not sure why this is necessary, is this for building on 32-bit where __BITS_PER_LONG are (incorrectly) reflecting the host bitness?

If this is the case, arch/riscv uses the same trick (they are defining __BITS_PER_LONG as (__SIZEOF_POINTER__ * 8), which is essentially the same), so they should fail without the hack described here as well. I don't know if something else could be tweaked to get rid of this hack (currently unable to investigate deeper for you, taking a break reviewing this in the middle of my day job).


Signed-off-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
  linux-user/loongarch64/syscall_nr.h     | 312 ++++++++++++++++++++++++
  linux-user/loongarch64/target_syscall.h |  48 ++++
  linux-user/syscall_defs.h               |  12 +-
  scripts/gensyscalls.sh                  |   1 +
  4 files changed, 368 insertions(+), 5 deletions(-)
  create mode 100644 linux-user/loongarch64/syscall_nr.h
  create mode 100644 linux-user/loongarch64/target_syscall.h

[snip]

diff --git a/linux-user/loongarch64/target_syscall.h 
b/linux-user/loongarch64/target_syscall.h
new file mode 100644
index 0000000000..8b5de52124
--- /dev/null
+++ b/linux-user/loongarch64/target_syscall.h
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2021 Loongson Technology Corporation Limited
+ */
+
+#ifndef LOONGARCH_TARGET_SYSCALL_H
+#define LOONGARCH_TARGET_SYSCALL_H
+
+#include "qemu/units.h"
+
+/*
+ * this struct defines the way the registers are stored on the
+ * stack during a system call.
+ */
+
+struct target_pt_regs {
+    /* Saved main processor registers. */
+    target_ulong regs[32];
+
+    /* Saved special registers. */
+    struct {
+        target_ulong era;
+        target_ulong badv;
+        target_ulong crmd;
+        target_ulong prmd;
+        target_ulong euen;
+        target_ulong ecfg;
+        target_ulong estat;
+    } csr;
+    target_ulong orig_a0;
+    target_ulong __last[0];
+};
+
+#define UNAME_MACHINE "loongarch64"
+#define UNAME_MINIMUM_RELEASE "5.19.0"
+
+#define TARGET_MCL_CURRENT 1
+#define TARGET_MCL_FUTURE  2
+#define TARGET_MCL_ONFAULT 4
+
+#define TARGET_FORCE_SHMLBA
+
+static inline abi_ulong target_shmlba(CPULoongArchState *env)
+{
+    return 64 * KiB;
+}
+
+#endif
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 4587b62ac9..b5b9a02816 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -74,7 +74,7 @@
      || defined(TARGET_M68K) || defined(TARGET_CRIS) \
      || defined(TARGET_S390X) || defined(TARGET_OPENRISC) \
      || defined(TARGET_NIOS2) || defined(TARGET_RISCV) \
-    || defined(TARGET_XTENSA)
+    || defined(TARGET_XTENSA) || defined(TARGET_LOONGARCH64)
#define TARGET_IOC_SIZEBITS 14
  #define TARGET_IOC_DIRBITS    2
@@ -2084,8 +2084,9 @@ struct target_stat64  {
      abi_ulong __unused5;
  };
-#elif defined(TARGET_OPENRISC) || defined(TARGET_NIOS2) \
-        || defined(TARGET_RISCV) || defined(TARGET_HEXAGON)
+#elif defined(TARGET_OPENRISC) || defined(TARGET_NIOS2) || \
+      defined(TARGET_RISCV) || defined(TARGET_HEXAGON) || \
+      defined(TARGET_LOONGARCH64)
/* These are the asm-generic versions of the stat and stat64 structures */
The finalized LoongArch system call interface doesn't include stat, fstat or newfstatat. So do we still have to pull in the definitions for stat structures?
@@ -2113,7 +2114,7 @@ struct target_stat {
      unsigned int __unused5;
  };
-#if !defined(TARGET_RISCV64)
+#if !defined(TARGET_RISCV64) && !defined(TARGET_LOONGARCH64)
  #define TARGET_HAS_STRUCT_STAT64
  struct target_stat64 {
      uint64_t st_dev;
Similarly here.
@@ -2258,7 +2259,8 @@ struct target_statfs64 {
  };
  #elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \
         defined(TARGET_SPARC64) || defined(TARGET_AARCH64) || \
-       defined(TARGET_RISCV)) && !defined(TARGET_ABI32)
+       defined(TARGET_RISCV) || defined(TARGET_LOONGARCH64)) && \
+       !defined(TARGET_ABI32)
  struct target_statfs {
        abi_long f_type;
        abi_long f_bsize;
diff --git a/scripts/gensyscalls.sh b/scripts/gensyscalls.sh
index 8fb450e3c9..b69e1938ab 100755
--- a/scripts/gensyscalls.sh
+++ b/scripts/gensyscalls.sh
@@ -99,4 +99,5 @@ generate_syscall_nr openrisc 32 
"$output/linux-user/openrisc/syscall_nr.h"
  generate_syscall_nr riscv 32 "$output/linux-user/riscv/syscall32_nr.h"
  generate_syscall_nr riscv 64 "$output/linux-user/riscv/syscall64_nr.h"
  generate_syscall_nr hexagon 32 "$output/linux-user/hexagon/syscall_nr.h"
+generate_syscall_nr loongarch 64 "$output/linux-user/loongarch64/syscall_nr.h"
  rm -fr "$TMP"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]