|
@@ -875,12 +875,8 @@ ENTRY(\sym)
|
|
|
pushq $-1 /* ORIG_RAX: no syscall to restart */
|
|
|
.endif
|
|
|
|
|
|
- /* Save all registers in pt_regs */
|
|
|
- PUSH_AND_CLEAR_REGS
|
|
|
- ENCODE_FRAME_POINTER
|
|
|
-
|
|
|
.if \paranoid < 2
|
|
|
- testb $3, CS(%rsp) /* If coming from userspace, switch stacks */
|
|
|
+ testb $3, CS-ORIG_RAX(%rsp) /* If coming from userspace, switch stacks */
|
|
|
jnz .Lfrom_usermode_switch_stack_\@
|
|
|
.endif
|
|
|
|
|
@@ -1130,13 +1126,15 @@ idtentry machine_check do_mce has_error_code=0 paranoid=1
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
|
- * Switch gs if needed.
|
|
|
+ * Save all registers in pt_regs, and switch gs if needed.
|
|
|
* Use slow, but surefire "are we in kernel?" check.
|
|
|
* Return: ebx=0: need swapgs on exit, ebx=1: otherwise
|
|
|
*/
|
|
|
ENTRY(paranoid_entry)
|
|
|
UNWIND_HINT_FUNC
|
|
|
cld
|
|
|
+ PUSH_AND_CLEAR_REGS save_ret=1
|
|
|
+ ENCODE_FRAME_POINTER 8
|
|
|
movl $1, %ebx
|
|
|
movl $MSR_GS_BASE, %ecx
|
|
|
rdmsr
|
|
@@ -1181,12 +1179,14 @@ ENTRY(paranoid_exit)
|
|
|
END(paranoid_exit)
|
|
|
|
|
|
/*
|
|
|
- * Switch gs if needed.
|
|
|
+ * 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_REGS offset=8
|
|
|
+ UNWIND_HINT_FUNC
|
|
|
cld
|
|
|
+ PUSH_AND_CLEAR_REGS save_ret=1
|
|
|
+ ENCODE_FRAME_POINTER 8
|
|
|
testb $3, CS+8(%rsp)
|
|
|
jz .Lerror_kernelspace
|
|
|
|
|
@@ -1577,8 +1577,6 @@ end_repeat_nmi:
|
|
|
* frame to point back to repeat_nmi.
|
|
|
*/
|
|
|
pushq $-1 /* ORIG_RAX: no syscall to restart */
|
|
|
- PUSH_AND_CLEAR_REGS
|
|
|
- ENCODE_FRAME_POINTER
|
|
|
|
|
|
/*
|
|
|
* Use paranoid_entry to handle SWAPGS, but no need to use paranoid_exit
|