From: Mark Rutland <mark.rutland@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, catalin.marinas@arm.com, dave.martin@arm.com, james.morse@arm.com, linux@dominikbrodowski.net, linux-fsdevel@vger.kernel.org, marc.zyngier@arm.com, mark.rutland@arm.com, viro@zeniv.linux.org.uk, will.deacon@arm.com Subject: [PATCH 10/18] arm64: convert native/compat syscall entry to C Date: Mon, 14 May 2018 10:46:32 +0100 [thread overview] Message-ID: <20180514094640.27569-11-mark.rutland@arm.com> (raw) In-Reply-To: <20180514094640.27569-1-mark.rutland@arm.com> Now that the syscall invocation logic is in C, we can migrate the rest of the syscall entry logic over, so that the entry assembly needn't look at the register values at all. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> --- arch/arm64/kernel/entry.S | 42 ++++-------------------------------------- arch/arm64/kernel/syscall.c | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 5c60369b52fc..13afefbf608f 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -690,14 +690,9 @@ el0_sync_compat: b.ge el0_dbg b el0_inv el0_svc_compat: - /* - * AArch32 syscall handling - */ - ldr x16, [tsk, #TSK_TI_FLAGS] // load thread flags - adrp stbl, compat_sys_call_table // load compat syscall table pointer - mov wscno, w7 // syscall number in w7 (r7) - mov wsc_nr, #__NR_compat_syscalls - b el0_svc_naked + mov x0, sp + bl el0_svc_compat_handler + b ret_to_user .align 6 el0_irq_compat: @@ -895,37 +890,8 @@ ENDPROC(ret_to_user) */ .align 6 el0_svc: - ldr x16, [tsk, #TSK_TI_FLAGS] // load thread flags - adrp stbl, sys_call_table // load syscall table pointer - mov wscno, w8 // syscall number in w8 - mov wsc_nr, #__NR_syscalls - -#ifdef CONFIG_ARM64_SVE -alternative_if_not ARM64_SVE - b el0_svc_naked -alternative_else_nop_endif - tbz x16, #TIF_SVE, el0_svc_naked // Skip unless TIF_SVE set: - bic x16, x16, #_TIF_SVE // discard SVE state - str x16, [tsk, #TSK_TI_FLAGS] - - /* - * task_fpsimd_load() won't be called to update CPACR_EL1 in - * ret_to_user unless TIF_FOREIGN_FPSTATE is still set, which only - * happens if a context switch or kernel_neon_begin() or context - * modification (sigreturn, ptrace) intervenes. - * So, ensure that CPACR_EL1 is already correct for the fast-path case: - */ - mrs x9, cpacr_el1 - bic x9, x9, #CPACR_EL1_ZEN_EL0EN // disable SVE for el0 - msr cpacr_el1, x9 // synchronised by eret to el0 -#endif - -el0_svc_naked: // compat entry point mov x0, sp - mov w1, wscno - mov w2, wsc_nr - mov x3, stbl - bl el0_svc_common + bl el0_svc_handler b ret_to_user ENDPROC(el0_svc) diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 5df857e32b48..4706f841e758 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -6,7 +6,9 @@ #include <linux/ptrace.h> #include <asm/daifflags.h> +#include <asm/fpsimd.h> #include <asm/thread_info.h> +#include <asm/unistd.h> long do_ni_syscall(struct pt_regs *regs); @@ -41,8 +43,8 @@ static inline bool has_syscall_work(unsigned long flags) int syscall_trace_enter(struct pt_regs *regs); void syscall_trace_exit(struct pt_regs *regs); -asmlinkage void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, - syscall_fn_t syscall_table[]) +static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, + syscall_fn_t syscall_table[]) { unsigned long flags = current_thread_info()->flags; @@ -79,3 +81,37 @@ asmlinkage void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, trace_exit: syscall_trace_exit(regs); } + +static inline void sve_user_reset(void) +{ + if (!system_supports_sve()) + return; + + /* + * task_fpsimd_load() won't be called to update CPACR_EL1 in + * ret_to_user unless TIF_FOREIGN_FPSTATE is still set, which only + * happens if a context switch or kernel_neon_begin() or context + * modification (sigreturn, ptrace) intervenes. + * So, ensure that CPACR_EL1 is already correct for the fast-path case. + */ + if (test_and_clear_thread_flag(TIF_SVE)) + sve_user_disable(); +} + +extern syscall_fn_t sys_call_table[]; + +asmlinkage void el0_svc_handler(struct pt_regs *regs) +{ + sve_user_disable(); + el0_svc_common(regs, regs->regs[8], __NR_syscalls, sys_call_table); +} + +#ifdef CONFIG_COMPAT +extern syscall_fn_t compat_sys_call_table[]; + +asmlinkage void el0_svc_compat_handler(struct pt_regs *regs) +{ + el0_svc_common(regs, regs->regs[7], __NR_compat_syscalls, + compat_sys_call_table); +} +#endif -- 2.11.0
WARNING: multiple messages have this Message-ID (diff)
From: mark.rutland@arm.com (Mark Rutland) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 10/18] arm64: convert native/compat syscall entry to C Date: Mon, 14 May 2018 10:46:32 +0100 [thread overview] Message-ID: <20180514094640.27569-11-mark.rutland@arm.com> (raw) In-Reply-To: <20180514094640.27569-1-mark.rutland@arm.com> Now that the syscall invocation logic is in C, we can migrate the rest of the syscall entry logic over, so that the entry assembly needn't look at the register values at all. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> --- arch/arm64/kernel/entry.S | 42 ++++-------------------------------------- arch/arm64/kernel/syscall.c | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 5c60369b52fc..13afefbf608f 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -690,14 +690,9 @@ el0_sync_compat: b.ge el0_dbg b el0_inv el0_svc_compat: - /* - * AArch32 syscall handling - */ - ldr x16, [tsk, #TSK_TI_FLAGS] // load thread flags - adrp stbl, compat_sys_call_table // load compat syscall table pointer - mov wscno, w7 // syscall number in w7 (r7) - mov wsc_nr, #__NR_compat_syscalls - b el0_svc_naked + mov x0, sp + bl el0_svc_compat_handler + b ret_to_user .align 6 el0_irq_compat: @@ -895,37 +890,8 @@ ENDPROC(ret_to_user) */ .align 6 el0_svc: - ldr x16, [tsk, #TSK_TI_FLAGS] // load thread flags - adrp stbl, sys_call_table // load syscall table pointer - mov wscno, w8 // syscall number in w8 - mov wsc_nr, #__NR_syscalls - -#ifdef CONFIG_ARM64_SVE -alternative_if_not ARM64_SVE - b el0_svc_naked -alternative_else_nop_endif - tbz x16, #TIF_SVE, el0_svc_naked // Skip unless TIF_SVE set: - bic x16, x16, #_TIF_SVE // discard SVE state - str x16, [tsk, #TSK_TI_FLAGS] - - /* - * task_fpsimd_load() won't be called to update CPACR_EL1 in - * ret_to_user unless TIF_FOREIGN_FPSTATE is still set, which only - * happens if a context switch or kernel_neon_begin() or context - * modification (sigreturn, ptrace) intervenes. - * So, ensure that CPACR_EL1 is already correct for the fast-path case: - */ - mrs x9, cpacr_el1 - bic x9, x9, #CPACR_EL1_ZEN_EL0EN // disable SVE for el0 - msr cpacr_el1, x9 // synchronised by eret to el0 -#endif - -el0_svc_naked: // compat entry point mov x0, sp - mov w1, wscno - mov w2, wsc_nr - mov x3, stbl - bl el0_svc_common + bl el0_svc_handler b ret_to_user ENDPROC(el0_svc) diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 5df857e32b48..4706f841e758 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -6,7 +6,9 @@ #include <linux/ptrace.h> #include <asm/daifflags.h> +#include <asm/fpsimd.h> #include <asm/thread_info.h> +#include <asm/unistd.h> long do_ni_syscall(struct pt_regs *regs); @@ -41,8 +43,8 @@ static inline bool has_syscall_work(unsigned long flags) int syscall_trace_enter(struct pt_regs *regs); void syscall_trace_exit(struct pt_regs *regs); -asmlinkage void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, - syscall_fn_t syscall_table[]) +static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, + syscall_fn_t syscall_table[]) { unsigned long flags = current_thread_info()->flags; @@ -79,3 +81,37 @@ asmlinkage void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, trace_exit: syscall_trace_exit(regs); } + +static inline void sve_user_reset(void) +{ + if (!system_supports_sve()) + return; + + /* + * task_fpsimd_load() won't be called to update CPACR_EL1 in + * ret_to_user unless TIF_FOREIGN_FPSTATE is still set, which only + * happens if a context switch or kernel_neon_begin() or context + * modification (sigreturn, ptrace) intervenes. + * So, ensure that CPACR_EL1 is already correct for the fast-path case. + */ + if (test_and_clear_thread_flag(TIF_SVE)) + sve_user_disable(); +} + +extern syscall_fn_t sys_call_table[]; + +asmlinkage void el0_svc_handler(struct pt_regs *regs) +{ + sve_user_disable(); + el0_svc_common(regs, regs->regs[8], __NR_syscalls, sys_call_table); +} + +#ifdef CONFIG_COMPAT +extern syscall_fn_t compat_sys_call_table[]; + +asmlinkage void el0_svc_compat_handler(struct pt_regs *regs) +{ + el0_svc_common(regs, regs->regs[7], __NR_compat_syscalls, + compat_sys_call_table); +} +#endif -- 2.11.0
next prev parent reply other threads:[~2018-05-14 9:47 UTC|newest] Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-14 9:46 [PATCH 00/18] arm64: invoke syscalls with pt_regs Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 01/18] arm64: consistently use unsigned long for thread flags Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 9:57 ` Dave Martin 2018-05-14 9:57 ` Dave Martin 2018-05-14 9:46 ` [PATCH 02/18] arm64: move SCTLR_EL{1,2} assertions to <asm/sysreg.h> Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 10:00 ` Dave Martin 2018-05-14 10:00 ` Dave Martin 2018-05-14 10:08 ` Mark Rutland 2018-05-14 10:08 ` Mark Rutland 2018-05-14 11:20 ` Dave Martin 2018-05-14 11:20 ` Dave Martin 2018-05-14 11:56 ` Robin Murphy 2018-05-14 11:56 ` Robin Murphy 2018-05-14 12:06 ` Mark Rutland 2018-05-14 12:06 ` Mark Rutland 2018-05-14 12:41 ` Dave Martin 2018-05-14 12:41 ` Dave Martin 2018-05-14 13:10 ` Mark Rutland 2018-05-14 13:10 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 03/18] arm64: introduce sysreg_clear_set() Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 10:04 ` Dave Martin 2018-05-14 10:04 ` Dave Martin 2018-05-14 9:46 ` [PATCH 04/18] arm64: kill config_sctlr_el1() Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 10:05 ` Dave Martin 2018-05-14 10:05 ` Dave Martin 2018-05-14 9:46 ` [PATCH 05/18] arm64: kill change_cpacr() Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 10:06 ` Dave Martin 2018-05-14 10:06 ` Dave Martin 2018-05-14 9:46 ` [PATCH 06/18] arm64: move sve_user_{enable,disable} to <asm/fpsimd.h> Mark Rutland 2018-05-14 9:46 ` [PATCH 06/18] arm64: move sve_user_{enable, disable} " Mark Rutland 2018-05-14 11:06 ` Dave Martin 2018-05-14 11:06 ` Dave Martin 2018-05-15 10:39 ` Mark Rutland 2018-05-15 10:39 ` Mark Rutland 2018-05-15 12:19 ` Dave Martin 2018-05-15 12:19 ` Dave Martin 2018-05-15 16:33 ` Mark Rutland 2018-05-15 16:33 ` Mark Rutland 2018-05-16 9:01 ` Dave Martin 2018-05-16 9:01 ` Dave Martin 2018-06-01 10:29 ` Mark Rutland 2018-06-01 10:29 ` Mark Rutland 2018-06-01 10:42 ` Dave Martin 2018-06-01 10:42 ` Dave Martin 2018-05-14 9:46 ` [PATCH 07/18] arm64: remove sigreturn wrappers Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 11:07 ` Dave Martin 2018-05-14 11:07 ` Dave Martin 2018-05-14 9:46 ` [PATCH 08/18] arm64: convert raw syscall invocation to C Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 11:07 ` Dave Martin 2018-05-14 11:07 ` Dave Martin 2018-05-14 11:41 ` Mark Rutland 2018-05-14 11:41 ` Mark Rutland 2018-05-14 12:53 ` Dave Martin 2018-05-14 12:53 ` Dave Martin 2018-05-14 20:24 ` Dominik Brodowski 2018-05-14 20:24 ` Dominik Brodowski 2018-05-15 8:22 ` Mark Rutland 2018-05-15 8:22 ` Mark Rutland 2018-05-15 10:01 ` Dominik Brodowski 2018-05-15 10:01 ` Dominik Brodowski 2018-05-15 10:13 ` Mark Rutland 2018-05-15 10:13 ` Mark Rutland 2018-05-14 18:00 ` Dominik Brodowski 2018-05-14 18:00 ` Dominik Brodowski 2018-05-15 8:18 ` Mark Rutland 2018-05-15 8:18 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 09/18] arm64: convert syscall trace logic " Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 9:46 ` Mark Rutland [this message] 2018-05-14 9:46 ` [PATCH 10/18] arm64: convert native/compat syscall entry " Mark Rutland 2018-05-14 11:07 ` Dave Martin 2018-05-14 11:07 ` Dave Martin 2018-05-14 11:58 ` Mark Rutland 2018-05-14 11:58 ` Mark Rutland 2018-05-14 14:43 ` Dave Martin 2018-05-14 14:43 ` Dave Martin 2018-05-14 15:01 ` Mark Rutland 2018-05-14 15:01 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 11/18] arm64: zero GPRs upon entry from EL0 Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 11:07 ` Dave Martin 2018-05-14 11:07 ` Dave Martin 2018-05-14 9:46 ` [PATCH 12/18] kernel: add ksys_personality() Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 11:08 ` Dave Martin 2018-05-14 11:08 ` Dave Martin 2018-05-14 12:07 ` Christoph Hellwig 2018-05-14 12:07 ` Christoph Hellwig 2018-05-15 9:56 ` Mark Rutland 2018-05-15 9:56 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 13/18] kernel: add kcompat_sys_{f,}statfs64() Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 17:14 ` Mark Rutland 2018-05-14 17:14 ` Mark Rutland 2018-05-14 20:34 ` Dominik Brodowski 2018-05-14 20:34 ` Dominik Brodowski 2018-05-15 9:53 ` Mark Rutland 2018-05-15 9:53 ` Mark Rutland 2018-05-15 9:58 ` Dominik Brodowski 2018-05-15 9:58 ` Dominik Brodowski 2018-05-14 9:46 ` [PATCH 14/18] arm64: remove in-kernel call to sys_personality() Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 15/18] arm64: use {COMPAT,}SYSCALL_DEFINE0 for sigreturn Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 16/18] arm64: use SYSCALL_DEFINE6() for mmap Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 17/18] arm64: convert compat wrappers to C Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 12:10 ` Christoph Hellwig 2018-05-14 12:10 ` Christoph Hellwig 2018-05-14 12:43 ` Mark Rutland 2018-05-14 12:43 ` Mark Rutland 2018-05-14 9:46 ` [PATCH 18/18] arm64: implement syscall wrappers Mark Rutland 2018-05-14 9:46 ` Mark Rutland 2018-05-14 20:57 ` Dominik Brodowski 2018-05-14 20:57 ` Dominik Brodowski 2018-05-15 8:37 ` Mark Rutland 2018-05-15 8:37 ` Mark Rutland
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=20180514094640.27569-11-mark.rutland@arm.com \ --to=mark.rutland@arm.com \ --cc=catalin.marinas@arm.com \ --cc=dave.martin@arm.com \ --cc=james.morse@arm.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@dominikbrodowski.net \ --cc=marc.zyngier@arm.com \ --cc=viro@zeniv.linux.org.uk \ --cc=will.deacon@arm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.