From: kfraser@localhost.localdomain Date: Wed, 8 Nov 2006 15:10:21 +0000 (+0000) Subject: [VMX] Check INTR_TYPE is NMI before doing physical NMI processing. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15567^2~53 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6b8fe25df94080288678e746ea1b0071626e3aad;p=xen.git [VMX] Check INTR_TYPE is NMI before doing physical NMI processing. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 84febc6b1a..cafa501316 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2112,17 +2112,19 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) * (1) We can get an exception (e.g. #PG) in the guest, or * (2) NMI */ - unsigned int vector; + unsigned int intr_info, vector; - if ( __vmread(VM_EXIT_INTR_INFO, &vector) || - !(vector & INTR_INFO_VALID_MASK) ) - domain_crash_synchronous(); - vector &= INTR_INFO_VECTOR_MASK; + if ( __vmread(VM_EXIT_INTR_INFO, &intr_info) || + !(intr_info & INTR_INFO_VALID_MASK) ) + __hvm_bug(regs); + + vector = intr_info & INTR_INFO_VECTOR_MASK; TRACE_VMEXIT(1, vector); perfc_incra(cause_vector, vector); - switch ( vector ) { + switch ( vector ) + { #ifdef XEN_DEBUGGER case TRAP_debug: { @@ -2198,7 +2200,10 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) break; } case TRAP_nmi: - do_nmi(regs); + if ( (intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI ) + do_nmi(regs); /* Real NMI, vector 2: normal processing. */ + else + vmx_reflect_exception(v); break; default: vmx_reflect_exception(v); diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h index 919acdc706..8c9f07a0b7 100644 --- a/xen/include/asm-x86/hvm/vmx/vmx.h +++ b/xen/include/asm-x86/hvm/vmx/vmx.h @@ -93,6 +93,7 @@ extern unsigned int cpu_rev; #define INTR_INFO_VALID_MASK 0x80000000 /* 31 */ #define INTR_TYPE_EXT_INTR (0 << 8) /* external interrupt */ +#define INTR_TYPE_NMI (2 << 8) /* NMI */ #define INTR_TYPE_HW_EXCEPTION (3 << 8) /* hardware exception */ #define INTR_TYPE_SW_EXCEPTION (6 << 8) /* software exception */