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

Commit 0d0efc07 authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar
Browse files

x86/head: Move the early NMI fixup into C



C is nicer than asm.

Tested-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: KVM list <kvm@vger.kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: xen-devel <Xen-devel@lists.xen.org>
Link: http://lkml.kernel.org/r/dd068269f8d59fe44e9e43a50d0efd67da65c2b5.1459605520.git.luto@kernel.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 7bbcdb1c
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -561,9 +561,6 @@ early_idt_handler_common:
	 */
	cld

	cmpl $2,(%esp)		# X86_TRAP_NMI
	je .Lis_nmi		# Ignore NMI

	cmpl $2,%ss:early_recursion_flag
	je hlt_loop
	incl %ss:early_recursion_flag
@@ -642,10 +639,6 @@ early_idt_handler_common:
hlt_loop:
	hlt
	jmp hlt_loop

.Lis_nmi:
	addl $8,%esp		/* drop vector number and error code */
	iret
ENDPROC(early_idt_handler_common)

/* This is the default interrupt "handler" :-) */
+0 −6
Original line number Diff line number Diff line
@@ -351,9 +351,6 @@ early_idt_handler_common:
	 */
	cld

	cmpl $2,(%rsp)		# X86_TRAP_NMI
	je .Lis_nmi		# Ignore NMI

	cmpl $2,early_recursion_flag(%rip)
	jz  1f
	incl early_recursion_flag(%rip)
@@ -422,9 +419,6 @@ early_idt_handler_common:
20:	/* Exception table entry found or page table generated */
	decl early_recursion_flag(%rip)
	jmp restore_regs_and_iret
.Lis_nmi:
	addq $16,%rsp		# drop vector number and error code
	INTERRUPT_RETURN
ENDPROC(early_idt_handler_common)

	__INITDATA
+5 −0
Original line number Diff line number Diff line
#include <linux/module.h>
#include <asm/uaccess.h>
#include <asm/traps.h>

typedef bool (*ex_handler_t)(const struct exception_table_entry *,
			    struct pt_regs *, int);
@@ -89,6 +90,10 @@ int __init early_fixup_exception(struct pt_regs *regs, int trapnr)
	unsigned long new_ip;
	ex_handler_t handler;

	/* Ignore early NMIs. */
	if (trapnr == X86_TRAP_NMI)
		return 1;

	e = search_exception_tables(regs->ip);
	if (!e)
		return 0;