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

2022-06-09 Thread gaosong

Hi Xuerui.

Thanks for you comments.

On 2022/6/9 下午6:04, WANG Xuerui wrote:

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?

See gensyscalls.sh  read_includes()

__BITS_PRE_LONG had been defined in  '-D__BITS_PER_LONG=${bits}' .

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). 


See gensyscall.sh  read_includes()

-D_UAPI_ASM_$(upper ${arch})_BITSPERLONG_H \

and kernel arch/riscv/include/uapi/asm/bitsperlong.h

#ifndef _UAPI_ASM_RISCV_BITSPERLONG_H
#define _UAPI_ASM_RISCV_BITSPERLONG_H

So riscv couldn't  get  " warning: "__BITS_PER_LONG" redefined"

For fix it ,

@@ -44,6 +46,7 @@ read_includes()

  cpp -P -nostdinc -fdirectives-only \
 -D_UAPI_ASM_$(upper ${arch})_BITSPERLONG_H \
+    -D__ASM_$(upper ${arch})_BITSPERLONG_H \
 -D__BITS_PER_LONG=${bits} \
 -I${linux}/arch/${arch}/include/uapi/ \
 -I${linux}/include/uapi \

How about this?

Thanks.
Song Gao


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

2022-06-09 Thread WANG Xuerui

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 
Signed-off-by: Xiaojuan Yang 
Reviewed-by: Richard Henderson 
Reviewed-by: Philippe Mathieu-Daudé 
---
  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 00..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_DIRBITS2
@@ -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"




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

2022-06-08 Thread Song Gao
We should disable '__BITS_PER_LONG' at [1] before run gensyscalls.sh

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

Signed-off-by: Song Gao 
Signed-off-by: Xiaojuan Yang 
Reviewed-by: Richard Henderson 
Reviewed-by: Philippe Mathieu-Daudé 
---
 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

