]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
LoongArch: Adjust system call for 32BIT/64BIT
authorHuacai Chen <chenhuacai@loongson.cn>
Mon, 8 Dec 2025 10:09:17 +0000 (18:09 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Mon, 8 Dec 2025 10:09:17 +0000 (18:09 +0800)
Adjust system call for both 32BIT and 64BIT, including: add the uapi
unistd_{32,64}.h and syscall_table_{32,64}.h inclusion, add sys_mmap2()
definition, change the system call entry routines, etc.

Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/Kbuild
arch/loongarch/include/uapi/asm/Kbuild
arch/loongarch/include/uapi/asm/unistd.h
arch/loongarch/kernel/Makefile.syscalls
arch/loongarch/kernel/entry.S
arch/loongarch/kernel/syscall.c

index b04d2cef935f6df69aaa467da3a8ba1e6ffe2446..9034b583a88a692874b85ebc4a90f40909ec7f57 100644 (file)
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
+syscall-y += syscall_table_32.h
 syscall-y += syscall_table_64.h
 generated-y += orc_hash.h
 
index 517761419999a898ab3d73b2568eea160795faec..89ac01faa5aef5f35837b8c4acc583082c30db53 100644 (file)
@@ -1,2 +1,3 @@
 # SPDX-License-Identifier: GPL-2.0
+syscall-y += unistd_32.h
 syscall-y += unistd_64.h
index 1f01980f9c94826957c9729c09c550cd090e4850..e19c7f2f9f87a49a49a6425506508f5c0efc3315 100644 (file)
@@ -1,3 +1,9 @@
 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 
+#include <asm/bitsperlong.h>
+
+#if __BITS_PER_LONG == 32
+#include <asm/unistd_32.h>
+#else
 #include <asm/unistd_64.h>
+#endif
index ab7d9baa29152da97932c7e447a183fba265451c..cd46c2b69c7fde9cda7d0d11174d70570ef00a52 100644 (file)
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 
 # No special ABIs on loongarch so far
+syscall_abis_32 +=
 syscall_abis_64 +=
index 47e1db9a1ce47b7835c3acfc9e253d806d349da4..b53d333a7c4270983579e2db095563fc8d316d12 100644 (file)
@@ -23,24 +23,24 @@ SYM_CODE_START(handle_syscall)
        UNWIND_HINT_UNDEFINED
        csrrd           t0, PERCPU_BASE_KS
        la.pcrel        t1, kernelsp
-       add.d           t1, t1, t0
+       PTR_ADD         t1, t1, t0
        move            t2, sp
-       ld.d            sp, t1, 0
+       PTR_L           sp, t1, 0
 
-       addi.d          sp, sp, -PT_SIZE
+       PTR_ADDI        sp, sp, -PT_SIZE
        cfi_st          t2, PT_R3
        cfi_rel_offset  sp, PT_R3
-       st.d            zero, sp, PT_R0
+       LONG_S          zero, sp, PT_R0
        csrrd           t2, LOONGARCH_CSR_PRMD
-       st.d            t2, sp, PT_PRMD
+       LONG_S          t2, sp, PT_PRMD
        csrrd           t2, LOONGARCH_CSR_CRMD
-       st.d            t2, sp, PT_CRMD
+       LONG_S          t2, sp, PT_CRMD
        csrrd           t2, LOONGARCH_CSR_EUEN
-       st.d            t2, sp, PT_EUEN
+       LONG_S          t2, sp, PT_EUEN
        csrrd           t2, LOONGARCH_CSR_ECFG
-       st.d            t2, sp, PT_ECFG
+       LONG_S          t2, sp, PT_ECFG
        csrrd           t2, LOONGARCH_CSR_ESTAT
-       st.d            t2, sp, PT_ESTAT
+       LONG_S          t2, sp, PT_ESTAT
        cfi_st          ra, PT_R1
        cfi_st          a0, PT_R4
        cfi_st          a1, PT_R5
@@ -51,7 +51,7 @@ SYM_CODE_START(handle_syscall)
        cfi_st          a6, PT_R10
        cfi_st          a7, PT_R11
        csrrd           ra, LOONGARCH_CSR_ERA
-       st.d            ra, sp, PT_ERA
+       LONG_S          ra, sp, PT_ERA
        cfi_rel_offset  ra, PT_ERA
 
        cfi_st          tp, PT_R2
@@ -67,7 +67,7 @@ SYM_CODE_START(handle_syscall)
 #endif
 
        move            u0, t0
-       li.d            tp, ~_THREAD_MASK
+       LONG_LI         tp, ~_THREAD_MASK
        and             tp, tp, sp
 
        move            a0, sp
index ab94eb5ce039137ee7d13675412bf5a33f481e2b..1249d82c1cd0ac60e7832240ef5059ff45a06c7b 100644 (file)
@@ -34,9 +34,22 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long,
        return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
 }
 
+SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, unsigned long,
+                prot, unsigned long, flags, unsigned long, fd, unsigned long, offset)
+{
+       if (offset & (~PAGE_MASK >> 12))
+               return -EINVAL;
+
+       return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> (PAGE_SHIFT - 12));
+}
+
 void *sys_call_table[__NR_syscalls] = {
        [0 ... __NR_syscalls - 1] = sys_ni_syscall,
+#ifdef CONFIG_32BIT
+#include <asm/syscall_table_32.h>
+#else
 #include <asm/syscall_table_64.h>
+#endif
 };
 
 typedef long (*sys_call_fn)(unsigned long, unsigned long,