* [musl] add loongarch64 port v3
@ 2022-05-05 3:21 王洪亮
2022-05-09 1:34 ` [musl] " 王洪亮
2022-05-16 14:27 ` [musl] " Rich Felker
0 siblings, 2 replies; 13+ messages in thread
From: 王洪亮 @ 2022-05-05 3:21 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 272 bytes --]
Hi,
I published loongarch64 port v3 in
https://github.com/loongson/musl/tree/loongarch-v2.0.
fixed two problem:
1.use __NR_clone3 in __clone().
2.remove __NR_fstat and __NR_newfstatat.
please code review if there are any other problems ? thanks.
Hongliang Wang.
[-- Attachment #2: 0001-add-loongarch64-port-v3.patch --]
[-- Type: text/x-patch, Size: 48039 bytes --]
From e952251efb2134e5c20ae8719a039a6e3c073d48 Mon Sep 17 00:00:00 2001
From: wanghongliang <wanghongliang@loongson.cn>
Date: Thu, 5 May 2022 02:44:07 +0800
Subject: [PATCH] add loongarch64 port v3.
Author: xiaojuanZhai <zhaixiaojuan@loongson.cn>
Author: meidanLi <limeidan@loongson.cn>
Author: guoqiChen <chenguoqi@loongson.cn>
Author: xiaolinZhao <zhaoxiaolin@loongson.cn>
Author: Fanpeng <fanpeng@loongson.cn>
Author: jiantaoShan <shanjiantao@loongson.cn>
Author: xuhuiQiang <qiangxuhui@loongson.cn>
Author: jingyunHua <huajingyun@loongson.cn>
Author: liuxue <liuxue@loongson.cn>
Author: wanghongliang <wanghongliang@loongson.cn
Signed-off-by: wanghongliang <wanghongliang@loongson.cn>
---
arch/loongarch64/atomic_arch.h | 53 ++++
arch/loongarch64/bits/alltypes.h.in | 18 ++
arch/loongarch64/bits/fenv.h | 20 ++
arch/loongarch64/bits/float.h | 16 ++
arch/loongarch64/bits/hwcap.h | 14 +
arch/loongarch64/bits/posix.h | 2 +
arch/loongarch64/bits/ptrace.h | 4 +
arch/loongarch64/bits/reg.h | 66 +++++
arch/loongarch64/bits/setjmp.h | 1 +
arch/loongarch64/bits/signal.h | 79 ++++++
arch/loongarch64/bits/stat.h | 18 ++
arch/loongarch64/bits/stdint.h | 20 ++
arch/loongarch64/bits/syscall.h.in | 303 +++++++++++++++++++++
arch/loongarch64/bits/user.h | 5 +
arch/loongarch64/crt_arch.h | 14 +
arch/loongarch64/kstat.h | 21 ++
arch/loongarch64/pthread_arch.h | 13 +
arch/loongarch64/reloc.h | 35 +++
arch/loongarch64/syscall_arch.h | 137 ++++++++++
configure | 1 +
crt/loongarch64/crti.s | 15 +
crt/loongarch64/crtn.s | 12 +
include/elf.h | 66 +++++
src/fenv/loongarch64/fenv.S | 72 +++++
src/ldso/loongarch64/dlsym.s | 12 +
src/setjmp/loongarch64/longjmp.S | 37 +++
src/setjmp/loongarch64/setjmp.S | 34 +++
src/signal/loongarch64/restore.s | 10 +
src/signal/loongarch64/sigsetjmp.s | 29 ++
src/thread/loongarch64/__set_thread_area.s | 7 +
src/thread/loongarch64/__unmapself.s | 7 +
src/thread/loongarch64/clone.s | 47 ++++
src/thread/loongarch64/syscall_cp.s | 29 ++
33 files changed, 1217 insertions(+)
create mode 100644 arch/loongarch64/atomic_arch.h
create mode 100644 arch/loongarch64/bits/alltypes.h.in
create mode 100644 arch/loongarch64/bits/fenv.h
create mode 100644 arch/loongarch64/bits/float.h
create mode 100644 arch/loongarch64/bits/hwcap.h
create mode 100644 arch/loongarch64/bits/posix.h
create mode 100644 arch/loongarch64/bits/ptrace.h
create mode 100644 arch/loongarch64/bits/reg.h
create mode 100644 arch/loongarch64/bits/setjmp.h
create mode 100644 arch/loongarch64/bits/signal.h
create mode 100644 arch/loongarch64/bits/stat.h
create mode 100644 arch/loongarch64/bits/stdint.h
create mode 100644 arch/loongarch64/bits/syscall.h.in
create mode 100644 arch/loongarch64/bits/user.h
create mode 100644 arch/loongarch64/crt_arch.h
create mode 100644 arch/loongarch64/kstat.h
create mode 100644 arch/loongarch64/pthread_arch.h
create mode 100644 arch/loongarch64/reloc.h
create mode 100644 arch/loongarch64/syscall_arch.h
create mode 100644 crt/loongarch64/crti.s
create mode 100644 crt/loongarch64/crtn.s
create mode 100644 src/fenv/loongarch64/fenv.S
create mode 100644 src/ldso/loongarch64/dlsym.s
create mode 100644 src/setjmp/loongarch64/longjmp.S
create mode 100644 src/setjmp/loongarch64/setjmp.S
create mode 100644 src/signal/loongarch64/restore.s
create mode 100644 src/signal/loongarch64/sigsetjmp.s
create mode 100644 src/thread/loongarch64/__set_thread_area.s
create mode 100644 src/thread/loongarch64/__unmapself.s
create mode 100644 src/thread/loongarch64/clone.s
create mode 100644 src/thread/loongarch64/syscall_cp.s
diff --git a/arch/loongarch64/atomic_arch.h b/arch/loongarch64/atomic_arch.h
new file mode 100644
index 00000000..bf4805c9
--- /dev/null
+++ b/arch/loongarch64/atomic_arch.h
@@ -0,0 +1,53 @@
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ (
+ "ll.w %0, %1"
+ : "=r"(v)
+ : "ZC"(*p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ (
+ "sc.w %0, %1"
+ : "=r"(r), "=ZC"(*p)
+ : "0"(v) : "memory");
+ return r;
+}
+
+#define a_ll_p a_ll_p
+static inline void *a_ll_p(volatile void *p)
+{
+ void *v;
+ __asm__ __volatile__ (
+ "ll.d %0, %1"
+ : "=r"(v)
+ : "ZC"(*(void *volatile *)p));
+ return v;
+}
+
+#define a_sc_p a_sc_p
+static inline int a_sc_p(volatile void *p, void *v)
+{
+ long r;
+ __asm__ __volatile__ (
+ "sc.d %0, %1"
+ : "=r"(r), "=ZC"(*(void *volatile *)p)
+ : "0"(v)
+ : "memory");
+ return r;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("dbar 0" : : : "memory");
+}
+
+#define a_pre_llsc a_barrier
+#define a_post_llsc a_barrier
diff --git a/arch/loongarch64/bits/alltypes.h.in b/arch/loongarch64/bits/alltypes.h.in
new file mode 100644
index 00000000..d1807aca
--- /dev/null
+++ b/arch/loongarch64/bits/alltypes.h.in
@@ -0,0 +1,18 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#define __BYTE_ORDER 1234
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
+TYPEDEF unsigned nlink_t;
+TYPEDEF int blksize_t;
diff --git a/arch/loongarch64/bits/fenv.h b/arch/loongarch64/bits/fenv.h
new file mode 100644
index 00000000..264cafb5
--- /dev/null
+++ b/arch/loongarch64/bits/fenv.h
@@ -0,0 +1,20 @@
+#define FE_INEXACT 0x010000
+#define FE_UNDERFLOW 0x020000
+#define FE_OVERFLOW 0x040000
+#define FE_DIVBYZERO 0x080000
+#define FE_INVALID 0x100000
+
+#define FE_ALL_EXCEPT 0x1F0000
+
+#define FE_TONEAREST 0x000
+#define FE_TOWARDZERO 0x100
+#define FE_UPWARD 0x200
+#define FE_DOWNWARD 0x300
+
+typedef unsigned fexcept_t;
+
+typedef struct {
+ unsigned __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/arch/loongarch64/bits/float.h b/arch/loongarch64/bits/float.h
new file mode 100644
index 00000000..719c7908
--- /dev/null
+++ b/arch/loongarch64/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/arch/loongarch64/bits/hwcap.h b/arch/loongarch64/bits/hwcap.h
new file mode 100644
index 00000000..c9fa08f6
--- /dev/null
+++ b/arch/loongarch64/bits/hwcap.h
@@ -0,0 +1,14 @@
+/* HWCAP - Hardware Capabilities.
+ * Hardware information is not clear at present, leave it blank.
+ */
+#define HWCAP_LOONGARCH_CPUCFG (1 << 0)
+#define HWCAP_LOONGARCH_FPU (1 << 1)
+#define HWCAP_LOONGARCH_LSX (1 << 2) /* support 128bit vectors*/
+#define HWCAP_LOONGARCH_LASX (1 << 3) /* support 256bit vectors*/
+#define HWCAP_LOONGARCH_LBT (1 << 4) /* support LBT*/
+#define HWCAP_LOONGARCH_LVZ (1 << 5) /* support virtualization expansion*/
+#define HWCAP_LOONGARCH_CRC32 (1 << 7) /* support CRC32 check*/
+#define HWCAP_LOONGARCH_AES (1 << 6)
+#define HWCAP_LOONGARCH_SHA1 (1 << 8)
+#define HWCAP_LOONGARCH_SHA2 (1 << 9)
+#define HWCAP_LOONGARCH_SHA3 (1 << 10)
diff --git a/arch/loongarch64/bits/posix.h b/arch/loongarch64/bits/posix.h
new file mode 100644
index 00000000..8068ce98
--- /dev/null
+++ b/arch/loongarch64/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFF64 1
+#define _POSIX_V7_LP64_OFF64 1
diff --git a/arch/loongarch64/bits/ptrace.h b/arch/loongarch64/bits/ptrace.h
new file mode 100644
index 00000000..741fc668
--- /dev/null
+++ b/arch/loongarch64/bits/ptrace.h
@@ -0,0 +1,4 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_GET_WATCH_REGS 0xd0
+#define PTRACE_SET_WATCH_REGS 0xd1
diff --git a/arch/loongarch64/bits/reg.h b/arch/loongarch64/bits/reg.h
new file mode 100644
index 00000000..5d3f92c5
--- /dev/null
+++ b/arch/loongarch64/bits/reg.h
@@ -0,0 +1,66 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+#define LOONGARCH64_EF_R0 0
+#define LOONGARCH64_EF_R1 1
+#define LOONGARCH64_EF_R2 2
+#define LOONGARCH64_EF_R3 3
+#define LOONGARCH64_EF_R4 4
+#define LOONGARCH64_EF_R5 5
+#define LOONGARCH64_EF_R6 6
+#define LOONGARCH64_EF_R7 7
+#define LOONGARCH64_EF_R8 8
+#define LOONGARCH64_EF_R9 9
+#define LOONGARCH64_EF_R10 10
+#define LOONGARCH64_EF_R11 11
+#define LOONGARCH64_EF_R12 12
+#define LOONGARCH64_EF_R13 13
+#define LOONGARCH64_EF_R14 14
+#define LOONGARCH64_EF_R15 15
+#define LOONGARCH64_EF_R16 16
+#define LOONGARCH64_EF_R17 17
+#define LOONGARCH64_EF_R18 18
+#define LOONGARCH64_EF_R19 19
+#define LOONGARCH64_EF_R20 20
+#define LOONGARCH64_EF_R21 21
+#define LOONGARCH64_EF_R22 22
+#define LOONGARCH64_EF_R23 23
+#define LOONGARCH64_EF_R24 24
+#define LOONGARCH64_EF_R25 25
+#define LOONGARCH64_EF_R26 26
+#define LOONGARCH64_EF_R27 27
+#define LOONGARCH64_EF_R28 28
+#define LOONGARCH64_EF_R29 29
+#define LOONGARCH64_EF_R30 30
+#define LOONGARCH64_EF_R31 31
+
+#define LOONGARCH64_EF_SIZE 304 /* size in bytes */
+
+#define EF_R0 LOONGARCH64_EF_R0
+#define EF_R1 LOONGARCH64_EF_R1
+#define EF_R2 LOONGARCH64_EF_R2
+#define EF_R3 LOONGARCH64_EF_R3
+#define EF_R4 LOONGARCH64_EF_R4
+#define EF_R5 LOONGARCH64_EF_R5
+#define EF_R6 LOONGARCH64_EF_R6
+#define EF_R7 LOONGARCH64_EF_R7
+#define EF_R8 LOONGARCH64_EF_R8
+#define EF_R9 LOONGARCH64_EF_R9
+#define EF_R10 LOONGARCH64_EF_R10
+#define EF_R11 LOONGARCH64_EF_R11
+#define EF_R12 LOONGARCH64_EF_R12
+#define EF_R13 LOONGARCH64_EF_R13
+#define EF_R14 LOONGARCH64_EF_R14
+#define EF_R15 LOONGARCH64_EF_R15
+#define EF_R16 LOONGARCH64_EF_R16
+#define EF_R17 LOONGARCH64_EF_R17
+#define EF_R18 LOONGARCH64_EF_R18
+#define EF_R19 LOONGARCH64_EF_R19
+#define EF_R20 LOONGARCH64_EF_R20
+#define EF_R21 LOONGARCH64_EF_R21
+#define EF_R22 LOONGARCH64_EF_R22
+#define EF_R23 LOONGARCH64_EF_R23
+#define EF_R24 LOONGARCH64_EF_R24
+#define EF_R25 LOONGARCH64_EF_R25
+#define EF_R26 LOONGARCH64_EF_R26
+#define EF_R27 LOONGARCH64_EF_R27
+#define EF_R28 LOONGARCH64_EF_R28
diff --git a/arch/loongarch64/bits/setjmp.h b/arch/loongarch64/bits/setjmp.h
new file mode 100644
index 00000000..f4a7f8a3
--- /dev/null
+++ b/arch/loongarch64/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[22];
diff --git a/arch/loongarch64/bits/signal.h b/arch/loongarch64/bits/signal.h
new file mode 100644
index 00000000..e6613516
--- /dev/null
+++ b/arch/loongarch64/bits/signal.h
@@ -0,0 +1,79 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 4096
+#define SIGSTKSZ 16384
+#endif
+
+typedef unsigned long greg_t, gregset_t[32];
+
+typedef struct sigcontext {
+ unsigned long pc;
+ gregset_t gregs;
+ unsigned int flags;
+ unsigned long extcontext[0] __attribute__((__aligned__(16)));
+}mcontext_t;
+
+struct sigaltstack {
+ void *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+};
+
+typedef struct __ucontext
+{
+ unsigned long uc_flags;
+ struct __ucontext *uc_link;
+ stack_t uc_stack;
+ sigset_t uc_sigmask;
+ mcontext_t uc_mcontext;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/arch/loongarch64/bits/stat.h b/arch/loongarch64/bits/stat.h
new file mode 100644
index 00000000..b7f4221b
--- /dev/null
+++ b/arch/loongarch64/bits/stat.h
@@ -0,0 +1,18 @@
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned long __pad;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __pad2;
+ blkcnt_t st_blocks;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ unsigned __unused[2];
+};
diff --git a/arch/loongarch64/bits/stdint.h b/arch/loongarch64/bits/stdint.h
new file mode 100644
index 00000000..1bb147f2
--- /dev/null
+++ b/arch/loongarch64/bits/stdint.h
@@ -0,0 +1,20 @@
+typedef int32_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef uint32_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+
+#define INT_FAST16_MIN INT32_MIN
+#define INT_FAST32_MIN INT32_MIN
+
+#define INT_FAST16_MAX INT32_MAX
+#define INT_FAST32_MAX INT32_MAX
+
+#define UINT_FAST16_MAX UINT32_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+
+#define INTPTR_MIN INT64_MIN
+#define INTPTR_MAX INT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define PTRDIFF_MIN INT64_MIN
+#define PTRDIFF_MAX INT64_MAX
+#define SIZE_MAX UINT64_MAX
diff --git a/arch/loongarch64/bits/syscall.h.in b/arch/loongarch64/bits/syscall.h.in
new file mode 100644
index 00000000..689ff36b
--- /dev/null
+++ b/arch/loongarch64/bits/syscall.h.in
@@ -0,0 +1,303 @@
+#define __NR_io_setup 0
+#define __NR_io_destroy 1
+#define __NR_io_submit 2
+#define __NR_io_cancel 3
+#define __NR_io_getevents 4
+#define __NR_setxattr 5
+#define __NR_lsetxattr 6
+#define __NR_fsetxattr 7
+#define __NR_getxattr 8
+#define __NR_lgetxattr 9
+#define __NR_fgetxattr 10
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_flistxattr 13
+#define __NR_removexattr 14
+#define __NR_lremovexattr 15
+#define __NR_fremovexattr 16
+#define __NR_getcwd 17
+#define __NR_lookup_dcookie 18
+#define __NR_eventfd2 19
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR3264_fcntl 25
+#define __NR_inotify_init1 26
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_rm_watch 28
+#define __NR_ioctl 29
+#define __NR_ioprio_set 30
+#define __NR_ioprio_get 31
+#define __NR_flock 32
+#define __NR_mknodat 33
+#define __NR_mkdirat 34
+#define __NR_unlinkat 35
+#define __NR_symlinkat 36
+#define __NR_linkat 37
+#define __NR_umount2 39
+#define __NR_mount 40
+#define __NR_pivot_root 41
+#define __NR_nfsservctl 42
+#define __NR3264_statfs 43
+#define __NR3264_fstatfs 44
+#define __NR3264_truncate 45
+#define __NR3264_ftruncate 46
+#define __NR_fallocate 47
+#define __NR_faccessat 48
+#define __NR_chdir 49
+#define __NR_fchdir 50
+#define __NR_chroot 51
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchownat 54
+#define __NR_fchown 55
+#define __NR_openat 56
+#define __NR_close 57
+#define __NR_vhangup 58
+#define __NR_pipe2 59
+#define __NR_quotactl 60
+#define __NR_getdents64 61
+#define __NR3264_lseek 62
+#define __NR_read 63
+#define __NR_write 64
+#define __NR_readv 65
+#define __NR_writev 66
+#define __NR_pread64 67
+#define __NR_pwrite64 68
+#define __NR_preadv 69
+#define __NR_pwritev 70
+#define __NR3264_sendfile 71
+#define __NR_pselect6 72
+#define __NR_ppoll 73
+#define __NR_signalfd4 74
+#define __NR_vmsplice 75
+#define __NR_splice 76
+#define __NR_tee 77
+#define __NR_readlinkat 78
+#define __NR_sync 81
+#define __NR_fsync 82
+#define __NR_fdatasync 83
+#define __NR_sync_file_range 84
+#define __NR_timerfd_create 85
+#define __NR_timerfd_settime 86
+#define __NR_timerfd_gettime 87
+#define __NR_utimensat 88
+#define __NR_acct 89
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_personality 92
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_waitid 95
+#define __NR_set_tid_address 96
+#define __NR_unshare 97
+#define __NR_futex 98
+#define __NR_set_robust_list 99
+#define __NR_get_robust_list 100
+#define __NR_nanosleep 101
+#define __NR_getitimer 102
+#define __NR_setitimer 103
+#define __NR_kexec_load 104
+#define __NR_init_module 105
+#define __NR_delete_module 106
+#define __NR_timer_create 107
+#define __NR_timer_gettime 108
+#define __NR_timer_getoverrun 109
+#define __NR_timer_settime 110
+#define __NR_timer_delete 111
+#define __NR_clock_settime 112
+#define __NR_clock_gettime 113
+#define __NR_clock_getres 114
+#define __NR_clock_nanosleep 115
+#define __NR_syslog 116
+#define __NR_ptrace 117
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_getscheduler 120
+#define __NR_sched_getparam 121
+#define __NR_sched_setaffinity 122
+#define __NR_sched_getaffinity 123
+#define __NR_sched_yield 124
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_rr_get_interval 127
+#define __NR_restart_syscall 128
+#define __NR_kill 129
+#define __NR_tkill 130
+#define __NR_tgkill 131
+#define __NR_sigaltstack 132
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_setpriority 140
+#define __NR_getpriority 141
+#define __NR_reboot 142
+#define __NR_setregid 143
+#define __NR_setgid 144
+#define __NR_setreuid 145
+#define __NR_setuid 146
+#define __NR_setresuid 147
+#define __NR_getresuid 148
+#define __NR_setresgid 149
+#define __NR_getresgid 150
+#define __NR_setfsuid 151
+#define __NR_setfsgid 152
+#define __NR_times 153
+#define __NR_setpgid 154
+#define __NR_getpgid 155
+#define __NR_getsid 156
+#define __NR_setsid 157
+#define __NR_getgroups 158
+#define __NR_setgroups 159
+#define __NR_uname 160
+#define __NR_sethostname 161
+#define __NR_setdomainname 162
+#define __NR_getrlimit 163
+#define __NR_setrlimit 164
+#define __NR_getrusage 165
+#define __NR_umask 166
+#define __NR_prctl 167
+#define __NR_getcpu 168
+#define __NR_gettimeofday 169
+#define __NR_settimeofday 170
+#define __NR_adjtimex 171
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getuid 174
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getegid 177
+#define __NR_gettid 178
+#define __NR_sysinfo 179
+#define __NR_mq_open 180
+#define __NR_mq_unlink 181
+#define __NR_mq_timedsend 182
+#define __NR_mq_timedreceive 183
+#define __NR_mq_notify 184
+#define __NR_mq_getsetattr 185
+#define __NR_msgget 186
+#define __NR_msgctl 187
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_semget 190
+#define __NR_semctl 191
+#define __NR_semtimedop 192
+#define __NR_semop 193
+#define __NR_shmget 194
+#define __NR_shmctl 195
+#define __NR_shmat 196
+#define __NR_shmdt 197
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_bind 200
+#define __NR_listen 201
+#define __NR_accept 202
+#define __NR_connect 203
+#define __NR_getsockname 204
+#define __NR_getpeername 205
+#define __NR_sendto 206
+#define __NR_recvfrom 207
+#define __NR_setsockopt 208
+#define __NR_getsockopt 209
+#define __NR_shutdown 210
+#define __NR_sendmsg 211
+#define __NR_recvmsg 212
+#define __NR_readahead 213
+#define __NR_brk 214
+#define __NR_munmap 215
+#define __NR_mremap 216
+#define __NR_add_key 217
+#define __NR_request_key 218
+#define __NR_keyctl 219
+#define __NR_clone 220
+#define __NR_execve 221
+#define __NR3264_mmap 222
+#define __NR3264_fadvise64 223
+#define __NR_swapon 224
+#define __NR_swapoff 225
+#define __NR_mprotect 226
+#define __NR_msync 227
+#define __NR_mlock 228
+#define __NR_munlock 229
+#define __NR_mlockall 230
+#define __NR_munlockall 231
+#define __NR_mincore 232
+#define __NR_madvise 233
+#define __NR_remap_file_pages 234
+#define __NR_mbind 235
+#define __NR_get_mempolicy 236
+#define __NR_set_mempolicy 237
+#define __NR_migrate_pages 238
+#define __NR_move_pages 239
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_perf_event_open 241
+#define __NR_accept4 242
+#define __NR_recvmmsg 243
+#define __NR_arch_specific_syscall 244
+#define __NR_wait4 260
+#define __NR_prlimit64 261
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_name_to_handle_at 264
+#define __NR_open_by_handle_at 265
+#define __NR_clock_adjtime 266
+#define __NR_syncfs 267
+#define __NR_setns 268
+#define __NR_sendmmsg 269
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_kcmp 272
+#define __NR_finit_module 273
+#define __NR_sched_setattr 274
+#define __NR_sched_getattr 275
+#define __NR_renameat2 276
+#define __NR_seccomp 277
+#define __NR_getrandom 278
+#define __NR_memfd_create 279
+#define __NR_bpf 280
+#define __NR_execveat 281
+#define __NR_userfaultfd 282
+#define __NR_membarrier 283
+#define __NR_mlock2 284
+#define __NR_copy_file_range 285
+#define __NR_preadv2 286
+#define __NR_pwritev2 287
+#define __NR_pkey_mprotect 288
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_statx 291
+#define __NR_io_pgetevents 292
+#define __NR_rseq 293
+#define __NR_kexec_file_load 294
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_fcntl __NR3264_fcntl
+#define __NR_statfs __NR3264_statfs
+#define __NR_fstatfs __NR3264_fstatfs
+#define __NR_truncate __NR3264_truncate
+#define __NR_ftruncate __NR3264_ftruncate
+#define __NR_lseek __NR3264_lseek
+#define __NR_sendfile __NR3264_sendfile
+#define __NR_mmap __NR3264_mmap
+#define __NR_fadvise64 __NR3264_fadvise64
diff --git a/arch/loongarch64/bits/user.h b/arch/loongarch64/bits/user.h
new file mode 100644
index 00000000..4d4cd534
--- /dev/null
+++ b/arch/loongarch64/bits/user.h
@@ -0,0 +1,5 @@
+#define ELF_NGREG 45
+#define ELF_NFPREG 33
+
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG];
diff --git a/arch/loongarch64/crt_arch.h b/arch/loongarch64/crt_arch.h
new file mode 100644
index 00000000..c806a0bf
--- /dev/null
+++ b/arch/loongarch64/crt_arch.h
@@ -0,0 +1,14 @@
+__asm__(
+".text \n"
+".global " START "\n"
+".type " START ", @function\n"
+START ":\n"
+" add.w $fp, $r0,$r0\n"
+" or $a0, $sp, $zero\n"
+".weak _DYNAMIC\n"
+".hidden _DYNAMIC\n"
+" la.local $a1, _DYNAMIC\n"
+" addi.w $t7, $r0, -16\n"
+" and $sp, $sp, $t7\n"
+" b " START "_c\n"
+);
diff --git a/arch/loongarch64/kstat.h b/arch/loongarch64/kstat.h
new file mode 100644
index 00000000..900f119d
--- /dev/null
+++ b/arch/loongarch64/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned long __pad;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __pad2;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ unsigned long st_atime_nsec;
+ long st_mtime_sec;
+ unsigned long st_mtime_nsec;
+ long st_ctime_sec;
+ unsigned long st_ctime_nsec;
+ unsigned __unused[2];
+};
diff --git a/arch/loongarch64/pthread_arch.h b/arch/loongarch64/pthread_arch.h
new file mode 100644
index 00000000..95ee4c7a
--- /dev/null
+++ b/arch/loongarch64/pthread_arch.h
@@ -0,0 +1,13 @@
+static inline uintptr_t __get_tp()
+{
+ register uintptr_t tp __asm__("tp");
+ __asm__ ("" : "=r" (tp) );
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define DTP_OFFSET 0
+
+#define MC_PC pc
diff --git a/arch/loongarch64/reloc.h b/arch/loongarch64/reloc.h
new file mode 100644
index 00000000..249cb40c
--- /dev/null
+++ b/arch/loongarch64/reloc.h
@@ -0,0 +1,35 @@
+#ifndef __RELOC_H__
+#define __RELOC_H__
+
+#define _GNU_SOURCE
+#include <endian.h>
+
+#ifdef __loongarch64_soft_float
+#define FP_SUFFIX "-sf"
+#else
+#define FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "loongarch64" FP_SUFFIX
+
+#define TPOFF_K (0x0)
+
+#define REL_PLT R_LARCH_JUMP_SLOT
+#define REL_COPY R_LARCH_COPY
+#define REL_DTPMOD R_LARCH_TLS_DTPMOD64
+#define REL_DTPOFF R_LARCH_TLS_DTPREL64
+#define REL_TPOFF R_LARCH_TLS_TPREL64
+#define REL_RELATIVE R_LARCH_RELATIVE
+#define REL_SYMBOLIC R_LARCH_64
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ ".align 8 \n" \
+ " la.local $t1, "#sym" \n" \
+ " or %0, $t1, $zero \n" \
+ : "=r"(*(fp)) : : "memory" )
+
+#endif
diff --git a/arch/loongarch64/syscall_arch.h b/arch/loongarch64/syscall_arch.h
new file mode 100644
index 00000000..ddd29578
--- /dev/null
+++ b/arch/loongarch64/syscall_arch.h
@@ -0,0 +1,137 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define SYSCALL_CLOBBERLIST \
+ "$t0", "$t1", "$t2", "$t3", \
+ "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
+
+static inline long __syscall0(long n)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0");
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "=r"(a0)
+ : "r"(a7)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+ register long a1 __asm__("$a1") = b;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7), "r"(a1)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+ register long a1 __asm__("$a1") = b;
+ register long a2 __asm__("$a2") = c;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7), "r"(a1), "r"(a2)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+ register long a1 __asm__("$a1") = b;
+ register long a2 __asm__("$a2") = c;
+ register long a3 __asm__("$a3") = d;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7), "r"(a1), "r"(a2), "r"(a3)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+ register long a1 __asm__("$a1") = b;
+ register long a2 __asm__("$a2") = c;
+ register long a3 __asm__("$a3") = d;
+ register long a4 __asm__("$a4") = e;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7), "r"(a1), "r"(a2), "r"(a3), "r"(a4)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+ register long a1 __asm__("$a1") = b;
+ register long a2 __asm__("$a2") = c;
+ register long a3 __asm__("$a3") = d;
+ register long a4 __asm__("$a4") = e;
+ register long a5 __asm__("$a5") = f;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g)
+{
+ register long a7 __asm__("$a7") = n;
+ register long a0 __asm__("$a0") = a;
+ register long a1 __asm__("$a1") = b;
+ register long a2 __asm__("$a2") = c;
+ register long a3 __asm__("$a3") = d;
+ register long a4 __asm__("$a4") = e;
+ register long a5 __asm__("$a5") = f;
+ register long a6 __asm__("$a6") = g;
+
+ __asm__ __volatile__ (
+ "syscall 0"
+ : "+r"(a0)
+ : "r"(a7), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5), "r"(a6)
+ : SYSCALL_CLOBBERLIST);
+ return a0;
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT_SYM "__vdso_clock_gettime"
+#define VDSO_CGT_VER "LINUX_2.6"
+
+#define IPC_64 0
diff --git a/configure b/configure
index 6f5453f5..aac0c467 100755
--- a/configure
+++ b/configure
@@ -338,6 +338,7 @@ powerpc*|ppc*) ARCH=powerpc ;;
riscv64*) ARCH=riscv64 ;;
sh[1-9bel-]*|sh|superh*) ARCH=sh ;;
s390x*) ARCH=s390x ;;
+loongarch64*) ARCH=loongarch64 ;;
unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;;
*) fail "$0: unknown or unsupported target \"$target\"" ;;
esac
diff --git a/crt/loongarch64/crti.s b/crt/loongarch64/crti.s
new file mode 100644
index 00000000..96a754d3
--- /dev/null
+++ b/crt/loongarch64/crti.s
@@ -0,0 +1,15 @@
+.section .init
+.global _init
+_init:
+ addi.d $r3,$r3,-16
+ st.d $fp,$r3,0
+ st.d $ra,$r3,8
+ addi.d $fp,$r3,16
+
+.section .fini
+.global _fini
+_fini:
+ addi.d $r3,$r3,-16
+ st.d $fp,$r3,0
+ st.d $ra,$r3,8
+ addi.d $fp,$r3,16
diff --git a/crt/loongarch64/crtn.s b/crt/loongarch64/crtn.s
new file mode 100644
index 00000000..bffb18f4
--- /dev/null
+++ b/crt/loongarch64/crtn.s
@@ -0,0 +1,12 @@
+.section .init
+ ld.d $fp,$r3,0
+ ld.d $ra,$r3,8
+ addi.d $r3,$r3,16
+ jirl $r0,$ra,0
+
+
+.section .fini
+ ld.d $fp,$r3,0
+ ld.d $ra,$r3,8
+ addi.d $r3,$r3,16
+ jirl $r0,$ra,0
diff --git a/include/elf.h b/include/elf.h
index 86e2f0bb..69b01ff4 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -697,6 +697,11 @@ typedef struct {
#define NT_MIPS_FP_MODE 0x801
#define NT_MIPS_MSA 0x802
#define NT_VERSION 1
+#define NT_LOONGARCH_CPUCFG 0xa00
+#define NT_LOONGARCH_CSR 0xa01
+#define NT_LOONGARCH_LSX 0xa02
+#define NT_LOONGARCH_LASX 0xa03
+#define NT_LOONGARCH_LBT 0xa04
@@ -3288,6 +3293,67 @@ enum
#define R_RISCV_SET32 56
#define R_RISCV_32_PCREL 57
+/* LoongISA ELF Flags */
+#define EM_LOONGARCH 258
+
+#define EF_LARCH_ABI 0x0003
+#define EF_LARCH_ABI_LP64 0x0003
+#define EF_LARCH_ABI_LP32 0x0001
+
+/* Loongarch specific dynamic relocations. */
+#define R_LARCH_NONE 0
+#define R_LARCH_32 1
+#define R_LARCH_64 2
+#define R_LARCH_RELATIVE 3
+#define R_LARCH_COPY 4
+#define R_LARCH_JUMP_SLOT 5
+#define R_LARCH_TLS_DTPMOD32 6
+#define R_LARCH_TLS_DTPMOD64 7
+#define R_LARCH_TLS_DTPREL32 8
+#define R_LARCH_TLS_DTPREL64 9
+#define R_LARCH_TLS_TPREL32 10
+#define R_LARCH_TLS_TPREL64 11
+#define R_LARCH_IRELATIVE 12
+#define R_LARCH_MARK_LA 20
+#define R_LARCH_MARK_PCREL 21
+#define R_LARCH_SOP_PUSH_PCREL 22
+#define R_LARCH_SOP_PUSH_ABSOLUTE 23
+#define R_LARCH_SOP_PUSH_DUP 24
+#define R_LARCH_SOP_PUSH_GPREL 25
+#define R_LARCH_SOP_PUSH_TLS_TPREL 26
+#define R_LARCH_SOP_PUSH_TLS_GOT 27
+#define R_LARCH_SOP_PUSH_TLS_GD 28
+#define R_LARCH_SOP_PUSH_PLT_PCREL 29
+#define R_LARCH_SOP_ASSERT 30
+#define R_LARCH_SOP_NOT 31
+#define R_LARCH_SOP_SUB 32
+#define R_LARCH_SOP_SL 33
+#define R_LARCH_SOP_SR 34
+#define R_LARCH_SOP_ADD 35
+#define R_LARCH_SOP_AND 36
+#define R_LARCH_SOP_IF_ELSE 37
+#define R_LARCH_SOP_POP_32_S_10_5 38
+#define R_LARCH_SOP_POP_32_U_10_12 39
+#define R_LARCH_SOP_POP_32_S_10_12 40
+#define R_LARCH_SOP_POP_32_S_10_16 41
+#define R_LARCH_SOP_POP_32_S_10_16_S2 42
+#define R_LARCH_SOP_POP_32_S_5_20 43
+#define R_LARCH_SOP_POP_32_S_0_5_10_16_S2 44
+#define R_LARCH_SOP_POP_32_S_0_10_10_16_S2 45
+#define R_LARCH_SOP_POP_32_U 46
+#define R_LARCH_ADD8 47
+#define R_LARCH_ADD16 48
+#define R_LARCH_ADD24 49
+#define R_LARCH_ADD32 50
+#define R_LARCH_ADD64 51
+#define R_LARCH_SUB8 52
+#define R_LARCH_SUB16 53
+#define R_LARCH_SUB24 54
+#define R_LARCH_SUB32 55
+#define R_LARCH_SUB64 56
+#define R_LARCH_GNU_VTINHERIT 57
+#define R_LARCH_GNU_VTENTRY 58
+
#ifdef __cplusplus
}
#endif
diff --git a/src/fenv/loongarch64/fenv.S b/src/fenv/loongarch64/fenv.S
new file mode 100644
index 00000000..049234be
--- /dev/null
+++ b/src/fenv/loongarch64/fenv.S
@@ -0,0 +1,72 @@
+#ifndef __loongarch_soft_float
+
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ li.w $a1, 0x1f0000 //flags in 16-20 bit of fcsr0.
+ and $a0, $a0, $a1
+ movfcsr2gr $a1, $r0
+ or $a1, $a1, $a0
+ xor $a1, $a1, $a0
+ movgr2fcsr $r0, $a1
+ li.w $v0, 0
+ jirl $zero, $ra, 0
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ li.w $a1, 0x1f0000
+ and $a0, $a0, $a1
+ movfcsr2gr $a1, $r0
+ or $a1, $a1, $a0
+ movgr2fcsr $r0, $a1
+ li.w $v0, 0
+ jirl $zero, $ra, 0
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ li.w $a1, 0x1f0000
+ and $a0, $a0, $a1
+ movfcsr2gr $a1, $r0
+ and $v0, $a1, $a0
+ jirl $zero, $ra, 0
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ movfcsr2gr $v0, $r0
+ andi $v0, $v0, 0x300 //fcsr0.RM
+ jirl $zero, $ra, 0
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ movfcsr2gr $a1, $r0
+ li.w $a2, -769 //0xfffffcff
+ and $a1, $a1, $a2
+ or $a1, $a1, $a0
+ movgr2fcsr $r0, $a1
+ li.w $v0, 0
+ jirl $zero, $ra, 0
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ movfcsr2gr $a1, $r0
+ st.w $a1, $a0, 0
+ li.w $v0, 0
+ jirl $zero, $ra, 0
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ addi.d $a1, $a0, 1
+ beq $a1, $r0, 1f
+ ld.w $a1, $a0, 0
+1: movgr2fcsr $r0, $a1
+ li.w $v0, 0
+ jirl $zero, $ra, 0
+
+#endif
diff --git a/src/ldso/loongarch64/dlsym.s b/src/ldso/loongarch64/dlsym.s
new file mode 100644
index 00000000..10ac5c7f
--- /dev/null
+++ b/src/ldso/loongarch64/dlsym.s
@@ -0,0 +1,12 @@
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ move $a2, $ra
+ la.global $r16, __dlsym
+ addi.d $sp, $sp, -8
+ st.d $ra, $sp, 0
+ jirl $ra, $r16, 0
+ ld.d $ra, $sp, 0
+ addi.d $sp, $sp, 8
+ jirl $r0, $ra, 0
diff --git a/src/setjmp/loongarch64/longjmp.S b/src/setjmp/loongarch64/longjmp.S
new file mode 100644
index 00000000..41d897ed
--- /dev/null
+++ b/src/setjmp/loongarch64/longjmp.S
@@ -0,0 +1,37 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ add.d $t5, $a0, $zero
+ add.d $v0, $a1, $zero
+
+ bne $v0, $zero, 1f
+ addi.d $v0, $v0, 1
+
+1:
+ ld.d $ra, $t5, 0
+ ld.d $sp, $t5, 8
+ ld.d $r21,$t5, 16
+ ld.d $fp, $t5, 24
+ ld.d $s0, $t5, 32
+ ld.d $s1, $t5, 40
+ ld.d $s2, $t5, 48
+ ld.d $s3, $t5, 56
+ ld.d $s4, $t5, 64
+ ld.d $s5, $t5, 72
+ ld.d $s6, $t5, 80
+ ld.d $s7, $t5, 88
+ ld.d $s8, $t5, 96
+#ifndef __loongarch64_soft_float
+ fld.d $fs0, $t5, 104
+ fld.d $fs1, $t5, 112
+ fld.d $fs2, $t5, 120
+ fld.d $fs3, $t5, 128
+ fld.d $fs4, $t5, 136
+ fld.d $fs5, $t5, 144
+ fld.d $fs6, $t5, 152
+ fld.d $fs7, $t5, 160
+#endif
+ jirl $zero, $ra, 0
diff --git a/src/setjmp/loongarch64/setjmp.S b/src/setjmp/loongarch64/setjmp.S
new file mode 100644
index 00000000..8dca3cb8
--- /dev/null
+++ b/src/setjmp/loongarch64/setjmp.S
@@ -0,0 +1,34 @@
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ st.d $ra, $a0, 0
+ st.d $sp, $a0, 8
+ st.d $r21,$a0, 16
+ st.d $fp, $a0, 24
+ st.d $s0, $a0, 32
+ st.d $s1, $a0, 40
+ st.d $s2, $a0, 48
+ st.d $s3, $a0, 56
+ st.d $s4, $a0, 64
+ st.d $s5, $a0, 72
+ st.d $s6, $a0, 80
+ st.d $s7, $a0, 88
+ st.d $s8, $a0, 96
+#ifndef __loongarch64_soft_float
+ fst.d $fs0, $a0, 104
+ fst.d $fs1, $a0, 112
+ fst.d $fs2, $a0, 120
+ fst.d $fs3, $a0, 128
+ fst.d $fs4, $a0, 136
+ fst.d $fs5, $a0, 144
+ fst.d $fs6, $a0, 152
+ fst.d $fs7, $a0, 160
+#endif
+ xor $v0, $v0, $v0
+ jirl $zero, $ra, 0
diff --git a/src/signal/loongarch64/restore.s b/src/signal/loongarch64/restore.s
new file mode 100644
index 00000000..9bf015a0
--- /dev/null
+++ b/src/signal/loongarch64/restore.s
@@ -0,0 +1,10 @@
+.global __restore_rt
+.global __restore
+.hidden __restore_rt
+.hidden __restore
+.type __restore_rt,@function
+.type __restore,@function
+__restore_rt:
+__restore:
+ ori $a7, $zero, 139
+ syscall 0
diff --git a/src/signal/loongarch64/sigsetjmp.s b/src/signal/loongarch64/sigsetjmp.s
new file mode 100644
index 00000000..d53f334a
--- /dev/null
+++ b/src/signal/loongarch64/sigsetjmp.s
@@ -0,0 +1,29 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ or $t5, $a0, $zero
+ or $t6, $a1, $zero
+
+ # comparing save mask with 0, if equals to 0 then
+ # sigsetjmp is equal to setjmp.
+ beq $t6, $zero, 1f
+ st.d $ra, $t5, 168
+
+ # save base of got so that we can use it later
+ # once we return from 'longjmp'
+ la.global $t8, setjmp
+ jirl $ra, $t8, 0
+
+ or $v1, $v0, $zero # Return from 'setjmp' or 'longjmp'
+ ld.d $ra, $t5, 168 # Restore ra of sigsetjmp
+ or $a0, $t5, $zero
+
+.hidden __sigsetjmp_tail
+ la.global $t8, __sigsetjmp_tail
+ jirl $zero, $t8, 0
+1:
+ la.global $t8, setjmp
+ jirl $zero, $t8, 0
diff --git a/src/thread/loongarch64/__set_thread_area.s b/src/thread/loongarch64/__set_thread_area.s
new file mode 100644
index 00000000..421cd381
--- /dev/null
+++ b/src/thread/loongarch64/__set_thread_area.s
@@ -0,0 +1,7 @@
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ or $tp, $a0, $zero
+ ori $a0, $zero, 0
+ jirl $zero, $ra, 0
diff --git a/src/thread/loongarch64/__unmapself.s b/src/thread/loongarch64/__unmapself.s
new file mode 100644
index 00000000..b77e6d1d
--- /dev/null
+++ b/src/thread/loongarch64/__unmapself.s
@@ -0,0 +1,7 @@
+.global __unmapself
+.type __unmapself, @function
+__unmapself:
+ li.d $a7, 215
+ syscall 0 # call munmap
+ li.d $a7, 93
+ syscall 0 # call exit
diff --git a/src/thread/loongarch64/clone.s b/src/thread/loongarch64/clone.s
new file mode 100644
index 00000000..ec920c7b
--- /dev/null
+++ b/src/thread/loongarch64/clone.s
@@ -0,0 +1,47 @@
+#__clone(func, stack, flags, arg, ptid, tls, ctid)
+# a0, a1, a2, a3, a4, a5, a6
+# sys_clone3(struct clone_args *cl_args, size_t size)
+# a0 a1
+
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ # Save function pointer and argument pointer on new thread stack
+ addi.d $a1, $a1, -16
+ st.d $a0, $a1, 0 # save function pointer
+ st.d $a3, $a1, 8 # save argument pointer
+
+ li.d $t0, ~0x004000ff # mask CSIGNAL and CLONE_DETACHED
+ and $t1, $a2, $t0 # cl_args.flags
+ li.d $t0, 0x000000ff # CSIGNAL
+ and $t2, $a2, $t0 # cl_args.exit_signal
+
+ bstrins.d $sp, $zero, 2, 0 # align stack to 8 bytes
+ addi.d $sp, $sp, -88 # struct clone_args
+ st.d $t1, $sp, 0 # flags
+ st.d $a4, $sp, 8 # pidfd
+ st.d $a6, $sp, 16 # child_tid
+ st.d $a4, $sp, 24 # parent_tid
+ st.d $t2, $sp, 32 # exit_signal
+ st.d $a1, $sp, 40 # stack
+ st.d $zero, $sp, 48 # stack_size
+ st.d $a5, $sp, 56 # tls
+ st.d $zero, $sp, 64 # set_tid
+ st.d $zero, $sp, 72 # set_tid_size
+ st.d $zero, $sp, 80 # cgroup
+
+ move $a0, $sp
+ li.d $a1, 88
+ li.d $a7, 435 # __NR_clone3
+ syscall 0 # call clone3
+
+ beqz $a0, 1f # whether child process
+ addi.d $sp, $sp, 88
+ jirl $zero, $ra, 0 # parent process return
+1:
+ ld.d $t8, $sp, 0 # function pointer
+ ld.d $a0, $sp, 8 # argument pointer
+ jirl $ra, $t8, 0 # call the user's function
+ li.d $a7, 93
+ syscall 0 # child process exit
diff --git a/src/thread/loongarch64/syscall_cp.s b/src/thread/loongarch64/syscall_cp.s
new file mode 100644
index 00000000..3903ed2c
--- /dev/null
+++ b/src/thread/loongarch64/syscall_cp.s
@@ -0,0 +1,29 @@
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+
+__syscall_cp_asm:
+__cp_begin:
+ ld.w $a0, $a0, 0
+ bnez $a0, __cp_cancel
+ or $t8, $a1, $zero # reserve system call number
+ or $a0, $a2, $zero
+ or $a1, $a3, $zero
+ or $a2, $a4, $zero
+ or $a3, $a5, $zero
+ or $a4, $a6, $zero
+ or $a5, $a7, $zero
+ or $a7, $t8, $zero
+ syscall 0
+__cp_end:
+ jirl $zero, $ra, 0
+__cp_cancel:
+ la.local $t8, __cancel
+ jirl $zero, $t8, 0
--
2.34.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [musl] Re: add loongarch64 port v3
2022-05-05 3:21 [musl] add loongarch64 port v3 王洪亮
@ 2022-05-09 1:34 ` 王洪亮
2022-05-11 13:37 ` Rich Felker
2022-05-16 14:27 ` [musl] " Rich Felker
1 sibling, 1 reply; 13+ messages in thread
From: 王洪亮 @ 2022-05-09 1:34 UTC (permalink / raw)
To: musl
在 2022/5/5 上午11:21, 王洪亮 写道:
> Hi,
>
> I published loongarch64 port v3 in
> https://github.com/loongson/musl/tree/loongarch-v2.0.
>
> fixed two problem:
>
> 1.use __NR_clone3 in __clone().
>
> 2.remove __NR_fstat and __NR_newfstatat.
>
> please code review if there are any other problems ? thanks.
>
>
> Hongliang Wang.
>
Hi,
this port has any other problems need to fix?
Hongliang Wang.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] Re: add loongarch64 port v3
2022-05-09 1:34 ` [musl] " 王洪亮
@ 2022-05-11 13:37 ` Rich Felker
2022-05-11 16:08 ` Arnd Bergmann
0 siblings, 1 reply; 13+ messages in thread
From: Rich Felker @ 2022-05-11 13:37 UTC (permalink / raw)
To: musl
On Mon, May 09, 2022 at 09:34:59AM +0800, 王洪亮 wrote:
>
> 在 2022/5/5 上午11:21, 王洪亮 写道:
> >Hi,
> >
> >I published loongarch64 port v3 in
> >https://github.com/loongson/musl/tree/loongarch-v2.0.
> >
> >fixed two problem:
> >
> >1.use __NR_clone3 in __clone().
> >
> >2.remove __NR_fstat and __NR_newfstatat.
> >
> >please code review if there are any other problems ? thanks.
> >
> >
> >Hongliang Wang.
> >
> Hi,
>
> this port has any other problems need to fix?
I'm at least waiting for confirmation from the kernel side that
everything is okay with syscall usage to move forward. I'll try to
look over the rest again soon to check that there are no remaining
issues.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] Re: add loongarch64 port v3
2022-05-11 13:37 ` Rich Felker
@ 2022-05-11 16:08 ` Arnd Bergmann
0 siblings, 0 replies; 13+ messages in thread
From: Arnd Bergmann @ 2022-05-11 16:08 UTC (permalink / raw)
To: musl
On Wed, May 11, 2022 at 5:57 PM Rich Felker <dalias@libc.org> wrote:
>
> On Mon, May 09, 2022 at 09:34:59AM +0800, 王洪亮 wrote:
> >
> > 在 2022/5/5 上午11:21, 王洪亮 写道:
> > >Hi,
> > >
> > >I published loongarch64 port v3 in
> > >https://github.com/loongson/musl/tree/loongarch-v2.0.
> > >
> > >fixed two problem:
> > >
> > >1.use __NR_clone3 in __clone().
> > >
> > >2.remove __NR_fstat and __NR_newfstatat.
> > >
> > >please code review if there are any other problems ? thanks.
> > >
> > >
> > >Hongliang Wang.
> > >
> > Hi,
> >
> > this port has any other problems need to fix?
>
> I'm at least waiting for confirmation from the kernel side that
> everything is okay with syscall usage to move forward. I'll try to
> look over the rest again soon to check that there are no remaining
> issues.
Since musl is using clone3 internally and no longer exports the
__NR_fstat/newfstatat macros, that part is fine. The clone()
one still isn't correct I think, as the mainline kernel does not yet
support the emulation with a zero-length stack length. Once
we add that part, musl should be fine, but then the __NR_clone
definition is mismatched, as the kernel won't provide that call
to user applications any more.
Arnd
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-05 3:21 [musl] add loongarch64 port v3 王洪亮
2022-05-09 1:34 ` [musl] " 王洪亮
@ 2022-05-16 14:27 ` Rich Felker
2022-05-21 6:38 ` 王洪亮
1 sibling, 1 reply; 13+ messages in thread
From: Rich Felker @ 2022-05-16 14:27 UTC (permalink / raw)
To: 王洪亮; +Cc: musl
On Thu, May 05, 2022 at 11:21:01AM +0800, 王洪亮 wrote:
> Hi,
>
> I published loongarch64 port v3 in
> https://github.com/loongson/musl/tree/loongarch-v2.0.
>
> fixed two problem:
>
> 1.use __NR_clone3 in __clone().
>
> 2.remove __NR_fstat and __NR_newfstatat.
>
> please code review if there are any other problems ? thanks.
>
>
> Hongliang Wang.
OK, review follows:
> diff --git a/arch/loongarch64/bits/signal.h b/arch/loongarch64/bits/signal.h
> new file mode 100644
> index 00000000..e6613516
> --- /dev/null
> +++ b/arch/loongarch64/bits/signal.h
> @@ -0,0 +1,79 @@
> +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
> + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
> +
> +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
> +#define MINSIGSTKSZ 4096
> +#define SIGSTKSZ 16384
> +#endif
> +
> +typedef unsigned long greg_t, gregset_t[32];
> +
> +typedef struct sigcontext {
> + unsigned long pc;
> + gregset_t gregs;
> + unsigned int flags;
> + unsigned long extcontext[0] __attribute__((__aligned__(16)));
> +}mcontext_t;
Again, [0] is not valid C. If the extension field is going to be
declared at all it needs to be declared in a way it can be accessed
without invoking UB, e.g. as a FAM. I'm also not clear on how
specifying the alignment here helps since any object created in a way
that the alignment would affect cannot have the FAM present.
Style nit: missing space between } and mcontext_t.
> diff --git a/arch/loongarch64/bits/stat.h b/arch/loongarch64/bits/stat.h
> new file mode 100644
> index 00000000..b7f4221b
> --- /dev/null
> +++ b/arch/loongarch64/bits/stat.h
> @@ -0,0 +1,18 @@
> +struct stat {
> + dev_t st_dev;
> + ino_t st_ino;
> + mode_t st_mode;
> + nlink_t st_nlink;
> + uid_t st_uid;
> + gid_t st_gid;
> + dev_t st_rdev;
> + unsigned long __pad;
> + off_t st_size;
> + blksize_t st_blksize;
> + int __pad2;
> + blkcnt_t st_blocks;
> + struct timespec st_atim;
> + struct timespec st_mtim;
> + struct timespec st_ctim;
> + unsigned __unused[2];
> +};
Looks like this matches the 'generic' definition now, which is good.
We haven't yet put a generic vesion in arch/generic/bits/stat.h, but
at some point that should happen and if/when it does this file can be
dropped. It's fine for now though.
> diff --git a/arch/loongarch64/kstat.h b/arch/loongarch64/kstat.h
> new file mode 100644
> index 00000000..900f119d
> --- /dev/null
> +++ b/arch/loongarch64/kstat.h
> @@ -0,0 +1,21 @@
> +struct kstat {
> + dev_t st_dev;
> + ino_t st_ino;
> + mode_t st_mode;
> + nlink_t st_nlink;
> + uid_t st_uid;
> + gid_t st_gid;
> + dev_t st_rdev;
> + unsigned long __pad;
> + off_t st_size;
> + blksize_t st_blksize;
> + int __pad2;
> + blkcnt_t st_blocks;
> + long st_atime_sec;
> + unsigned long st_atime_nsec;
> + long st_mtime_sec;
> + unsigned long st_mtime_nsec;
> + long st_ctime_sec;
> + unsigned long st_ctime_nsec;
> + unsigned __unused[2];
> +};
I think this file should be removed, right? -- since there is no
legacy stat sycall with a kstat structure.
> diff --git a/arch/loongarch64/reloc.h b/arch/loongarch64/reloc.h
> new file mode 100644
> index 00000000..249cb40c
> --- /dev/null
> +++ b/arch/loongarch64/reloc.h
> @@ -0,0 +1,35 @@
> +#ifndef __RELOC_H__
> +#define __RELOC_H__
> +
> +#define _GNU_SOURCE
> +#include <endian.h>
You cannot define FTMs in the middle of a header file that might be
included somewhere other than the very top of a source file. But there
does not seem to be any reason it's defined at all.
> diff --git a/src/ldso/loongarch64/dlsym.s b/src/ldso/loongarch64/dlsym.s
> new file mode 100644
> index 00000000..10ac5c7f
> --- /dev/null
> +++ b/src/ldso/loongarch64/dlsym.s
> @@ -0,0 +1,12 @@
> +.global dlsym
> +.hidden __dlsym
> +.type dlsym,@function
> +dlsym:
> + move $a2, $ra
> + la.global $r16, __dlsym
> + addi.d $sp, $sp, -8
> + st.d $ra, $sp, 0
> + jirl $ra, $r16, 0
> + ld.d $ra, $sp, 0
> + addi.d $sp, $sp, 8
> + jirl $r0, $ra, 0
Is there a reason this can't be a tail call? Maybe the ABI requires
that the caller reserve space for the callee to spill arg registers
that are used?
> diff --git a/src/thread/loongarch64/clone.s b/src/thread/loongarch64/clone.s
> new file mode 100644
> index 00000000..ec920c7b
> --- /dev/null
> +++ b/src/thread/loongarch64/clone.s
> @@ -0,0 +1,47 @@
> +#__clone(func, stack, flags, arg, ptid, tls, ctid)
> +# a0, a1, a2, a3, a4, a5, a6
> +# sys_clone3(struct clone_args *cl_args, size_t size)
> +# a0 a1
> +
> +.global __clone
> +.hidden __clone
> +.type __clone,@function
> +__clone:
> + # Save function pointer and argument pointer on new thread stack
> + addi.d $a1, $a1, -16
> + st.d $a0, $a1, 0 # save function pointer
> + st.d $a3, $a1, 8 # save argument pointer
> +
> + li.d $t0, ~0x004000ff # mask CSIGNAL and CLONE_DETACHED
> + and $t1, $a2, $t0 # cl_args.flags
> + li.d $t0, 0x000000ff # CSIGNAL
> + and $t2, $a2, $t0 # cl_args.exit_signal
> +
> + bstrins.d $sp, $zero, 2, 0 # align stack to 8 bytes
> + addi.d $sp, $sp, -88 # struct clone_args
> + st.d $t1, $sp, 0 # flags
> + st.d $a4, $sp, 8 # pidfd
> + st.d $a6, $sp, 16 # child_tid
> + st.d $a4, $sp, 24 # parent_tid
> + st.d $t2, $sp, 32 # exit_signal
> + st.d $a1, $sp, 40 # stack
> + st.d $zero, $sp, 48 # stack_size
> + st.d $a5, $sp, 56 # tls
> + st.d $zero, $sp, 64 # set_tid
> + st.d $zero, $sp, 72 # set_tid_size
> + st.d $zero, $sp, 80 # cgroup
> +
> + move $a0, $sp
> + li.d $a1, 88
> + li.d $a7, 435 # __NR_clone3
> + syscall 0 # call clone3
> +
> + beqz $a0, 1f # whether child process
> + addi.d $sp, $sp, 88
> + jirl $zero, $ra, 0 # parent process return
> +1:
> + ld.d $t8, $sp, 0 # function pointer
> + ld.d $a0, $sp, 8 # argument pointer
> + jirl $ra, $t8, 0 # call the user's function
> + li.d $a7, 93
> + syscall 0 # child process exit
Based on the outcome of the kernel discussiong about __NR_clone3 vs
__NR_clone, this likely needs to be reverted to use __NR_clone again.
I'm waiting to see how that comes out. Sorry for the back and forth
while we try to get this right on the kernel side.
If anyone else wants to take a further look at this, the things I have
not reviewed in detail are the arch-specific asm, particularly atomics
and fenv stuff that require knowledge of how the arch works. As best I
can tell these don't affect ABI and are fixable after merge if
something doesn't work right, so I'm not too concerned about them.
Rich
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-16 14:27 ` [musl] " Rich Felker
@ 2022-05-21 6:38 ` 王洪亮
2022-05-21 8:22 ` Markus Wichmann
0 siblings, 1 reply; 13+ messages in thread
From: 王洪亮 @ 2022-05-21 6:38 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 6420 bytes --]
在 2022/5/16 下午10:27, Rich Felker 写道:
> OK, review follows:
>> diff --git a/arch/loongarch64/bits/signal.h b/arch/loongarch64/bits/signal.h
>> new file mode 100644
>> index 00000000..e6613516
>> --- /dev/null
>> +++ b/arch/loongarch64/bits/signal.h
>> @@ -0,0 +1,79 @@
>> +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
>> + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
>> +
>> +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
>> +#define MINSIGSTKSZ 4096
>> +#define SIGSTKSZ 16384
>> +#endif
>> +
>> +typedef unsigned long greg_t, gregset_t[32];
>> +
>> +typedef struct sigcontext {
>> + unsigned long pc;
>> + gregset_t gregs;
>> + unsigned int flags;
>> + unsigned long extcontext[0] __attribute__((__aligned__(16)));
>> +}mcontext_t;
> Again, [0] is not valid C. If the extension field is going to be
> declared at all it needs to be declared in a way it can be accessed
> without invoking UB, e.g. as a FAM.
[0] is allowed in GNU C, we can not use it in musl ?
I don't understand UB ? e.g. as a FAM ?
> I'm also not clear on how
> specifying the alignment here helps since any object created in a way
> that the alignment would affect cannot have the FAM present.
>
the __aligned__(16) here used to save 128bit vector later.
>
>> diff --git a/arch/loongarch64/kstat.h b/arch/loongarch64/kstat.h
>> new file mode 100644
>> index 00000000..900f119d
>> --- /dev/null
>> +++ b/arch/loongarch64/kstat.h
>> @@ -0,0 +1,21 @@
>> +struct kstat {
>> + dev_t st_dev;
>> + ino_t st_ino;
>> + mode_t st_mode;
>> + nlink_t st_nlink;
>> + uid_t st_uid;
>> + gid_t st_gid;
>> + dev_t st_rdev;
>> + unsigned long __pad;
>> + off_t st_size;
>> + blksize_t st_blksize;
>> + int __pad2;
>> + blkcnt_t st_blocks;
>> + long st_atime_sec;
>> + unsigned long st_atime_nsec;
>> + long st_mtime_sec;
>> + unsigned long st_mtime_nsec;
>> + long st_ctime_sec;
>> + unsigned long st_ctime_nsec;
>> + unsigned __unused[2];
>> +};
> I think this file should be removed, right? -- since there is no
> legacy stat sycall with a kstat structure.
yes, I removed this file.
>> diff --git a/arch/loongarch64/reloc.h b/arch/loongarch64/reloc.h
>> new file mode 100644
>> index 00000000..249cb40c
>> --- /dev/null
>> +++ b/arch/loongarch64/reloc.h
>> @@ -0,0 +1,35 @@
>> +#ifndef __RELOC_H__
>> +#define __RELOC_H__
>> +
>> +#define _GNU_SOURCE
>> +#include <endian.h>
> You cannot define FTMs in the middle of a header file that might be
> included somewhere other than the very top of a source file. But there
> does not seem to be any reason it's defined at all.
I fixed this error:
diff --git a/arch/loongarch64/reloc.h b/arch/loongarch64/reloc.h
index 249cb40c..2f759a34 100644
--- a/arch/loongarch64/reloc.h
+++ b/arch/loongarch64/reloc.h
@@ -1,9 +1,3 @@
-#ifndef __RELOC_H__
-#define __RELOC_H__
-
-#define _GNU_SOURCE
-#include <endian.h>
-
#ifdef __loongarch64_soft_float
#define FP_SUFFIX "-sf"
#else
@@ -31,5 +25,3 @@
" la.local $t1, "#sym" \n" \
" or %0, $t1, $zero \n" \
: "=r"(*(fp)) : : "memory" )
-
-#endif
>> diff --git a/src/ldso/loongarch64/dlsym.s b/src/ldso/loongarch64/dlsym.s
>> new file mode 100644
>> index 00000000..10ac5c7f
>> --- /dev/null
>> +++ b/src/ldso/loongarch64/dlsym.s
>> @@ -0,0 +1,12 @@
>> +.global dlsym
>> +.hidden __dlsym
>> +.type dlsym,@function
>> +dlsym:
>> + move $a2, $ra
>> + la.global $r16, __dlsym
>> + addi.d $sp, $sp, -8
>> + st.d $ra, $sp, 0
>> + jirl $ra, $r16, 0
>> + ld.d $ra, $sp, 0
>> + addi.d $sp, $sp, 8
>> + jirl $r0, $ra, 0
> Is there a reason this can't be a tail call? Maybe the ABI requires
> that the caller reserve space for the callee to spill arg registers
> that are used?
I optimized the code implementation:
diff --git a/src/ldso/loongarch64/dlsym.s b/src/ldso/loongarch64/dlsym.s
index 10ac5c7f..5f51ed85 100644
--- a/src/ldso/loongarch64/dlsym.s
+++ b/src/ldso/loongarch64/dlsym.s
@@ -4,9 +4,4 @@
dlsym:
move $a2, $ra
la.global $r16, __dlsym
- addi.d $sp, $sp, -8
- st.d $ra, $sp, 0
- jirl $ra, $r16, 0
- ld.d $ra, $sp, 0
- addi.d $sp, $sp, 8
- jirl $r0, $ra, 0
+ jirl $r0, $r16, 0
--
>> diff --git a/src/thread/loongarch64/clone.s b/src/thread/loongarch64/clone.s
>> new file mode 100644
>> index 00000000..ec920c7b
>> --- /dev/null
>> +++ b/src/thread/loongarch64/clone.s
>> @@ -0,0 +1,47 @@
>> +#__clone(func, stack, flags, arg, ptid, tls, ctid)
>> +# a0, a1, a2, a3, a4, a5, a6
>> +# sys_clone3(struct clone_args *cl_args, size_t size)
>> +# a0 a1
>> +
>> +.global __clone
>> +.hidden __clone
>> +.type __clone,@function
>> +__clone:
>> + # Save function pointer and argument pointer on new thread stack
>> + addi.d $a1, $a1, -16
>> + st.d $a0, $a1, 0 # save function pointer
>> + st.d $a3, $a1, 8 # save argument pointer
>> +
>> + li.d $t0, ~0x004000ff # mask CSIGNAL and CLONE_DETACHED
>> + and $t1, $a2, $t0 # cl_args.flags
>> + li.d $t0, 0x000000ff # CSIGNAL
>> + and $t2, $a2, $t0 # cl_args.exit_signal
>> +
>> + bstrins.d $sp, $zero, 2, 0 # align stack to 8 bytes
>> + addi.d $sp, $sp, -88 # struct clone_args
>> + st.d $t1, $sp, 0 # flags
>> + st.d $a4, $sp, 8 # pidfd
>> + st.d $a6, $sp, 16 # child_tid
>> + st.d $a4, $sp, 24 # parent_tid
>> + st.d $t2, $sp, 32 # exit_signal
>> + st.d $a1, $sp, 40 # stack
>> + st.d $zero, $sp, 48 # stack_size
>> + st.d $a5, $sp, 56 # tls
>> + st.d $zero, $sp, 64 # set_tid
>> + st.d $zero, $sp, 72 # set_tid_size
>> + st.d $zero, $sp, 80 # cgroup
>> +
>> + move $a0, $sp
>> + li.d $a1, 88
>> + li.d $a7, 435 # __NR_clone3
>> + syscall 0 # call clone3
>> +
>> + beqz $a0, 1f # whether child process
>> + addi.d $sp, $sp, 88
>> + jirl $zero, $ra, 0 # parent process return
>> +1:
>> + ld.d $t8, $sp, 0 # function pointer
>> + ld.d $a0, $sp, 8 # argument pointer
>> + jirl $ra, $t8, 0 # call the user's function
>> + li.d $a7, 93
>> + syscall 0 # child process exit
> Based on the outcome of the kernel discussiong about __NR_clone3 vs
> __NR_clone, this likely needs to be reverted to use __NR_clone again.
> I'm waiting to see how that comes out. Sorry for the back and forth
> while we try to get this right on the kernel side.
OK,No problem.
[-- Attachment #2: Type: text/html, Size: 10915 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-21 6:38 ` 王洪亮
@ 2022-05-21 8:22 ` Markus Wichmann
2022-05-24 9:08 ` 王洪亮
0 siblings, 1 reply; 13+ messages in thread
From: Markus Wichmann @ 2022-05-21 8:22 UTC (permalink / raw)
To: musl
On Sat, May 21, 2022 at 02:38:20PM +0800, 王洪亮 wrote:
>
> 在 2022/5/16 下午10:27, Rich Felker 写道:
> > Again, [0] is not valid C. If the extension field is going to be
> > declared at all it needs to be declared in a way it can be accessed
> > without invoking UB, e.g. as a FAM.
>
> [0] is allowed in GNU C, we can not use it in musl ?
>
> I don't understand UB ? e.g. as a FAM ?
>
musl tries to stay within ISO C as much as possible, and not use GNU C
extensions if it possibly can. In this case, zero-sized arrays do the
same thing as flexible array members, so there is absolutely no reason
to use the extension over the standard way.
UB = undefined behavior
FAM = flexible array member. If the last member of a structure is an
array, it can have indeterminate size. It will then not count towards
the size of the structure (only towards its alignment, possibly), and
can be indexed arbitrarily. This is a C99 feature.
So basically, just nix the 0 in that line.
> > I'm also not clear on how
> > specifying the alignment here helps since any object created in a way
> > that the alignment would affect cannot have the FAM present.
> >
> the __aligned__(16) here used to save 128bit vector later.
But it has no effect, right? The array member is offset an integer
multiple of sixteen bytes from the start of the structure, so it is
already aligned with respect to that, and the declaration adds no
further padding (and if it did, common style in both Linux and musl is
to explicate the padding). And the pointer to the structure comes from
the kernel.
The only thing this alignment directive does is raise the alignment
requirement of the structure up to sixteen, but that only possibly
matters for variables of the structure type, be they automatic or
program life time. But from here it is hard to see why the alignment
should matter in either of those cases, since those would only possibly
be local buffers of the kernel-provided mcontext. And the kernel
provides the mcontext already with all the alignment it needs. I am not
aware of any kernel API that receives a user provided mcontext. And even
if there was one, the kernel would have to copy it into kernel space
before doing anything with it, anyway.
And, BTW, if the alignment really is needed on the mcontext_t itself, it
might be better to put the alignment tag on the type, not one of the
members.
Ciao,
Markus
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-21 8:22 ` Markus Wichmann
@ 2022-05-24 9:08 ` 王洪亮
2022-05-24 12:32 ` Rich Felker
0 siblings, 1 reply; 13+ messages in thread
From: 王洪亮 @ 2022-05-24 9:08 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 2571 bytes --]
在 2022/5/21 下午4:22, Markus Wichmann 写道:
>>> I'm also not clear on how
>>> specifying the alignment here helps since any object created in a way
>>> that the alignment would affect cannot have the FAM present.
>>>
>> the __aligned__(16) here used to save 128bit vector later.
> But it has no effect, right? The array member is offset an integer
> multiple of sixteen bytes from the start of the structure, so it is
> already aligned with respect to that, and the declaration adds no
> further padding (and if it did, common style in both Linux and musl is
> to explicate the padding). And the pointer to the structure comes from
> the kernel.
if no __aligned__(16),the struct sigcontext is 8 bytes align,even if the
extcontext[]
is offset an integer multiple of 16 bytes from the start of struct
sigcontext,it can only
ensure the extcontext[] is 8 bytes align. (just only when sigcontext is
16 bytes align,
extcontext[] can meet 16 bytes align.)
> The only thing this alignment directive does is raise the alignment
> requirement of the structure up to sixteen, but that only possibly
> matters for variables of the structure type, be they automatic or
> program life time. But from here it is hard to see why the alignment
> should matter in either of those cases, since those would only possibly
> be local buffers of the kernel-provided mcontext. And the kernel
> provides the mcontext already with all the alignment it needs. I am not
> aware of any kernel API that receives a user provided mcontext. And even
> if there was one, the kernel would have to copy it into kernel space
> before doing anything with it, anyway.
this not need kernel API, in kernel, if task has pending signal, kernel
save context
to ucontext(in user stack space), then return to userspace to signal
handle, from
the third parameter of signal_handler, user can access the ucontext and
mcontext.
libc and kernel access the same ucontext in user stack space.
void signal_handler (int sig, siginfo_t *info, void *ctx) {
ucontext_t *uc = ctx;
mcontext_t *mc = ctx->uc_mcontext;
}
> And, BTW, if the alignment really is needed on the mcontext_t itself, it
> might be better to put the alignment tag on the type, not one of the
> members.
we need extcontext[] 16 bytes align for 128bit vector access, if put the
alignment on mcontext_t itself,although it can also meet the 16 bytes align
requirements of extcontext[] (the offset is an integer multiple of 16 bytes
from the start of struct sigcontext),the meaning is not clear.
>
> Ciao,
> Markus
[-- Attachment #2: Type: text/html, Size: 4972 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-24 9:08 ` 王洪亮
@ 2022-05-24 12:32 ` Rich Felker
2022-05-25 10:08 ` 王洪亮
0 siblings, 1 reply; 13+ messages in thread
From: Rich Felker @ 2022-05-24 12:32 UTC (permalink / raw)
To: 王洪亮; +Cc: musl
On Tue, May 24, 2022 at 05:08:21PM +0800, 王洪亮 wrote:
>
> 在 2022/5/21 下午4:22, Markus Wichmann 写道:
> >>>I'm also not clear on how
> >>>specifying the alignment here helps since any object created in a way
> >>>that the alignment would affect cannot have the FAM present.
> >>>
> >>the __aligned__(16) here used to save 128bit vector later.
> >But it has no effect, right? The array member is offset an integer
> >multiple of sixteen bytes from the start of the structure, so it is
> >already aligned with respect to that, and the declaration adds no
> >further padding (and if it did, common style in both Linux and musl is
> >to explicate the padding). And the pointer to the structure comes from
> >the kernel.
>
> if no __aligned__(16),the struct sigcontext is 8 bytes align,even if
> the extcontext[]
What we've been trying to say is that there are several cases, none of
which seem to need it:
1. You create an object with declared type struct sigcontext. In this
case, the flexible array member at the end is not present at all
(because that's how C works) which means there's no extended
context which needs additional alignment and probably also means
this is not a usable way of creating sigcontext structs.
2. You malloc storage for the object with space for the flexible array
member. In this case the allocation has alignment max_align_t and
everything is fine.
3. You get the object from the kernel pushing it onto the stack in a
signal frame. This is probably actually the only case the type is
usable in, and of course it has whatever alignment the kernel gave
it.
Rich
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-24 12:32 ` Rich Felker
@ 2022-05-25 10:08 ` 王洪亮
2022-05-25 12:32 ` Rich Felker
0 siblings, 1 reply; 13+ messages in thread
From: 王洪亮 @ 2022-05-25 10:08 UTC (permalink / raw)
To: musl
在 2022/5/24 下午8:32, Rich Felker 写道:
> What we've been trying to say is that there are several cases, none of
> which seem to need it:
>
> 1. You create an object with declared type struct sigcontext. In this
> case, the flexible array member at the end is not present at all
> (because that's how C works) which means there's no extended
> context which needs additional alignment and probably also means
> this is not a usable way of creating sigcontext structs.
>
> 2. You malloc storage for the object with space for the flexible array
> member. In this case the allocation has alignment max_align_t and
> everything is fine.
>
> 3. You get the object from the kernel pushing it onto the stack in a
> signal frame. This is probably actually the only case the type is
> usable in, and of course it has whatever alignment the kernel gave
> it.
Specify the __attribute__((__aligned__(16))) in musl,is used to be
consistent with kernel.if I removed the __attribute__((__aligned__(16))),
there is a libc-test fail in pthread_cancel.exe.the reason is that the
offset of uc->uc_mcontext from the start of uc obtained in cancel_handler
is inconsistent with kernel pushing it onto the stack in a signal frame.
so I understand the __attribute__((__aligned__(16))) is necessary in musl.
src/thread/pthread_cancel.c
static void cancel_handler(int sig, siginfo_t *si, void *ctx)
{
pthread_t self = __pthread_self();
ucontext_t *uc = ctx;
uintptr_t pc = uc->uc_mcontext.MC_PC;
...
}
musl/arch/loongarch64/bits/signal.h:
typedef unsigned long greg_t, gregset_t[32];
typedef struct sigcontext {
unsigned long pc;
gregset_t gregs;
unsigned int flags;
unsigned long extcontext[];
}mcontext_t;
linux/arch/loongarch/include/uapi/asm/sigcontext.h:
struct sigcontext {
__u64 sc_pc;
__u64 sc_regs[32];
__u32 sc_flags;
__u64 sc_extcontext[0] __attribute__((__aligned__(16)));
};
>
> Rich
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-25 10:08 ` 王洪亮
@ 2022-05-25 12:32 ` Rich Felker
2022-05-26 3:07 ` 王洪亮
0 siblings, 1 reply; 13+ messages in thread
From: Rich Felker @ 2022-05-25 12:32 UTC (permalink / raw)
To: 王洪亮; +Cc: musl
On Wed, May 25, 2022 at 06:08:23PM +0800, 王洪亮 wrote:
>
> 在 2022/5/24 下午8:32, Rich Felker 写道:
> >What we've been trying to say is that there are several cases, none of
> >which seem to need it:
> >
> >1. You create an object with declared type struct sigcontext. In this
> > case, the flexible array member at the end is not present at all
> > (because that's how C works) which means there's no extended
> > context which needs additional alignment and probably also means
> > this is not a usable way of creating sigcontext structs.
> >
> >2. You malloc storage for the object with space for the flexible array
> > member. In this case the allocation has alignment max_align_t and
> > everything is fine.
> >
> >3. You get the object from the kernel pushing it onto the stack in a
> > signal frame. This is probably actually the only case the type is
> > usable in, and of course it has whatever alignment the kernel gave
> > it.
> Specify the __attribute__((__aligned__(16))) in musl,is used to be
> consistent with kernel.if I removed the __attribute__((__aligned__(16))),
> there is a libc-test fail in pthread_cancel.exe.the reason is that the
> offset of uc->uc_mcontext from the start of uc obtained in cancel_handler
> is inconsistent with kernel pushing it onto the stack in a signal frame.
> so I understand the __attribute__((__aligned__(16))) is necessary in musl.
>
> src/thread/pthread_cancel.c
>
> static void cancel_handler(int sig, siginfo_t *si, void *ctx)
> {
> pthread_t self = __pthread_self();
> ucontext_t *uc = ctx;
> uintptr_t pc = uc->uc_mcontext.MC_PC;
> ...
> }
>
> musl/arch/loongarch64/bits/signal.h:
>
> typedef unsigned long greg_t, gregset_t[32];
> typedef struct sigcontext {
> unsigned long pc;
> gregset_t gregs;
> unsigned int flags;
> unsigned long extcontext[];
> }mcontext_t;
>
> linux/arch/loongarch/include/uapi/asm/sigcontext.h:
>
> struct sigcontext {
> __u64 sc_pc;
> __u64 sc_regs[32];
> __u32 sc_flags;
> __u64 sc_extcontext[0] __attribute__((__aligned__(16)));
> };
This is because ucontext_t is defined without explicit padding before
uc_mcontext. Add "long __uc_pad;" or similar before it so that the
offset is explicitly what it's supposed to be rather than a
consequence ot overalignment.
Rich
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-25 12:32 ` Rich Felker
@ 2022-05-26 3:07 ` 王洪亮
2022-05-29 6:34 ` Szabolcs Nagy
0 siblings, 1 reply; 13+ messages in thread
From: 王洪亮 @ 2022-05-26 3:07 UTC (permalink / raw)
To: musl
在 2022/5/25 下午8:32, Rich Felker 写道:
> On Wed, May 25, 2022 at 06:08:23PM +0800, 王洪亮 wrote:
>> 在 2022/5/24 下午8:32, Rich Felker 写道:
>>> What we've been trying to say is that there are several cases, none of
>>> which seem to need it:
>>>
>>> 1. You create an object with declared type struct sigcontext. In this
>>> case, the flexible array member at the end is not present at all
>>> (because that's how C works) which means there's no extended
>>> context which needs additional alignment and probably also means
>>> this is not a usable way of creating sigcontext structs.
>>>
>>> 2. You malloc storage for the object with space for the flexible array
>>> member. In this case the allocation has alignment max_align_t and
>>> everything is fine.
I don't understand what is alignment max_align_t? I found the max_align_t
definition in musl,is this it?
TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
I understand if FAM is not specified alignment,FAM is aligned according to
its type size,why is max_align_t?
>>>
>>> 3. You get the object from the kernel pushing it onto the stack in a
>>> signal frame. This is probably actually the only case the type is
>>> usable in, and of course it has whatever alignment the kernel gave
>>> it.
>> Specify the __attribute__((__aligned__(16))) in musl,is used to be
>> consistent with kernel.if I removed the __attribute__((__aligned__(16))),
>> there is a libc-test fail in pthread_cancel.exe.the reason is that the
>> offset of uc->uc_mcontext from the start of uc obtained in cancel_handler
>> is inconsistent with kernel pushing it onto the stack in a signal frame.
>> so I understand the __attribute__((__aligned__(16))) is necessary in musl.
>>
>> src/thread/pthread_cancel.c
>>
>> static void cancel_handler(int sig, siginfo_t *si, void *ctx)
>> {
>> pthread_t self = __pthread_self();
>> ucontext_t *uc = ctx;
>> uintptr_t pc = uc->uc_mcontext.MC_PC;
>> ...
>> }
>>
>> musl/arch/loongarch64/bits/signal.h:
>>
>> typedef unsigned long greg_t, gregset_t[32];
>> typedef struct sigcontext {
>> unsigned long pc;
>> gregset_t gregs;
>> unsigned int flags;
>> unsigned long extcontext[];
>> }mcontext_t;
>>
>> linux/arch/loongarch/include/uapi/asm/sigcontext.h:
>>
>> struct sigcontext {
>> __u64 sc_pc;
>> __u64 sc_regs[32];
>> __u32 sc_flags;
>> __u64 sc_extcontext[0] __attribute__((__aligned__(16)));
>> };
> This is because ucontext_t is defined without explicit padding before
> uc_mcontext. Add "long __uc_pad;" or similar before it so that the
> offset is explicitly what it's supposed to be rather than a
> consequence ot overalignment.
Add "long __uc_pad;" before uc_mcontext can resolve offset error,
why it is better than sc_extcontext[] __attribute__((__aligned__(16)))?
isn't it more direct to be consistent with kernel?
> Rich
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [musl] add loongarch64 port v3
2022-05-26 3:07 ` 王洪亮
@ 2022-05-29 6:34 ` Szabolcs Nagy
0 siblings, 0 replies; 13+ messages in thread
From: Szabolcs Nagy @ 2022-05-29 6:34 UTC (permalink / raw)
To: 王洪亮; +Cc: musl
* 王洪亮 <wanghongliang@loongson.cn> [2022-05-26 11:07:42 +0800]:
> 在 2022/5/25 下午8:32, Rich Felker 写道:
> > On Wed, May 25, 2022 at 06:08:23PM +0800, 王洪亮 wrote:
> > > 在 2022/5/24 下午8:32, Rich Felker 写道:
> > > > What we've been trying to say is that there are several cases, none of
> > > > which seem to need it:
> > > >
> > > > 1. You create an object with declared type struct sigcontext. In this
> > > > case, the flexible array member at the end is not present at all
> > > > (because that's how C works) which means there's no extended
> > > > context which needs additional alignment and probably also means
> > > > this is not a usable way of creating sigcontext structs.
> > > >
> > > > 2. You malloc storage for the object with space for the flexible array
> > > > member. In this case the allocation has alignment max_align_t and
> > > > everything is fine.
> I don't understand what is alignment max_align_t? I found the max_align_t
> definition in musl,is this it?
it is specified in iso c11. malloc aligns at least to this alignment.
>
> TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
>
> I understand if FAM is not specified alignment,FAM is aligned according to
> its type size,why is max_align_t?
> > > >
> > > > 3. You get the object from the kernel pushing it onto the stack in a
> > > > signal frame. This is probably actually the only case the type is
> > > > usable in, and of course it has whatever alignment the kernel gave
> > > > it.
> > > Specify the __attribute__((__aligned__(16))) in musl,is used to be
> > > consistent with kernel.if I removed the __attribute__((__aligned__(16))),
> > > there is a libc-test fail in pthread_cancel.exe.the reason is that the
> > > offset of uc->uc_mcontext from the start of uc obtained in cancel_handler
> > > is inconsistent with kernel pushing it onto the stack in a signal frame.
> > > so I understand the __attribute__((__aligned__(16))) is necessary in musl.
> > >
> > > src/thread/pthread_cancel.c
> > >
> > > static void cancel_handler(int sig, siginfo_t *si, void *ctx)
> > > {
> > > pthread_t self = __pthread_self();
> > > ucontext_t *uc = ctx;
> > > uintptr_t pc = uc->uc_mcontext.MC_PC;
> > > ...
> > > }
> > >
> > > musl/arch/loongarch64/bits/signal.h:
> > >
> > > typedef unsigned long greg_t, gregset_t[32];
> > > typedef struct sigcontext {
> > > unsigned long pc;
> > > gregset_t gregs;
> > > unsigned int flags;
> > > unsigned long extcontext[];
> > > }mcontext_t;
> > >
> > > linux/arch/loongarch/include/uapi/asm/sigcontext.h:
> > >
> > > struct sigcontext {
> > > __u64 sc_pc;
> > > __u64 sc_regs[32];
> > > __u32 sc_flags;
> > > __u64 sc_extcontext[0] __attribute__((__aligned__(16)));
> > > };
> > This is because ucontext_t is defined without explicit padding before
> > uc_mcontext. Add "long __uc_pad;" or similar before it so that the
> > offset is explicitly what it's supposed to be rather than a
> > consequence ot overalignment.
>
> Add "long __uc_pad;" before uc_mcontext can resolve offset error,
> why it is better than sc_extcontext[] __attribute__((__aligned__(16)))?
> isn't it more direct to be consistent with kernel?
the aligned attribute is not standard (iso c11 has _Alignas instead).
the kernel does not care, but libc headers must work with all compilers
and c language parsing tools, so if we can specify a struct with the
same abi that the kernel wants but in a standard conform way, then we
should do it that way.
stating the padding explicitly is useful anyway when the exact layout
of a type matters. it is not just about declaring the type but
documenting the abi.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2022-05-29 6:34 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-05 3:21 [musl] add loongarch64 port v3 王洪亮
2022-05-09 1:34 ` [musl] " 王洪亮
2022-05-11 13:37 ` Rich Felker
2022-05-11 16:08 ` Arnd Bergmann
2022-05-16 14:27 ` [musl] " Rich Felker
2022-05-21 6:38 ` 王洪亮
2022-05-21 8:22 ` Markus Wichmann
2022-05-24 9:08 ` 王洪亮
2022-05-24 12:32 ` Rich Felker
2022-05-25 10:08 ` 王洪亮
2022-05-25 12:32 ` Rich Felker
2022-05-26 3:07 ` 王洪亮
2022-05-29 6:34 ` Szabolcs Nagy
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).