From: guoren@kernel•org
To: guoren@kernel•org, palmer@dabbelt•com, arnd@arndb•de,
anup@brainfault•org, gregkh@linuxfoundation•org,
liush@allwinnertech•com, wefu@redhat•com, drew@beagleboard•org,
wangjunqiang@iscas•ac.cn, hch@lst•de, hch@infradead•org
Cc: linux-kernel@vger•kernel.org, linux-riscv@lists•infradead.org,
linux-csky@vger•kernel.org, linux-s390@vger•kernel.org,
sparclinux@vger•kernel.org, linuxppc-dev@lists•ozlabs.org,
inux-parisc@vger•kernel.org, linux-mips@vger•kernel.org,
linux-arm-kernel@lists•infradead.org, x86@kernel•org,
Guo Ren <guoren@linux•alibaba.com>
Subject: [PATCH V3 09/17] riscv: compat: syscall: Add entry.S implementation
Date: Thu, 20 Jan 2022 15:39:02 +0800 [thread overview]
Message-ID: <20220120073911.99857-10-guoren@kernel.org> (raw)
From: Guo Ren <guoren@linux•alibaba.com>
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>
Cc: Arnd Bergmann <arnd@arndb•de>
---
arch/riscv/include/asm/csr.h | 7 +++++++
arch/riscv/kernel/entry.S | 18 ++++++++++++++++--
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
index 5046f431645c..7dac12366833 100644
--- a/arch/riscv/include/asm/csr.h
+++ b/arch/riscv/include/asm/csr.h
@@ -36,6 +36,13 @@
#define SR_SD _AC(0x8000000000000000, UL) /* FS/XS dirty */
#endif
+#ifdef CONFIG_COMPAT
+#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)
diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S
index ed29e9c8f660..1951743f09b3 100644
--- a/arch/riscv/kernel/entry.S
+++ b/arch/riscv/kernel/entry.S
@@ -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:
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists•infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
reply other threads:[~2022-01-20 7:49 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220120073911.99857-10-guoren@kernel.org \
--to=guoren@kernel$(echo .)org \
--cc=anup@brainfault$(echo .)org \
--cc=arnd@arndb$(echo .)de \
--cc=drew@beagleboard$(echo .)org \
--cc=gregkh@linuxfoundation$(echo .)org \
--cc=guoren@linux$(echo .)alibaba.com \
--cc=hch@infradead$(echo .)org \
--cc=hch@lst$(echo .)de \
--cc=inux-parisc@vger$(echo .)kernel.org \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-csky@vger$(echo .)kernel.org \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-mips@vger$(echo .)kernel.org \
--cc=linux-riscv@lists$(echo .)infradead.org \
--cc=linux-s390@vger$(echo .)kernel.org \
--cc=linuxppc-dev@lists$(echo .)ozlabs.org \
--cc=liush@allwinnertech$(echo .)com \
--cc=palmer@dabbelt$(echo .)com \
--cc=sparclinux@vger$(echo .)kernel.org \
--cc=wangjunqiang@iscas$(echo .)ac.cn \
--cc=wefu@redhat$(echo .)com \
--cc=x86@kernel$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox