* (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:
{
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);
#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 */