Signed-off-by: Andy Lutomirski <l...@kernel.org>
---
 arch/x86/entry/entry_64.S | 63 +++++++++++++----------------------------------
 1 file changed, 17 insertions(+), 46 deletions(-)

diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index ab8cbf602d19..9ae8b8ab91fa 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -507,7 +507,16 @@ END(irq_entries_start)
 
        testb   $3, CS(%rsp)
        jz      1f
+
+       /*
+        * IRQ from user mode.  Switch to kernel gsbase and inform context
+        * tracking that we're in kernel mode.
+        */
        SWAPGS
+#ifdef CONFIG_CONTEXT_TRACKING
+       call enter_from_user_mode
+#endif
+
 1:
        /*
         * Save previous stack pointer, optionally switch to interrupt stack.
@@ -546,26 +555,13 @@ ret_from_intr:
 
        testb   $3, CS(%rsp)
        jz      retint_kernel
-       /* Interrupt came from user space */
-retint_user:
-       GET_THREAD_INFO(%rcx)
 
-       /* %rcx: thread info. Interrupts are off. */
-retint_with_reschedule:
-       movl    $_TIF_WORK_MASK, %edi
-retint_check:
+       /* Interrupt came from user space */
        LOCKDEP_SYS_EXIT_IRQ
-       movl    TI_flags(%rcx), %edx
-       andl    %edi, %edx
-       jnz     retint_careful
-
-retint_swapgs:                                 /* return to user-space */
-       /*
-        * The iretq could re-enable interrupts:
-        */
-       DISABLE_INTERRUPTS(CLBR_ANY)
+retint_user:
+       mov     %rsp,%rdi
+       call    prepare_exit_to_usermode
        TRACE_IRQS_IRETQ
-
        SWAPGS
        jmp     restore_regs_and_iret
 
@@ -643,35 +639,6 @@ native_irq_return_ldt:
        popq    %rax
        jmp     native_irq_return_iret
 #endif
-
-       /* edi: workmask, edx: work */
-retint_careful:
-       bt      $TIF_NEED_RESCHED, %edx
-       jnc     retint_signal
-       TRACE_IRQS_ON
-       ENABLE_INTERRUPTS(CLBR_NONE)
-       pushq   %rdi
-       SCHEDULE_USER
-       popq    %rdi
-       GET_THREAD_INFO(%rcx)
-       DISABLE_INTERRUPTS(CLBR_NONE)
-       TRACE_IRQS_OFF
-       jmp     retint_check
-
-retint_signal:
-       testl   $_TIF_DO_NOTIFY_MASK, %edx
-       jz      retint_swapgs
-       TRACE_IRQS_ON
-       ENABLE_INTERRUPTS(CLBR_NONE)
-       movq    $-1, ORIG_RAX(%rsp)
-       xorl    %esi, %esi                      /* oldset */
-       movq    %rsp, %rdi                      /* &pt_regs */
-       call    do_notify_resume
-       DISABLE_INTERRUPTS(CLBR_NONE)
-       TRACE_IRQS_OFF
-       GET_THREAD_INFO(%rcx)
-       jmp     retint_with_reschedule
-
 END(common_interrupt)
 
 /*
@@ -1086,6 +1053,10 @@ error_entry_from_usermode:
         */
        SWAPGS
 
+#ifdef CONFIG_CONTEXT_TRACKING
+       call enter_from_user_mode
+#endif
+
 error_entry_done:
        TRACE_IRQS_OFF
        ret
-- 
2.4.3

--
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