From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964912AbbCRTsZ (ORCPT ); Wed, 18 Mar 2015 15:48:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58126 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964879AbbCRTsW (ORCPT ); Wed, 18 Mar 2015 15:48:22 -0400 From: Denys Vlasenko To: Andy Lutomirski Cc: Denys Vlasenko , Linus Torvalds , Steven Rostedt , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Oleg Nesterov , Frederic Weisbecker , Alexei Starovoitov , Will Drewry , Kees Cook , x86@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/3] x86: get rid of FIXUP_TOP_OF_STACK/RESTORE_TOP_OF_STACK Date: Wed, 18 Mar 2015 20:47:36 +0100 Message-Id: <1426708056-2785-3-git-send-email-dvlasenk@redhat.com> In-Reply-To: <1426708056-2785-1-git-send-email-dvlasenk@redhat.com> References: <1426708056-2785-1-git-send-email-dvlasenk@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org FIXUP_TOP_OF_STACK is only necessary because we don't save %r11 to pt_regs->r11 on SYSCALL64 fast path, but we want ptrace to see it populated. Bite the bullet, add a single additional PUSH insn, and remove FIXUP_TOP_OF_STACK. RESTORE_TOP_OF_STACK is already a nop. Remove it too. On SandyBridge CPU, it does not get slower: measured 54.22 ns per getpid syscall before and after last two changes on defconfig kernel. Signed-off-by: Denys Vlasenko CC: Linus Torvalds CC: Steven Rostedt CC: Ingo Molnar CC: Borislav Petkov CC: "H. Peter Anvin" CC: Andy Lutomirski CC: Oleg Nesterov CC: Frederic Weisbecker CC: Alexei Starovoitov CC: Will Drewry CC: Kees Cook CC: x86@kernel.org CC: linux-kernel@vger.kernel.org --- arch/x86/kernel/entry_64.S | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 4647c1d..a0a3a6e 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -22,8 +22,6 @@ * - CFI macros are used to generate dwarf2 unwind information for better * backtraces. They don't change any code. * - ENTRY/END Define functions in the symbol table. - * - FIXUP_TOP_OF_STACK/RESTORE_TOP_OF_STACK - Fix up the hardware stack - * frame that is otherwise undefined after a SYSCALL * - TRACE_IRQ_* - Trace hard interrupt state for lock debugging. * - idtentry - Define exception entry points. */ @@ -119,23 +117,6 @@ ENDPROC(native_usergs_sysret64) #endif /* - * C code is not supposed to know that the iret frame is not populated. - * Every time a C function with an pt_regs argument is called from - * the SYSCALL based fast path FIXUP_TOP_OF_STACK is needed. - * RESTORE_TOP_OF_STACK syncs the syscall state after any possible ptregs - * manipulation. - */ - .macro FIXUP_TOP_OF_STACK tmp offset=0 - /* copy flags to r11 as sysret would do */ - movq EFLAGS+\offset(%rsp),\tmp - movq \tmp,R11+\offset(%rsp) - .endm - - .macro RESTORE_TOP_OF_STACK tmp offset=0 - /* nothing to do */ - .endm - -/* * empty frame */ .macro EMPTY_FRAME start=1 offset=0 @@ -259,7 +240,8 @@ GLOBAL(system_call_after_swapgs) pushq_cfi_reg r8 /* pt_regs->r8 */ pushq_cfi_reg r9 /* pt_regs->r9 */ pushq_cfi_reg r10 /* pt_regs->r10 */ - sub $(7*8),%rsp /* pt_regs->r11,bp,bx,r12-15 not saved */ + pushq_cfi_reg r11 /* pt_regs->r11 */ + sub $(6*8),%rsp /* pt_regs->bp,bx,r12-15 not saved */ testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,SIZEOF_PTREGS) jnz tracesys @@ -306,7 +288,6 @@ ret_from_sys_call: CFI_RESTORE_STATE int_ret_from_sys_call_fixup: - FIXUP_TOP_OF_STACK %r11 jmp int_ret_from_sys_call /* Do syscall entry tracing */ @@ -322,7 +303,6 @@ tracesys: tracesys_phase2: SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %rdi movq %rsp, %rdi movq $AUDIT_ARCH_X86_64, %rsi movq %rax,%rdx @@ -415,9 +395,7 @@ ENTRY(stub_\func) CFI_STARTPROC DEFAULT_FRAME 0, 8 /* offset 8: return address */ SAVE_EXTRA_REGS 8 - FIXUP_TOP_OF_STACK %r11, 8 call sys_\func - RESTORE_TOP_OF_STACK %r11, 8 ret CFI_ENDPROC END(stub_\func) @@ -432,7 +410,6 @@ ENTRY(stub_execve) addq $8, %rsp DEFAULT_FRAME 0 SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %r11 call sys_execve movq %rax,RAX(%rsp) RESTORE_EXTRA_REGS @@ -445,9 +422,7 @@ ENTRY(stub_execveat) addq $8, %rsp DEFAULT_FRAME 0 SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %r11 call sys_execveat - RESTORE_TOP_OF_STACK %r11 movq %rax,RAX(%rsp) RESTORE_EXTRA_REGS jmp int_ret_from_sys_call @@ -463,7 +438,6 @@ ENTRY(stub_rt_sigreturn) addq $8, %rsp DEFAULT_FRAME 0 SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %r11 call sys_rt_sigreturn movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer RESTORE_EXTRA_REGS @@ -477,7 +451,6 @@ ENTRY(stub_x32_rt_sigreturn) addq $8, %rsp DEFAULT_FRAME 0 SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %r11 call sys32_x32_rt_sigreturn movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer RESTORE_EXTRA_REGS @@ -490,9 +463,7 @@ ENTRY(stub_x32_execve) addq $8, %rsp DEFAULT_FRAME 0 SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %r11 call compat_sys_execve - RESTORE_TOP_OF_STACK %r11 movq %rax,RAX(%rsp) RESTORE_EXTRA_REGS jmp int_ret_from_sys_call @@ -504,9 +475,7 @@ ENTRY(stub_x32_execveat) addq $8, %rsp DEFAULT_FRAME 0 SAVE_EXTRA_REGS - FIXUP_TOP_OF_STACK %r11 call compat_sys_execveat - RESTORE_TOP_OF_STACK %r11 movq %rax,RAX(%rsp) RESTORE_EXTRA_REGS jmp int_ret_from_sys_call -- 1.8.1.4