diff --git a/linux-user/loongarch64/syscall_nr.h 
b/linux-user/loongarch64/syscall_nr.h
new file mode 100644
index 00..be00915adf
--- /dev/null
+++ b/linux-user/loongarch64/syscall_nr.h
@@ -0,0 +1,312 @@
+/*
+ * This file contains the system call numbers.
+ * Do not modify.
+ * This file is generated by scripts/gensyscalls.sh
+ */
+#ifndef LINUX_USER_LOONGARCH_SYSCALL_NR_H
+#define LINUX_USER_LOONGARCH_SYSCALL_NR_H
+
+#define TARGET_NR_io_setup 0
+#define TARGET_NR_io_destroy 1
+#define TARGET_NR_io_submit 2
+#define TARGET_NR_io_cancel 3
+#define TARGET_NR_io_getevents 4
+#define TARGET_NR_setxattr 5
+#define TARGET_NR_lsetxattr 6
+#define TARGET_NR_fsetxattr 7
+#define TARGET_NR_getxattr 8
+#define TARGET_NR_lgetxattr 9
+#define TARGET_NR_fgetxattr 10
+#define TARGET_NR_listxattr 11
+#define TARGET_NR_llistxattr 12
+#define TARGET_NR_flistxattr 13
+#define TARGET_NR_removexattr 14
+#define TARGET_NR_lremovexattr 15
+#define TARGET_NR_fremovexattr 16
+#define TARGET_NR_getcwd 17
+#define TARGET_NR_lookup_dcookie 18
+#define TARGET_NR_eventfd2 19
+#define TARGET_NR_epoll_create1 20
+#define TARGET_NR_epoll_ctl 21
+#define TARGET_NR_epoll_pwait 22
+#define TARGET_NR_dup 23
+#define TARGET_NR_dup3 24
+#define TARGET_NR_fcntl 25
+#define TARGET_NR_inotify_init1 26
+#define TARGET_NR_inotify_add_watch 27
+#define TARGET_NR_inotify_rm_watch 28
+#define TARGET_NR_ioctl 29
+#define TARGET_NR_ioprio_set 30
+#define TARGET_NR_ioprio_get 31
+#define TARGET_NR_flock 32
+#define TARGET_NR_mknodat 33
+#define TARGET_NR_mkdirat 34
+#define TARGET_NR_unlinkat 35
+#define TARGET_NR_symlinkat 36
+#define TARGET_NR_linkat 37
+#define TARGET_NR_umount2 39
+#define TARGET_NR_mount 40
+#define TARGET_NR_pivot_root 41
+#define TARGET_NR_nfsservctl 42
+#define TARGET_NR_statfs 43
+#define TARGET_NR_fstatfs 44
+#define TARGET_NR_truncate 45
+#define TARGET_NR_ftruncate 46
+#define TARGET_NR_fallocate 47
+#define TARGET_NR_faccessat 48
+#define TARGET_NR_chdir 49
+#define TARGET_NR_fchdir 50
+#define TARGET_NR_chroot 51
+#define TARGET_NR_fchmod 52
+#define TARGET_NR_fchmodat 53
+#define TARGET_NR_fchownat 54
+#define TARGET_NR_fchown 55
+#define TARGET_NR_openat 56
+#define TARGET_NR_close 57
+#define TARGET_NR_vhangup 58
+#define TARGET_NR_pipe2 59
+#define TARGET_NR_quotactl 60
+#define TARGET_NR_getdents64 61
+#define TARGET_NR_lseek 62
+#define TARGET_NR_read 63
+#define TARGET_NR_write 64
+#define TARGET_NR_readv 65
+#define TARGET_NR_writev 66
+#define TARGET_NR_pread64 67
+#define TARGET_NR_pwrite64 68
+#define TARGET_NR_preadv 69
+#define TARGET_NR_pwritev 70
+#define TARGET_NR_sendfile 71
+#define TARGET_NR_pselect6 72
+#define TARGET_NR_ppoll 73
+#define TARGET_NR_signalfd4 74
+#define TARGET_NR_vmsplice 75
+#define TARGET_NR_splice 76
+#define TARGET_NR_tee 77
+#define TARGET_NR_readlinkat 78
+#define TARGET_NR_sync 81
+#define TARGET_NR_fsync 82
+#define TARGET_NR_fdatasync 83
+#define TARGET_NR_sync_file_range 84
+#define TARGET_NR_timerfd_create 85
+#define TARGET_NR_timerfd_settime 86
+#define TARGET_NR_timerfd_gettime 87
+#define TARGET_NR_utimensat 88
+#define TARGET_NR_acct 89
+#define TARGET_NR_capget 90
+#define TARGET_NR_capset 91
+#define TARGET_NR_personality 92
+#define TARGET_NR_exit 93
+#define TARGET_NR_exit_group 94
+#define TARGET_NR_waitid 95
+#define TARGET_NR_set_tid_address 96
+#define TARGET_NR_unshare 97
+#define TARGET_NR_futex 98
+#define TARGET_NR_set_robust_list 99
+#define TARGET_NR_get_robust_list 100
+#define TARGET_NR_nanosleep 101
+#define TARGET_NR_getitimer 102
+#define TARGET_NR_setitimer 103
+#define TARGET_NR_kexec_load 104
+#define TARGET_NR_init_module 105
+#define TARGET_NR_delete_module 106
+#define TARGET_NR_timer_create 107
+#define TARGET_NR_timer_gettime 108
+#define TARGET_NR_timer_getoverrun 109
+#define TARGET_NR_timer_settime 110
+#define TARGET_NR_timer_delete 111
+#define TARGET_NR_clock_settime 112
+#define TARGET_NR_clock_gettime 113
+#define TARGET_NR_clock_getres 114
+#define TARGET_NR_clock_nanosleep 115
+#define TARGET_NR_syslog 116
+#define TARGET_NR_ptrace 117
+#define TARGET_NR_sched_setparam 118
+#define TARGET_NR_sched_setscheduler 119
+#define TARGET_NR_sched_getscheduler 120
+#define TARGET_NR_sched_getparam 121
+#define TARGET_NR_sched_setaffinity 122
+#define TARGET_NR_sched_getaffinity 123
+#define