Commit-ID:  29ea1b258b98a862e59d72556714b75051ae93fb
Gitweb:     http://git.kernel.org/tip/29ea1b258b98a862e59d72556714b75051ae93fb
Author:     Andy Lutomirski <l...@kernel.org>
AuthorDate: Fri, 3 Jul 2015 12:44:28 -0700
Committer:  Ingo Molnar <mi...@kernel.org>
CommitDate: Tue, 7 Jul 2015 10:59:07 +0200

x86/entry/64: Migrate 64-bit and compat syscalls to the new exit handlers and 
remove old assembly code

These need to be migrated together, as the compat case used to
jump into the middle of the 64-bit exit code.

Remove the old assembly code.

Signed-off-by: Andy Lutomirski <l...@kernel.org>
Cc: Andy Lutomirski <l...@amacapital.net>
Cc: Borislav Petkov <b...@alien8.de>
Cc: Brian Gerst <brge...@gmail.com>
Cc: Denys Vlasenko <dvlas...@redhat.com>
Cc: Denys Vlasenko <vda.li...@googlemail.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: H. Peter Anvin <h...@zytor.com>
Cc: Kees Cook <keesc...@chromium.org>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Oleg Nesterov <o...@redhat.com>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Rik van Riel <r...@redhat.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: paul...@linux.vnet.ibm.com
Link: 
http://lkml.kernel.org/r/d4d1d70de08ac3640badf50048a9e8f18fe2497f.1435952415.git.l...@kernel.org
Signed-off-by: Ingo Molnar <mi...@kernel.org>
---
 arch/x86/entry/entry_64.S        | 69 +++++-----------------------------------
 arch/x86/entry/entry_64_compat.S |  6 ++--
 2 files changed, 11 insertions(+), 64 deletions(-)

diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index ccfcba9..4ca5b78 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -229,6 +229,11 @@ entry_SYSCALL_64_fastpath:
         */
        USERGS_SYSRET64
 
+GLOBAL(int_ret_from_sys_call_irqs_off)
+       TRACE_IRQS_ON
+       ENABLE_INTERRUPTS(CLBR_NONE)
+       jmp int_ret_from_sys_call
+
        /* Do syscall entry tracing */
 tracesys:
        movq    %rsp, %rdi
@@ -272,69 +277,11 @@ tracesys_phase2:
  * Has correct iret frame.
  */
 GLOBAL(int_ret_from_sys_call)
-       DISABLE_INTERRUPTS(CLBR_NONE)
-int_ret_from_sys_call_irqs_off: /* jumps come here from the irqs-off SYSRET 
path */
-       TRACE_IRQS_OFF
-       movl    $_TIF_ALLWORK_MASK, %edi
-       /* edi: mask to check */
-GLOBAL(int_with_check)
-       LOCKDEP_SYS_EXIT_IRQ
-       GET_THREAD_INFO(%rcx)
-       movl    TI_flags(%rcx), %edx
-       andl    %edi, %edx
-       jnz     int_careful
-       andl    $~TS_COMPAT, TI_status(%rcx)
-       jmp     syscall_return
-
-       /*
-        * Either reschedule or signal or syscall exit tracking needed.
-        * First do a reschedule test.
-        * edx: work, edi: workmask
-        */
-int_careful:
-       bt      $TIF_NEED_RESCHED, %edx
-       jnc     int_very_careful
-       TRACE_IRQS_ON
-       ENABLE_INTERRUPTS(CLBR_NONE)
-       pushq   %rdi
-       SCHEDULE_USER
-       popq    %rdi
-       DISABLE_INTERRUPTS(CLBR_NONE)
-       TRACE_IRQS_OFF
-       jmp     int_with_check
-
-       /* handle signals and tracing -- both require a full pt_regs */
-int_very_careful:
-       TRACE_IRQS_ON
-       ENABLE_INTERRUPTS(CLBR_NONE)
        SAVE_EXTRA_REGS
-       /* Check for syscall exit trace */
-       testl   $_TIF_WORK_SYSCALL_EXIT, %edx
-       jz      int_signal
-       pushq   %rdi
-       leaq    8(%rsp), %rdi                   /* &ptregs -> arg1 */
-       call    syscall_trace_leave
-       popq    %rdi
-       andl    $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU), %edi
-       jmp     int_restore_rest
-
-int_signal:
-       testl   $_TIF_DO_NOTIFY_MASK, %edx
-       jz      1f
-       movq    %rsp, %rdi                      /* &ptregs -> arg1 */
-       xorl    %esi, %esi                      /* oldset -> arg2 */
-       call    do_notify_resume
-1:     movl    $_TIF_WORK_MASK, %edi
-int_restore_rest:
+       movq    %rsp, %rdi
+       call    syscall_return_slowpath /* returns with IRQs disabled */
        RESTORE_EXTRA_REGS
-       DISABLE_INTERRUPTS(CLBR_NONE)
-       TRACE_IRQS_OFF
-       jmp     int_with_check
-
-syscall_return:
-       /* The IRETQ could re-enable interrupts: */
-       DISABLE_INTERRUPTS(CLBR_ANY)
-       TRACE_IRQS_IRETQ
+       TRACE_IRQS_IRETQ                /* we're about to change IF */
 
        /*
         * Try to use SYSRET instead of IRET if we're returning to
diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
index e5ebdd9..d9bbd31 100644
--- a/arch/x86/entry/entry_64_compat.S
+++ b/arch/x86/entry/entry_64_compat.S
@@ -210,10 +210,10 @@ sysexit_from_sys_call:
        .endm
 
        .macro auditsys_exit exit
-       testl   $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), 
ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
-       jnz     ia32_ret_from_sys_call
        TRACE_IRQS_ON
        ENABLE_INTERRUPTS(CLBR_NONE)
+       testl   $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), 
ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
+       jnz     ia32_ret_from_sys_call
        movl    %eax, %esi              /* second arg, syscall return value */
        cmpl    $-MAX_ERRNO, %eax       /* is it an error ? */
        jbe     1f
@@ -232,7 +232,7 @@ sysexit_from_sys_call:
        movq    %rax, R10(%rsp)
        movq    %rax, R9(%rsp)
        movq    %rax, R8(%rsp)
-       jmp     int_with_check
+       jmp     int_ret_from_sys_call_irqs_off
        .endm
 
 sysenter_auditsys:
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to