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

Commit 3701d863 authored by Ingo Molnar's avatar Ingo Molnar Committed by Thomas Gleixner
Browse files

x86: fixup more paravirt fallout



Use a common irq_return entry point for all the iret places, which
need the paravirt INTERRUPT return wrapper.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 1ec7fd50
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -409,7 +409,8 @@ restore_nocheck_notrace:
	RESTORE_REGS
	addl $4, %esp			# skip orig_eax/error_code
	CFI_ADJUST_CFA_OFFSET -4
1:	INTERRUPT_RETURN
ENTRY(irq_return)
	INTERRUPT_RETURN
.section .fixup,"ax"
iret_exc:
	pushl $0			# no error code
@@ -418,7 +419,7 @@ iret_exc:
.previous
.section __ex_table,"a"
	.align 4
	.long 1b,iret_exc
	.long irq_return,iret_exc
.previous

	CFI_RESTORE_STATE
@@ -865,20 +866,16 @@ nmi_espfix_stack:
	RESTORE_REGS
	lss 12+4(%esp), %esp		# back to espfix stack
	CFI_ADJUST_CFA_OFFSET -24
1:	INTERRUPT_RETURN
	jmp irq_return
	CFI_ENDPROC
.section __ex_table,"a"
	.align 4
	.long 1b,iret_exc
.previous
KPROBE_END(nmi)

#ifdef CONFIG_PARAVIRT
ENTRY(native_iret)
1:	iret
	iret
.section __ex_table,"a"
	.align 4
	.long 1b,iret_exc
	.long native_iret, iret_exc
.previous
END(native_iret)

+13 −5
Original line number Diff line number Diff line
@@ -582,15 +582,23 @@ retint_restore_args: /* return to kernel space */
	TRACE_IRQS_IRETQ
restore_args:
	RESTORE_ARGS 0,8,0
#ifdef CONFIG_PARAVIRT

ENTRY(irq_return)
	INTERRUPT_RETURN
#endif

	.section __ex_table, "a"
	.quad irq_return, bad_iret
	.previous

#ifdef CONFIG_PARAVIRT
ENTRY(native_iret)
	iretq

	.section __ex_table,"a"
	.quad native_iret, bad_iret
	.previous
#endif

	.section .fixup,"ax"
bad_iret:
	/*
@@ -804,7 +812,7 @@ paranoid_swapgs\trace:
	SWAPGS_UNSAFE_STACK
paranoid_restore\trace:
	RESTORE_ALL 8
	INTERRUPT_RETURN
	jmp irq_return
paranoid_userspace\trace:
	GET_THREAD_INFO(%rcx)
	movl threadinfo_flags(%rcx),%ebx
@@ -919,7 +927,7 @@ error_kernelspace:
	   iret run with kernel gs again, so don't set the user space flag.
	   B stepping K8s sometimes report an truncated RIP for IRET 
	   exceptions returning to compat mode. Check for these here too. */
	leaq native_iret(%rip),%rbp
	leaq irq_return(%rip),%rbp
	cmpq %rbp,RIP(%rsp) 
	je   error_swapgs
	movl %ebp,%ebp	/* zero extend */