
Use __NR_syscalls as a special syscall number to handle illegal syscall by csel. Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> --- arch/arm64/include/asm/xcall.h | 4 ++-- arch/arm64/kernel/xcall/entry.S | 11 +++++++---- arch/arm64/kernel/xcall/xcall.c | 6 +++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/arch/arm64/include/asm/xcall.h b/arch/arm64/include/asm/xcall.h index 28c2fda9aaa0..dcbc35c6e3c5 100644 --- a/arch/arm64/include/asm/xcall.h +++ b/arch/arm64/include/asm/xcall.h @@ -25,12 +25,12 @@ void xcall_task_free(struct task_struct *p); #ifdef CONFIG_ACTLR_XCALL_XINT struct hw_xcall_info { /* Must be first! */ - void *xcall_entry[__NR_syscalls]; + void *xcall_entry[__NR_syscalls + 1]; bool xcall_scno_enabled; }; #define TASK_HW_XINFO(p) ((struct hw_xcall_info *)p->xinfo) -#define XCALL_ENTRY_SIZE (sizeof(unsigned long) * __NR_syscalls) +#define XCALL_ENTRY_SIZE (sizeof(unsigned long) * (__NR_syscalls + 1)) DECLARE_PER_CPU(void **, __cpu_xcall_entry); extern void xcall_entry(void); diff --git a/arch/arm64/kernel/xcall/entry.S b/arch/arm64/kernel/xcall/entry.S index 4b7dc4d2ff9d..382aa3d0ca07 100644 --- a/arch/arm64/kernel/xcall/entry.S +++ b/arch/arm64/kernel/xcall/entry.S @@ -168,13 +168,16 @@ SYM_CODE_START(xcall_entry) SYM_CODE_END(xcall_entry) .macro check_hw_xcall_pre_kernel_entry + stp x20, x21, [sp, #0] + str x8, [sp, #16] + mov x21, __NR_syscalls /* x8 >= __NR_syscalls */ cmp x8, __NR_syscalls - bhs .Lskip_xcall\@ + csel x20, x8, x21, lt - stp x20, x21, [sp, #0] - ldr_this_cpu x21, __cpu_xcall_entry, x20 - ldr x21, [x21, x8, lsl #3] + ldr_this_cpu x21, __cpu_xcall_entry, x8 + ldr x21, [x21, x20, lsl #3] + ldr x8, [sp, #16] br x21 .Lskip_xcall\@: .endm diff --git a/arch/arm64/kernel/xcall/xcall.c b/arch/arm64/kernel/xcall/xcall.c index 580eb29b9cc0..8339035d5e53 100644 --- a/arch/arm64/kernel/xcall/xcall.c +++ b/arch/arm64/kernel/xcall/xcall.c @@ -26,8 +26,8 @@ static inline int sw_xcall_init_task(struct task_struct *p, struct task_struct * } #ifdef CONFIG_ACTLR_XCALL_XINT -static void *default_syscall_table[__NR_syscalls] = { - [0 ... __NR_syscalls - 1] = no_xcall_entry, +static void *default_syscall_table[__NR_syscalls + 1] = { + [0 ... __NR_syscalls] = no_xcall_entry, }; asmlinkage DEFINE_PER_CPU(void **, __cpu_xcall_entry) = default_syscall_table; @@ -39,7 +39,7 @@ static inline int hw_xcall_init_task(struct task_struct *p, struct task_struct * if (!p->xinfo) return -ENOMEM; - for (i = 0; i < __NR_syscalls; i++) + for (i = 0; i < __NR_syscalls + 1; i++) TASK_HW_XINFO(p)->xcall_entry[i] = no_xcall_entry; if (orig->xinfo) { -- 2.34.1