riscv: compat: syscall: Add entry.S implementation
authorGuo Ren <guoren@linux.alibaba.com>
Tue, 5 Apr 2022 07:13:06 +0000 (15:13 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Tue, 26 Apr 2022 20:36:31 +0000 (13:36 -0700)
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: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20220405071314.3225832-13-guoren@kernel.org
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/include/asm/csr.h
arch/riscv/kernel/entry.S

index e935f27b10fdbe603a05a497c7cc926561cefc63..f5d1251fd6c71d2a91d49d563429e23586506dec 100644 (file)
 #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)
index c8b9ce274b9ab8783fa3c6b8447b62ef4d3cf2af..2e5b88ca11ce1728bc4b49f304901ab4d05157e4 100644 (file)
@@ -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: