HVM_DELIVER_NO_ERROR_CODE);
}
+/*
+ * Generate a virtual event in the guest.
+ * NOTES:
+ * - INT 3 (CC) and INTO (CE) are X86_EVENTTYPE_SW_EXCEPTION;
+ * - INT nn (CD nn) is X86_EVENTTYPE_SW_INTERRUPT;
+ * - #DB is X86_EVENTTYPE_HW_EXCEPTION, except when generated by
+ * opcode 0xf1 (which is X86_EVENTTYPE_PRI_SW_EXCEPTION)
+ */
static void vmx_inject_trap(struct hvm_trap *trap)
{
unsigned long intr_info;
_trap.error_code = 0;
}
+ if ( _trap.type >= X86_EVENTTYPE_SW_INTERRUPT )
+ __vmwrite(VM_ENTRY_INSTRUCTION_LEN, _trap.inslen);
+
if ( nestedhvm_vcpu_in_guestmode(curr) &&
nvmx_intercepts_exception(curr, _trap.vector, _trap.error_code) )
{
struct hvm_trap trap = {
.vector = TRAP_int3,
.type = X86_EVENTTYPE_SW_EXCEPTION,
- .error_code = HVM_DELIVER_NO_ERROR_CODE
+ .error_code = HVM_DELIVER_NO_ERROR_CODE,
+ .inslen = __vmread(VM_EXIT_INSTRUCTION_LEN)
};
hvm_inject_trap(&trap);
break;
unsigned int type; /* X86_EVENTTYPE_* */
int error_code; /* HVM_DELIVER_NO_ERROR_CODE if n/a */
unsigned long cr2; /* Only for TRAP_page_fault h/w exception */
+ int inslen; /* Instruction length */
};
/*
#define X86_EVENTTYPE_NMI 2 /* NMI */
#define X86_EVENTTYPE_HW_EXCEPTION 3 /* hardware exception */
#define X86_EVENTTYPE_SW_INTERRUPT 4 /* software interrupt */
+#define X86_EVENTTYPE_PRI_SW_EXCEPTION 5 /* privileged software exception */
#define X86_EVENTTYPE_SW_EXCEPTION 6 /* software exception */
int hvm_event_needs_reinjection(uint8_t type, uint8_t vector);