|
@@ -1489,46 +1489,14 @@ ENTRY(nmi)
|
|
movq %rsp,%rdi
|
|
movq %rsp,%rdi
|
|
movq $-1,%rsi
|
|
movq $-1,%rsi
|
|
call do_nmi
|
|
call do_nmi
|
|
-#ifdef CONFIG_TRACE_IRQFLAGS
|
|
|
|
- /* paranoidexit; without TRACE_IRQS_OFF */
|
|
|
|
- /* ebx: no swapgs flag */
|
|
|
|
- DISABLE_INTERRUPTS(CLBR_NONE)
|
|
|
|
testl %ebx,%ebx /* swapgs needed? */
|
|
testl %ebx,%ebx /* swapgs needed? */
|
|
jnz nmi_restore
|
|
jnz nmi_restore
|
|
- testl $3,CS(%rsp)
|
|
|
|
- jnz nmi_userspace
|
|
|
|
nmi_swapgs:
|
|
nmi_swapgs:
|
|
SWAPGS_UNSAFE_STACK
|
|
SWAPGS_UNSAFE_STACK
|
|
nmi_restore:
|
|
nmi_restore:
|
|
RESTORE_ALL 8
|
|
RESTORE_ALL 8
|
|
jmp irq_return
|
|
jmp irq_return
|
|
-nmi_userspace:
|
|
|
|
- GET_THREAD_INFO(%rcx)
|
|
|
|
- movl TI_flags(%rcx),%ebx
|
|
|
|
- andl $_TIF_WORK_MASK,%ebx
|
|
|
|
- jz nmi_swapgs
|
|
|
|
- movq %rsp,%rdi /* &pt_regs */
|
|
|
|
- call sync_regs
|
|
|
|
- movq %rax,%rsp /* switch stack for scheduling */
|
|
|
|
- testl $_TIF_NEED_RESCHED,%ebx
|
|
|
|
- jnz nmi_schedule
|
|
|
|
- movl %ebx,%edx /* arg3: thread flags */
|
|
|
|
- ENABLE_INTERRUPTS(CLBR_NONE)
|
|
|
|
- xorl %esi,%esi /* arg2: oldset */
|
|
|
|
- movq %rsp,%rdi /* arg1: &pt_regs */
|
|
|
|
- call do_notify_resume
|
|
|
|
- DISABLE_INTERRUPTS(CLBR_NONE)
|
|
|
|
- jmp nmi_userspace
|
|
|
|
-nmi_schedule:
|
|
|
|
- ENABLE_INTERRUPTS(CLBR_ANY)
|
|
|
|
- call schedule
|
|
|
|
- DISABLE_INTERRUPTS(CLBR_ANY)
|
|
|
|
- jmp nmi_userspace
|
|
|
|
CFI_ENDPROC
|
|
CFI_ENDPROC
|
|
-#else
|
|
|
|
- jmp paranoid_exit
|
|
|
|
- CFI_ENDPROC
|
|
|
|
-#endif
|
|
|
|
END(nmi)
|
|
END(nmi)
|
|
|
|
|
|
ENTRY(ignore_sysret)
|
|
ENTRY(ignore_sysret)
|