From: Lai Jiangshan <la...@linux.alibaba.com>

Prepare for using percpu and removing TSS_entry2task_stack

Signed-off-by: Lai Jiangshan <la...@linux.alibaba.com>
---
 arch/x86/entry/entry_32.S | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 4513702ba45d..a8d2640394f9 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -279,11 +279,13 @@
 .Lfinished_frame_\@:
 .endm
 
-.macro SAVE_ALL pt_regs_ax=%eax switch_stacks=0 skip_gs=0 unwind_espfix=0
+.macro SAVE_ALL pt_regs_ax=%eax switch_stacks=0 skip_gs=0 skip_fs=0 
unwind_espfix=0
        cld
 .if \skip_gs == 0
        PUSH_GS
 .endif
+
+.if \skip_fs == 0
        pushl   %fs
 
        pushl   %eax
@@ -293,6 +295,7 @@
        UNWIND_ESPFIX_STACK
 .endif
        popl    %eax
+.endif
 
        FIXUP_FRAME
        pushl   %es
@@ -906,18 +909,27 @@ SYM_FUNC_START(entry_SYSENTER_32)
        BUG_IF_WRONG_CR3 no_user_check=1
        SWITCH_TO_KERNEL_CR3 scratch_reg=%eax
 
+       /* Restore kernel %fs, so that we can use PERCPU */
+       pushl   %fs
+       movl    $(__KERNEL_PERCPU), %eax
+       movl    %eax, %fs
+
        /* Switch to task stack */
        movl    %esp, %eax
-       movl    (2*4+TSS_entry2task_stack)(%esp), %esp
+       movl    (3*4+TSS_entry2task_stack)(%esp), %esp
 
 .Lsysenter_past_esp:
        pushl   $__USER_DS              /* pt_regs->ss */
        pushl   $0                      /* pt_regs->sp (placeholder) */
-       pushl   4(%eax)                 /* pt_regs->flags (except IF = 0) */
+       pushl   8(%eax)                 /* pt_regs->flags (except IF = 0) */
        pushl   $__USER_CS              /* pt_regs->cs */
        pushl   $0                      /* pt_regs->ip = 0 (placeholder) */
-       pushl   (%eax)                  /* pt_regs->orig_ax */
-       SAVE_ALL pt_regs_ax=$-ENOSYS    /* save rest, stack already switched */
+       pushl   4(%eax)                 /* pt_regs->orig_ax */
+       PUSH_GS                         /* pt_regs->gs */
+       pushl   (%eax)                  /* pt_regs->fs */
+       /* save rest, stack and %fs already switched */
+       SAVE_ALL pt_regs_ax=$-ENOSYS skip_gs=1 skip_fs=1
+       SET_KERNEL_GS %edx
 
        /*
         * SYSENTER doesn't filter flags, so we need to clear NT, AC
-- 
2.19.1.6.gb485710b

Reply via email to