x86/entry/32: Simplify common_exception
authorPeter Zijlstra <peterz@infradead.org>
Thu, 11 Jul 2019 11:40:56 +0000 (13:40 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 17 Jul 2019 21:17:37 +0000 (23:17 +0200)
Adding one more option to SAVE_ALL can be used in common_exception to
simplify things. This also saves duplication later where page_fault will no
longer use common_exception.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Reviewed-by: Andy Lutomirski <luto@kernel.org>
Cc: bp@alien8.de
Cc: torvalds@linux-foundation.org
Cc: hpa@zytor.com
Cc: dave.hansen@linux.intel.com
Cc: jgross@suse.com
Cc: zhe.he@windriver.com
Cc: joel@joelfernandes.org
Cc: devel@etsukata.com
Link: https://lkml.kernel.org/r/20190711114335.945136187@infradead.org
arch/x86/entry/entry_32.S

index 90b4732..4d4b610 100644 (file)
 .Lfinished_frame_\@:
 .endm
 
-.macro SAVE_ALL pt_regs_ax=%eax switch_stacks=0
+.macro SAVE_ALL pt_regs_ax=%eax switch_stacks=0 skip_gs=0
        cld
+.if \skip_gs == 0
        PUSH_GS
+.endif
        FIXUP_FRAME
        pushl   %fs
        pushl   %es
        movl    %edx, %es
        movl    $(__KERNEL_PERCPU), %edx
        movl    %edx, %fs
+.if \skip_gs == 0
        SET_KERNEL_GS %edx
-
+.endif
        /* Switch to kernel stack if necessary */
 .if \switch_stacks > 0
        SWITCH_TO_KERNEL_STACK
 .endif
-
 .endm
 
 .macro SAVE_ALL_NMI cr3_reg:req
@@ -1448,32 +1450,20 @@ END(page_fault)
 
 common_exception:
        /* the function address is in %gs's slot on the stack */
-       FIXUP_FRAME
-       pushl   %fs
-       pushl   %es
-       pushl   %ds
-       pushl   %eax
-       movl    $(__USER_DS), %eax
-       movl    %eax, %ds
-       movl    %eax, %es
-       movl    $(__KERNEL_PERCPU), %eax
-       movl    %eax, %fs
-       pushl   %ebp
-       pushl   %edi
-       pushl   %esi
-       pushl   %edx
-       pushl   %ecx
-       pushl   %ebx
-       SWITCH_TO_KERNEL_STACK
+       SAVE_ALL switch_stacks=1 skip_gs=1
        ENCODE_FRAME_POINTER
-       cld
        UNWIND_ESPFIX_STACK
+
+       /* fixup %gs */
        GS_TO_REG %ecx
        movl    PT_GS(%esp), %edi               # get the function address
-       movl    PT_ORIG_EAX(%esp), %edx         # get the error code
-       movl    $-1, PT_ORIG_EAX(%esp)          # no syscall to restart
        REG_TO_PTGS %ecx
        SET_KERNEL_GS %ecx
+
+       /* fixup orig %eax */
+       movl    PT_ORIG_EAX(%esp), %edx         # get the error code
+       movl    $-1, PT_ORIG_EAX(%esp)          # no syscall to restart
+
        TRACE_IRQS_OFF
        movl    %esp, %eax                      # pt_regs pointer
        CALL_NOSPEC %edi