From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=HTML_MESSAGE, MAILING_LIST_MULTI,NICE_REPLY_A,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 419 invoked from network); 16 Jul 2022 08:13:57 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 16 Jul 2022 08:13:57 -0000 Received: (qmail 5288 invoked by uid 550); 16 Jul 2022 08:13:52 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 5236 invoked from network); 16 Jul 2022 08:13:48 -0000 From: =?UTF-8?B?546L5rSq5Lqu?= To: musl@lists.openwall.com References: <86910db7-be22-b09f-991b-cd8b242325a0@loongson.cn> <8e118171-74fe-a926-bf7d-e1c1aa015121@loongson.cn> <1d975133-bb81-8696-2187-3b37bbdb151c@loongson.cn> <6d1b87b7-25da-8707-791d-40c4d44e90d2@loongson.cn> <20220623015935.GN7074@brightrain.aerifal.cx> <61ffb0ce-85fc-49d9-8599-22c2fa2a6ed5@loongson.cn> Message-ID: <4c80ec80-4621-8fc6-c89c-2106b0b0932f@loongson.cn> Date: Sat, 16 Jul 2022 16:13:31 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <61ffb0ce-85fc-49d9-8599-22c2fa2a6ed5@loongson.cn> Content-Type: multipart/alternative; boundary="------------0CBDE568925E435A3E8BA231" Content-Language: en-US X-CM-TRANSID:AQAAf9Dx39Mrc9Jii1YiAA--.28271S3 X-Coremail-Antispam: 1UD129KBjvAXoWDJry8JrW8uw47tF43ur47XFb_yoWxWryUAo WUGF1UJr15Jr1xCr4DGw17Jr15Ar1UJr1DJr15JrWxJr1UJr1DJ34UJFW8X3yUJry8Gw1U JryUtr1UJFyUAr1Un29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYb7k0a2IF6w4kM7kC6x804xWl14x267AKxVWUJVW8JwAFc2x0 x2IEx4CE42xK8VAvwI8IcIk0rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj4 1l84x0c7CEw4AK67xGY2AK021l84ACjcxK6xIIjxv20xvE14v26r1j6r1xM28EF7xvwVC0 I7IYx2IY6xkF7I0E14v26r1j6r4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4 vEx4A2jsIEc7CjxVAFwI0_Gr1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40E x7xS67k0r7xK12IEb4A2awAqx4xG6I80eVAYj480w7AI6c02F41lYx0E2Ix0cI8IcVAFwI 0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwCjr7xvwVCI w2I0I7xG6c02F41lc2xSY4AK6svPMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrV AFwI0_JrI_JrWlx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUJVWUXwCI 42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwCI42 IY6xAIw20EY4v20xvaj40_WFyUJVCq3wCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E 87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07b50edUUUUU= X-CM-SenderInfo: pzdqwxxrqjzxhdqjqz5rrqw2lrqou0/ Subject: Re: [musl] Re: add loongarch64 port v4 This is a multi-part message in MIME format. --------------0CBDE568925E435A3E8BA231 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit 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 >>> --------------0CBDE568925E435A3E8BA231 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit

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 <wanghongliang@loongson.cn>
Date: Wed, 8 Jun 2022 01:42:12 +0800
Subject: [PATCH] add loongarch64 port v4.

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

--------------0CBDE568925E435A3E8BA231--