From: Andy Lutomirski <luto@amacapital.net> To: linux-kernel@vger.kernel.org, Kees Cook <keescook@chromium.org>, Will Drewry <wad@chromium.org> Cc: Oleg Nesterov <oleg@redhat.com>, x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-mips@linux-mips.org, linux-arch@vger.kernel.org, linux-security-module@vger.kernel.org, Alexei Starovoitov <ast@plumgrid.com>, hpa@zytor.com, Frederic Weisbecker <fweisbec@gmail.com>, Andy Lutomirski <luto@amacapital.net> Subject: [PATCH v4 4/5] x86_64,entry: Treat regs->ax the same in fastpath and slowpath syscalls Date: Mon, 28 Jul 2014 20:38:31 -0700 [thread overview] Message-ID: <44be7284cbd6304a2efe01b470c8388a2f0848ec.1406604806.git.luto@amacapital.net> (raw) In-Reply-To: <cover.1406604806.git.luto@amacapital.net> In-Reply-To: <cover.1406604806.git.luto@amacapital.net> For slowpath syscalls, we initialize regs->ax to -ENOSYS and stick the syscall number into regs->orig_ax prior to any possible tracing and syscall execution. This is user-visible ABI used by ptrace syscall emulation and seccomp. For fastpath syscalls, there's no good reason not to do the same thing. It's even slightly simpler than what we're currently doing. It probably has no measureable performance impact. It should have no user-visible effect. The purpose of this patch is to prepare for two-phase syscall tracing, in which the first phase might modify the saved RAX without leaving the fast path. This change is just subtle enough that I'm keeping it separate. Signed-off-by: Andy Lutomirski <luto@amacapital.net> --- arch/x86/include/asm/calling.h | 6 +++++- arch/x86/kernel/entry_64.S | 13 ++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/calling.h b/arch/x86/include/asm/calling.h index cb4c73b..76659b6 100644 --- a/arch/x86/include/asm/calling.h +++ b/arch/x86/include/asm/calling.h @@ -85,7 +85,7 @@ For 32-bit we have the following conventions - kernel is built with #define ARGOFFSET R11 #define SWFRAME ORIG_RAX - .macro SAVE_ARGS addskip=0, save_rcx=1, save_r891011=1 + .macro SAVE_ARGS addskip=0, save_rcx=1, save_r891011=1, rax_enosys=0 subq $9*8+\addskip, %rsp CFI_ADJUST_CFA_OFFSET 9*8+\addskip movq_cfi rdi, 8*8 @@ -96,7 +96,11 @@ For 32-bit we have the following conventions - kernel is built with movq_cfi rcx, 5*8 .endif + .if \rax_enosys + movq $-ENOSYS, 4*8(%rsp) + .else movq_cfi rax, 4*8 + .endif .if \save_r891011 movq_cfi r8, 3*8 diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index b25ca96..1eb3094 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -405,8 +405,8 @@ GLOBAL(system_call_after_swapgs) * and short: */ ENABLE_INTERRUPTS(CLBR_NONE) - SAVE_ARGS 8,0 - movq %rax,ORIG_RAX-ARGOFFSET(%rsp) + SAVE_ARGS 8, 0, rax_enosys=1 + movq_cfi rax,(ORIG_RAX-ARGOFFSET) movq %rcx,RIP-ARGOFFSET(%rsp) CFI_REL_OFFSET rip,RIP-ARGOFFSET testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) @@ -418,7 +418,7 @@ system_call_fastpath: andl $__SYSCALL_MASK,%eax cmpl $__NR_syscall_max,%eax #endif - ja badsys + ja ret_from_sys_call /* and return regs->ax */ movq %r10,%rcx call *sys_call_table(,%rax,8) # XXX: rip relative movq %rax,RAX-ARGOFFSET(%rsp) @@ -477,10 +477,6 @@ sysret_signal: FIXUP_TOP_OF_STACK %r11, -ARGOFFSET jmp int_check_syscall_exit_work -badsys: - movq $-ENOSYS,RAX-ARGOFFSET(%rsp) - jmp ret_from_sys_call - #ifdef CONFIG_AUDITSYSCALL /* * Fast path for syscall audit without full syscall trace. @@ -520,7 +516,6 @@ tracesys: jz auditsys #endif SAVE_REST - movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */ FIXUP_TOP_OF_STACK %rdi movq %rsp,%rdi call syscall_trace_enter @@ -537,7 +532,7 @@ tracesys: andl $__SYSCALL_MASK,%eax cmpl $__NR_syscall_max,%eax #endif - ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ + ja int_ret_from_sys_call /* RAX(%rsp) is already set */ movq %r10,%rcx /* fixup for C */ call *sys_call_table(,%rax,8) movq %rax,RAX-ARGOFFSET(%rsp) -- 1.9.3
WARNING: multiple messages have this Message-ID (diff)
From: luto@amacapital.net (Andy Lutomirski) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v4 4/5] x86_64, entry: Treat regs->ax the same in fastpath and slowpath syscalls Date: Mon, 28 Jul 2014 20:38:31 -0700 [thread overview] Message-ID: <44be7284cbd6304a2efe01b470c8388a2f0848ec.1406604806.git.luto@amacapital.net> (raw) In-Reply-To: <cover.1406604806.git.luto@amacapital.net> For slowpath syscalls, we initialize regs->ax to -ENOSYS and stick the syscall number into regs->orig_ax prior to any possible tracing and syscall execution. This is user-visible ABI used by ptrace syscall emulation and seccomp. For fastpath syscalls, there's no good reason not to do the same thing. It's even slightly simpler than what we're currently doing. It probably has no measureable performance impact. It should have no user-visible effect. The purpose of this patch is to prepare for two-phase syscall tracing, in which the first phase might modify the saved RAX without leaving the fast path. This change is just subtle enough that I'm keeping it separate. Signed-off-by: Andy Lutomirski <luto@amacapital.net> --- arch/x86/include/asm/calling.h | 6 +++++- arch/x86/kernel/entry_64.S | 13 ++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/calling.h b/arch/x86/include/asm/calling.h index cb4c73b..76659b6 100644 --- a/arch/x86/include/asm/calling.h +++ b/arch/x86/include/asm/calling.h @@ -85,7 +85,7 @@ For 32-bit we have the following conventions - kernel is built with #define ARGOFFSET R11 #define SWFRAME ORIG_RAX - .macro SAVE_ARGS addskip=0, save_rcx=1, save_r891011=1 + .macro SAVE_ARGS addskip=0, save_rcx=1, save_r891011=1, rax_enosys=0 subq $9*8+\addskip, %rsp CFI_ADJUST_CFA_OFFSET 9*8+\addskip movq_cfi rdi, 8*8 @@ -96,7 +96,11 @@ For 32-bit we have the following conventions - kernel is built with movq_cfi rcx, 5*8 .endif + .if \rax_enosys + movq $-ENOSYS, 4*8(%rsp) + .else movq_cfi rax, 4*8 + .endif .if \save_r891011 movq_cfi r8, 3*8 diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index b25ca96..1eb3094 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -405,8 +405,8 @@ GLOBAL(system_call_after_swapgs) * and short: */ ENABLE_INTERRUPTS(CLBR_NONE) - SAVE_ARGS 8,0 - movq %rax,ORIG_RAX-ARGOFFSET(%rsp) + SAVE_ARGS 8, 0, rax_enosys=1 + movq_cfi rax,(ORIG_RAX-ARGOFFSET) movq %rcx,RIP-ARGOFFSET(%rsp) CFI_REL_OFFSET rip,RIP-ARGOFFSET testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) @@ -418,7 +418,7 @@ system_call_fastpath: andl $__SYSCALL_MASK,%eax cmpl $__NR_syscall_max,%eax #endif - ja badsys + ja ret_from_sys_call /* and return regs->ax */ movq %r10,%rcx call *sys_call_table(,%rax,8) # XXX: rip relative movq %rax,RAX-ARGOFFSET(%rsp) @@ -477,10 +477,6 @@ sysret_signal: FIXUP_TOP_OF_STACK %r11, -ARGOFFSET jmp int_check_syscall_exit_work -badsys: - movq $-ENOSYS,RAX-ARGOFFSET(%rsp) - jmp ret_from_sys_call - #ifdef CONFIG_AUDITSYSCALL /* * Fast path for syscall audit without full syscall trace. @@ -520,7 +516,6 @@ tracesys: jz auditsys #endif SAVE_REST - movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */ FIXUP_TOP_OF_STACK %rdi movq %rsp,%rdi call syscall_trace_enter @@ -537,7 +532,7 @@ tracesys: andl $__SYSCALL_MASK,%eax cmpl $__NR_syscall_max,%eax #endif - ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ + ja int_ret_from_sys_call /* RAX(%rsp) is already set */ movq %r10,%rcx /* fixup for C */ call *sys_call_table(,%rax,8) movq %rax,RAX-ARGOFFSET(%rsp) -- 1.9.3
next prev parent reply other threads:[~2014-07-29 3:39 UTC|newest] Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-07-29 3:38 [PATCH v4 0/5] x86: two-phase syscall tracing and seccomp fastpath Andy Lutomirski 2014-07-29 3:38 ` Andy Lutomirski 2014-07-29 3:38 ` [PATCH v4 1/5] x86,x32,audit: Fix x32's AUDIT_ARCH wrt audit Andy Lutomirski 2014-07-29 3:38 ` Andy Lutomirski 2014-07-29 3:38 ` [PATCH v4 2/5] x86,entry: Only call user_exit if TIF_NOHZ Andy Lutomirski 2014-07-29 3:38 ` Andy Lutomirski 2014-07-29 19:32 ` Oleg Nesterov 2014-07-29 19:32 ` Oleg Nesterov 2014-07-30 16:43 ` Frederic Weisbecker 2014-07-30 16:43 ` Frederic Weisbecker 2014-07-30 17:23 ` Andy Lutomirski 2014-07-30 17:23 ` Andy Lutomirski 2014-07-30 17:23 ` Andy Lutomirski 2014-07-31 15:16 ` Frederic Weisbecker 2014-07-31 15:16 ` Frederic Weisbecker 2014-07-31 15:16 ` Frederic Weisbecker 2014-07-31 16:42 ` Oleg Nesterov 2014-07-31 16:42 ` Oleg Nesterov 2014-07-31 16:42 ` Oleg Nesterov 2014-07-31 16:49 ` Frederic Weisbecker 2014-07-31 16:49 ` Frederic Weisbecker 2014-07-31 16:49 ` Frederic Weisbecker 2014-07-31 16:54 ` Oleg Nesterov 2014-07-31 16:54 ` Oleg Nesterov 2014-07-31 16:54 ` Oleg Nesterov 2014-07-31 16:58 ` Oleg Nesterov 2014-07-31 16:58 ` Oleg Nesterov 2014-07-31 16:58 ` Oleg Nesterov 2014-07-31 17:17 ` Frederic Weisbecker 2014-07-31 17:17 ` Frederic Weisbecker 2014-07-31 17:17 ` Frederic Weisbecker 2014-07-29 3:38 ` [PATCH v4 3/5] x86: Split syscall_trace_enter into two phases Andy Lutomirski 2014-07-29 3:38 ` Andy Lutomirski 2014-07-29 19:25 ` Oleg Nesterov 2014-07-29 19:25 ` Oleg Nesterov 2014-07-29 3:38 ` Andy Lutomirski [this message] 2014-07-29 3:38 ` [PATCH v4 4/5] x86_64, entry: Treat regs->ax the same in fastpath and slowpath syscalls Andy Lutomirski 2014-07-29 3:38 ` [PATCH v4 5/5] x86_64,entry: Use split-phase syscall_trace_enter for 64-bit syscalls Andy Lutomirski 2014-07-29 3:38 ` [PATCH v4 5/5] x86_64, entry: " Andy Lutomirski 2014-07-29 19:20 ` [PATCH v4 0/5] x86: two-phase syscall tracing and seccomp fastpath Oleg Nesterov 2014-07-29 19:20 ` Oleg Nesterov 2014-07-29 20:54 ` Andy Lutomirski 2014-07-29 20:54 ` Andy Lutomirski 2014-07-29 20:54 ` Andy Lutomirski 2014-07-29 23:30 ` Andy Lutomirski 2014-07-29 23:30 ` Andy Lutomirski 2014-07-29 23:30 ` Andy Lutomirski 2014-07-30 15:32 ` Oleg Nesterov 2014-07-30 15:32 ` Oleg Nesterov 2014-07-30 15:32 ` Oleg Nesterov 2014-07-30 16:59 ` Frederic Weisbecker 2014-07-30 16:59 ` Frederic Weisbecker 2014-07-30 16:59 ` Frederic Weisbecker 2014-07-30 17:25 ` Andy Lutomirski 2014-07-30 17:25 ` Andy Lutomirski 2014-07-30 17:25 ` Andy Lutomirski 2014-07-31 16:56 ` H. Peter Anvin 2014-07-31 16:56 ` H. Peter Anvin 2014-07-31 16:56 ` H. Peter Anvin 2014-07-31 17:20 ` Frederic Weisbecker 2014-07-31 17:20 ` Frederic Weisbecker 2014-07-31 17:20 ` Frederic Weisbecker
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=44be7284cbd6304a2efe01b470c8388a2f0848ec.1406604806.git.luto@amacapital.net \ --to=luto@amacapital.net \ --cc=ast@plumgrid.com \ --cc=fweisbec@gmail.com \ --cc=hpa@zytor.com \ --cc=keescook@chromium.org \ --cc=linux-arch@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mips@linux-mips.org \ --cc=linux-security-module@vger.kernel.org \ --cc=oleg@redhat.com \ --cc=wad@chromium.org \ --cc=x86@kernel.org \ /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.