Signed-off-by: Andy Lutomirski <l...@kernel.org>
---
 arch/x86/entry/entry_64.S        | 63 +++++++++++-----------------------------
 arch/x86/entry/entry_64_compat.S |  5 ++++
 2 files changed, 22 insertions(+), 46 deletions(-)

diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index ce2c9049abef..08a37ec049f0 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -508,7 +508,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.
@@ -547,26 +556,13 @@ ret_from_intr:
 
        testb   $3, CS(%rsp)
        jz      retint_kernel
-       /* Interrupt came from user space */
-GLOBAL(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)
+GLOBAL(retint_user)
+       mov     %rsp,%rdi
+       call    prepare_exit_to_usermode
        TRACE_IRQS_IRETQ
-
        SWAPGS
        jmp     restore_regs_and_iret
 
@@ -644,35 +640,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)
 
 /*
@@ -1088,6 +1055,10 @@ error_entry_from_usermode_swapgs:
        SWAPGS
 
 error_entry_from_usermode_after_swapgs:
+#ifdef CONFIG_CONTEXT_TRACKING
+       call enter_from_user_mode
+#endif
+
 error_entry_done:
        TRACE_IRQS_OFF
        ret
diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
index ac0658142ae1..566d33f17d0b 100644
--- a/arch/x86/entry/entry_64_compat.S
+++ b/arch/x86/entry/entry_64_compat.S
@@ -454,6 +454,11 @@ ia32_badarg:
        DISABLE_INTERRUPTS(CLBR_NONE)
        TRACE_IRQS_OFF
 
+       /* Now finish entering normal kernel mode. */
+#ifdef CONFIG_CONTEXT_TRACKING
+       call enter_from_user_mode
+#endif
+
        /* And exit again. */
        jmp retint_user
 
-- 
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