Skip to content

Commit 14338e6

Browse files
committed
LoongArch: Adjust system call for 32BIT/64BIT
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>
1 parent 3f63ac8 commit 14338e6

6 files changed

Lines changed: 33 additions & 11 deletions

File tree

arch/loongarch/include/asm/Kbuild

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
2+
syscall-y += syscall_table_32.h
23
syscall-y += syscall_table_64.h
34
generated-y += orc_hash.h
45

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
# SPDX-License-Identifier: GPL-2.0
2+
syscall-y += unistd_32.h
23
syscall-y += unistd_64.h
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
22

3+
#include <asm/bitsperlong.h>
4+
5+
#if __BITS_PER_LONG == 32
6+
#include <asm/unistd_32.h>
7+
#else
38
#include <asm/unistd_64.h>
9+
#endif
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
22

33
# No special ABIs on loongarch so far
4+
syscall_abis_32 +=
45
syscall_abis_64 +=

arch/loongarch/kernel/entry.S

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,24 @@ SYM_CODE_START(handle_syscall)
2323
UNWIND_HINT_UNDEFINED
2424
csrrd t0, PERCPU_BASE_KS
2525
la.pcrel t1, kernelsp
26-
add.d t1, t1, t0
26+
PTR_ADD t1, t1, t0
2727
move t2, sp
28-
ld.d sp, t1, 0
28+
PTR_L sp, t1, 0
2929

30-
addi.d sp, sp, -PT_SIZE
30+
PTR_ADDI sp, sp, -PT_SIZE
3131
cfi_st t2, PT_R3
3232
cfi_rel_offset sp, PT_R3
33-
st.d zero, sp, PT_R0
33+
LONG_S zero, sp, PT_R0
3434
csrrd t2, LOONGARCH_CSR_PRMD
35-
st.d t2, sp, PT_PRMD
35+
LONG_S t2, sp, PT_PRMD
3636
csrrd t2, LOONGARCH_CSR_CRMD
37-
st.d t2, sp, PT_CRMD
37+
LONG_S t2, sp, PT_CRMD
3838
csrrd t2, LOONGARCH_CSR_EUEN
39-
st.d t2, sp, PT_EUEN
39+
LONG_S t2, sp, PT_EUEN
4040
csrrd t2, LOONGARCH_CSR_ECFG
41-
st.d t2, sp, PT_ECFG
41+
LONG_S t2, sp, PT_ECFG
4242
csrrd t2, LOONGARCH_CSR_ESTAT
43-
st.d t2, sp, PT_ESTAT
43+
LONG_S t2, sp, PT_ESTAT
4444
cfi_st ra, PT_R1
4545
cfi_st a0, PT_R4
4646
cfi_st a1, PT_R5
@@ -51,7 +51,7 @@ SYM_CODE_START(handle_syscall)
5151
cfi_st a6, PT_R10
5252
cfi_st a7, PT_R11
5353
csrrd ra, LOONGARCH_CSR_ERA
54-
st.d ra, sp, PT_ERA
54+
LONG_S ra, sp, PT_ERA
5555
cfi_rel_offset ra, PT_ERA
5656

5757
cfi_st tp, PT_R2
@@ -67,7 +67,7 @@ SYM_CODE_START(handle_syscall)
6767
#endif
6868

6969
move u0, t0
70-
li.d tp, ~_THREAD_MASK
70+
LONG_LI tp, ~_THREAD_MASK
7171
and tp, tp, sp
7272

7373
move a0, sp

arch/loongarch/kernel/syscall.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,22 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long,
3434
return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
3535
}
3636

37+
SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, unsigned long,
38+
prot, unsigned long, flags, unsigned long, fd, unsigned long, offset)
39+
{
40+
if (offset & (~PAGE_MASK >> 12))
41+
return -EINVAL;
42+
43+
return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> (PAGE_SHIFT - 12));
44+
}
45+
3746
void *sys_call_table[__NR_syscalls] = {
3847
[0 ... __NR_syscalls - 1] = sys_ni_syscall,
48+
#ifdef CONFIG_32BIT
49+
#include <asm/syscall_table_32.h>
50+
#else
3951
#include <asm/syscall_table_64.h>
52+
#endif
4053
};
4154

4255
typedef long (*sys_call_fn)(unsigned long, unsigned long,

0 commit comments

Comments
 (0)