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

Commit 5fa10196 authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

x86: Ignore NMIs that come in during early boot



Don Zickus reports:

A customer generated an external NMI using their iLO to test kdump
worked.  Unfortunately, the machine hung.  Disabling the nmi_watchdog
made things work.

I speculated the external NMI fired, caused the machine to panic (as
expected) and the perf NMI from the watchdog came in and was latched.
My guess was this somehow caused the hang.

   ----

It appears that the latched NMI stays latched until the early page
table generation on 64 bits, which causes exceptions to happen which
end in IRET, which re-enable NMI.  Therefore, ignore NMIs that come in
during early execution, until we have proper exception handling.

Reported-and-tested-by: default avatarDon Zickus <dzickus@redhat.com>
Link: http://lkml.kernel.org/r/1394221143-29713-1-git-send-email-dzickus@redhat.com


Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
Cc: <stable@vger.kernel.org> # v3.5+, older with some backport effort
parent d4078e23
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -544,6 +544,10 @@ ENDPROC(early_idt_handlers)
	/* This is global to keep gas from relaxing the jumps */
ENTRY(early_idt_handler)
	cld

	cmpl $X86_TRAP_NMI,(%esp)
	je is_nmi		# Ignore NMI

	cmpl $2,%ss:early_recursion_flag
	je hlt_loop
	incl %ss:early_recursion_flag
@@ -594,8 +598,9 @@ ex_entry:
	pop %edx
	pop %ecx
	pop %eax
	addl $8,%esp		/* drop vector number and error code */
	decl %ss:early_recursion_flag
is_nmi:
	addl $8,%esp		/* drop vector number and error code */
	iret
ENDPROC(early_idt_handler)

+5 −1
Original line number Diff line number Diff line
@@ -343,6 +343,9 @@ early_idt_handlers:
ENTRY(early_idt_handler)
	cld

	cmpl $X86_TRAP_NMI,(%rsp)
	je is_nmi		# Ignore NMI

	cmpl $2,early_recursion_flag(%rip)
	jz  1f
	incl early_recursion_flag(%rip)
@@ -405,8 +408,9 @@ ENTRY(early_idt_handler)
	popq %rdx
	popq %rcx
	popq %rax
	addq $16,%rsp		# drop vector number and error code
	decl early_recursion_flag(%rip)
is_nmi:
	addq $16,%rsp		# drop vector number and error code
	INTERRUPT_RETURN
ENDPROC(early_idt_handler)