Unverified Commit dfb0bfa7 authored by Guo Ren's avatar Guo Ren Committed by Palmer Dabbelt
Browse files

riscv: compat: syscall: Add entry.S implementation



Implement the entry of compat_sys_call_table[] in asm. Ref to
riscv-privileged spec 4.1.1 Supervisor Status Register (sstatus):

 BIT[32:33] = UXL[1:0]:
 - 1:32
 - 2:64
 - 3:128

Signed-off-by: default avatarGuo Ren <guoren@linux.alibaba.com>
Signed-off-by: default avatarGuo Ren <guoren@kernel.org>
Reviewed-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20220405071314.3225832-13-guoren@kernel.org


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 59c10c52
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -36,6 +36,13 @@
#define SR_SD		_AC(0x8000000000000000, UL) /* FS/XS dirty */
#endif

#ifdef CONFIG_64BIT
#define SR_UXL		_AC(0x300000000, UL) /* XLEN mask for U-mode */
#define SR_UXL_32	_AC(0x100000000, UL) /* XLEN = 32 for U-mode */
#define SR_UXL_64	_AC(0x200000000, UL) /* XLEN = 64 for U-mode */
#define SR_UXL_SHIFT	32
#endif

/* SATP flags */
#ifndef CONFIG_64BIT
#define SATP_PPN	_AC(0x003FFFFF, UL)
+16 −2
Original line number Diff line number Diff line
@@ -207,13 +207,27 @@ check_syscall_nr:
	 * Syscall number held in a7.
	 * If syscall number is above allowed value, redirect to ni_syscall.
	 */
	bgeu a7, t0, 1f
	bgeu a7, t0, 3f
#ifdef CONFIG_COMPAT
	REG_L s0, PT_STATUS(sp)
	srli s0, s0, SR_UXL_SHIFT
	andi s0, s0, (SR_UXL >> SR_UXL_SHIFT)
	li t0, (SR_UXL_32 >> SR_UXL_SHIFT)
	sub t0, s0, t0
	bnez t0, 1f

	/* Call compat_syscall */
	la s0, compat_sys_call_table
	j 2f
1:
#endif
	/* Call syscall */
	la s0, sys_call_table
2:
	slli t0, a7, RISCV_LGPTR
	add s0, s0, t0
	REG_L s0, 0(s0)
1:
3:
	jalr s0

ret_from_syscall: