Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e67f1c11 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Thomas Gleixner
Browse files

x86/entry/32: Simplify common_exception



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: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Reviewed-by: default avatarAndy 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
parent 55aedddb
Loading
Loading
Loading
Loading
+13 −23
Original line number Diff line number Diff line
@@ -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