|
@@ -981,7 +981,7 @@ ENTRY(\sym)
|
|
|
|
|
|
call \do_sym
|
|
|
|
|
|
- jmp error_exit /* %ebx: no swapgs flag */
|
|
|
+ jmp error_exit
|
|
|
.endif
|
|
|
END(\sym)
|
|
|
.endm
|
|
@@ -1222,7 +1222,6 @@ END(paranoid_exit)
|
|
|
|
|
|
/*
|
|
|
* Save all registers in pt_regs, and switch GS if needed.
|
|
|
- * Return: EBX=0: came from user mode; EBX=1: otherwise
|
|
|
*/
|
|
|
ENTRY(error_entry)
|
|
|
UNWIND_HINT_FUNC
|
|
@@ -1269,7 +1268,6 @@ ENTRY(error_entry)
|
|
|
* for these here too.
|
|
|
*/
|
|
|
.Lerror_kernelspace:
|
|
|
- incl %ebx
|
|
|
leaq native_irq_return_iret(%rip), %rcx
|
|
|
cmpq %rcx, RIP+8(%rsp)
|
|
|
je .Lerror_bad_iret
|
|
@@ -1303,28 +1301,20 @@ ENTRY(error_entry)
|
|
|
|
|
|
/*
|
|
|
* Pretend that the exception came from user mode: set up pt_regs
|
|
|
- * as if we faulted immediately after IRET and clear EBX so that
|
|
|
- * error_exit knows that we will be returning to user mode.
|
|
|
+ * as if we faulted immediately after IRET.
|
|
|
*/
|
|
|
mov %rsp, %rdi
|
|
|
call fixup_bad_iret
|
|
|
mov %rax, %rsp
|
|
|
- decl %ebx
|
|
|
jmp .Lerror_entry_from_usermode_after_swapgs
|
|
|
END(error_entry)
|
|
|
|
|
|
-
|
|
|
-/*
|
|
|
- * On entry, EBX is a "return to kernel mode" flag:
|
|
|
- * 1: already in kernel mode, don't need SWAPGS
|
|
|
- * 0: user gsbase is loaded, we need SWAPGS and standard preparation for return to usermode
|
|
|
- */
|
|
|
ENTRY(error_exit)
|
|
|
UNWIND_HINT_REGS
|
|
|
DISABLE_INTERRUPTS(CLBR_ANY)
|
|
|
TRACE_IRQS_OFF
|
|
|
- testl %ebx, %ebx
|
|
|
- jnz retint_kernel
|
|
|
+ testb $3, CS(%rsp)
|
|
|
+ jz retint_kernel
|
|
|
jmp retint_user
|
|
|
END(error_exit)
|
|
|
|