| From 260b203ce090f1fec8487f1487579312b6f6086a Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Thu, 11 Jul 2019 13:40:56 +0200 |
| Subject: [PATCH] x86/entry/32: Simplify common_exception |
| |
| commit e67f1c11e5ea7fa47449a16325ecc997dbbf9bdf upstream. |
| |
| 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 |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S |
| index 90b473297299..4d4b6100f0e8 100644 |
| --- a/arch/x86/entry/entry_32.S |
| +++ b/arch/x86/entry/entry_32.S |
| @@ -294,9 +294,11 @@ |
| .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 |
| @@ -313,13 +315,13 @@ |
| 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 |
| -- |
| 2.7.4 |
| |