Hi, Rich I'm Looking forward to your reply,thank you. 在 2022/7/5 下午8:56, 王洪亮 写道: > Hi, Rich > > Have you reviewed it? > This patch has some new problems? > > 在 2022/6/23 上午9:59, Rich Felker 写道: >> Hi. I just haven't gotten to reviewing it again. I'll try to take a >> good look in the next day or two. >> >> On Thu, Jun 23, 2022 at 09:30:55AM +0800, 王洪亮 wrote: >>> Hi,  Rich >>> >>>   this patch has any other problems need to be modified? >>> >>> Looking forward to your reply. thanks. >>> >>> >>> Hongliang Wang >>> >>> 在 2022/6/20 下午5:49, 王洪亮 写道: >>>> Hi, Rich >>>> >>>> 1. this patch has any other problems need to be modified? >>>> >>>> 2.what are the suggestions for support LA32 later? >>>> >>>> >>>> 在 2022/6/14 下午3:23, 王洪亮 写道: >>>>> Hi, >>>>> >>>>> 1. this patch has any other problems need to be modified? >>>>> >>>>> 2.what are the suggestions for support LA32? >>>>> >>>>> >>>>> 在 2022/6/8 上午11:56, 王洪亮 写道: >>>>>> Hi, >>>>>> >>>>>> I published loongarch64 port v4 in >>>>>> https://github.com/loongson/musl/tree/loongarch-v2.0. >>>>>> >>>>>> fixed the following problems: >>>>>> >>>>>> 1.fixed  the extension field of struct mcontext >>>>>> >>>>>> 2.removed arch/loongarch64/kstat.h >>>>>> >>>>>> 3.deleted the incorrect definition in arch/loongarch64/reloc.h >>>>>> >>>>>> 4.optimize  dlsym >>>>>> >>>>>> please code review if there are any other problems ? thanks. >>>>>> >>>>>> I have one questions: >>>>>> >>>>>> Through  add "long__uc_pad" in struct ucontext_t  to meet the >>>>>> extcontext[] 16 bytes alignment, >>>>>> >>>>>> if run in loongarch32, this method not meet the  16 bytes >>>>>> alignment requirement. how to do it ? >>>>>> >>>>>> >>>>>> Hongliang Wang. >>>>>> >>> >From 5535c500f137c3cb9ad36c7c96e7aaca440c85bd Mon Sep 17 00:00:00 2001 >>> From: wanghongliang >>> Date: Wed, 8 Jun 2022 01:42:12 +0800 >>> Subject: [PATCH] add loongarch64 port v4. >>> >>> Author: xiaojuanZhai >>> Author: meidanLi >>> Author: guoqiChen >>> Author: xiaolinZhao >>> Author: Fanpeng >>> Author: jiantaoShan >>> Author: xuhuiQiang >>> Author: jingyunHua >>> Author: liuxue >>> Author: wanghongliang >> >>> Signed-off-by: wanghongliang >>> --- >>>   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             |  80 ++++++ >>>   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/pthread_arch.h            |  13 + >>>   arch/loongarch64/reloc.h                   |  27 ++ >>>   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               |   7 + >>>   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 ++ >>>   32 files changed, 1184 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/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..4db790e7 >>> --- /dev/null >>> +++ b/arch/loongarch64/bits/signal.h >>> @@ -0,0 +1,80 @@ >>> +#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[]; >>> +} 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; >>> +    long __uc_pad; >>> +    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/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..2f759a34 >>> --- /dev/null >>> +++ b/arch/loongarch64/reloc.h >>> @@ -0,0 +1,27 @@ >>> +#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" ) >>> 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..5f51ed85 >>> --- /dev/null >>> +++ b/src/ldso/loongarch64/dlsym.s >>> @@ -0,0 +1,7 @@ >>> +.global dlsym >>> +.hidden __dlsym >>> +.type   dlsym,@function >>> +dlsym: >>> +    move    $a2, $ra >>> +    la.global    $r16, __dlsym >>> +    jirl    $r0, $r16, 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 >>>