implemented injection of MTF event. The MTF VMexec control is still not implemented yet
This commit is contained in:
parent
d0a545c010
commit
c48e516386
@ -1102,13 +1102,14 @@ public: // for now...
|
||||
#define BX_EVENT_SMI (1 << 1)
|
||||
#define BX_EVENT_INIT (1 << 2)
|
||||
#define BX_EVENT_CODE_BREAKPOINT_ASSIST (1 << 3)
|
||||
#define BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED (1 << 4)
|
||||
#define BX_EVENT_VMX_INTERRUPT_WINDOW_EXITING (1 << 5)
|
||||
#define BX_EVENT_VMX_NMI_WINDOW_EXITING (1 << 6)
|
||||
#define BX_EVENT_SVM_VIRQ_PENDING (1 << 7)
|
||||
#define BX_EVENT_PENDING_VMX_VIRTUAL_INTR (1 << 8)
|
||||
#define BX_EVENT_PENDING_INTR (1 << 9)
|
||||
#define BX_EVENT_PENDING_LAPIC_INTR (1 << 10)
|
||||
#define BX_EVENT_VMX_MONITOR_TRAP_FLAG (1 << 4)
|
||||
#define BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED (1 << 5)
|
||||
#define BX_EVENT_VMX_INTERRUPT_WINDOW_EXITING (1 << 6)
|
||||
#define BX_EVENT_VMX_NMI_WINDOW_EXITING (1 << 7)
|
||||
#define BX_EVENT_SVM_VIRQ_PENDING (1 << 8)
|
||||
#define BX_EVENT_PENDING_VMX_VIRTUAL_INTR (1 << 9)
|
||||
#define BX_EVENT_PENDING_INTR (1 << 10)
|
||||
#define BX_EVENT_PENDING_LAPIC_INTR (1 << 11)
|
||||
Bit32u pending_event;
|
||||
Bit32u event_mask;
|
||||
Bit32u async_event;
|
||||
|
@ -34,7 +34,10 @@ bx_bool BX_CPU_C::handleWaitForEvent(void)
|
||||
while (1)
|
||||
{
|
||||
if ((is_pending(BX_EVENT_PENDING_INTR | BX_EVENT_PENDING_LAPIC_INTR) && (BX_CPU_THIS_PTR get_IF() || BX_CPU_THIS_PTR activity_state == BX_ACTIVITY_STATE_MWAIT_IF)) ||
|
||||
is_pending(BX_EVENT_NMI | BX_EVENT_SMI | BX_EVENT_INIT | BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED | BX_EVENT_VMX_NMI_WINDOW_EXITING))
|
||||
is_pending(BX_EVENT_NMI | BX_EVENT_SMI | BX_EVENT_INIT |
|
||||
BX_EVENT_VMX_MONITOR_TRAP_FLAG |
|
||||
BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED |
|
||||
BX_EVENT_VMX_NMI_WINDOW_EXITING))
|
||||
{
|
||||
// interrupt ends the HALT condition
|
||||
#if BX_SUPPORT_MONITOR_MWAIT
|
||||
@ -214,6 +217,10 @@ bx_bool BX_CPU_C::handleAsyncEvent(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
if (is_unmasked_event_pending(BX_EVENT_VMX_MONITOR_TRAP_FLAG)) {
|
||||
VMexit(VMX_VMEXIT_MONITOR_TRAP_FLAG, 0);
|
||||
}
|
||||
|
||||
// Priority 4: Traps on Previous Instruction
|
||||
// Breakpoints
|
||||
// Debug Trap Exceptions (TF flag set or data/IO breakpoint)
|
||||
@ -241,7 +248,6 @@ bx_bool BX_CPU_C::handleAsyncEvent(void)
|
||||
}
|
||||
#if BX_SUPPORT_VMX >= 2
|
||||
else if (is_unmasked_event_pending(BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED)) {
|
||||
clear_event(BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED);
|
||||
VMexit(VMX_VMEXIT_VMX_PREEMPTION_TIMER_EXPIRED, 0);
|
||||
}
|
||||
#endif
|
||||
|
@ -726,6 +726,15 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
|
||||
}
|
||||
break;
|
||||
|
||||
case 7: /* MTF */
|
||||
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_MONITOR_TRAP_FLAG)) {
|
||||
if (vector != 0) {
|
||||
BX_ERROR(("VMFAIL: VMENTRY bad MTF injection with vector=%d", vector));
|
||||
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
BX_ERROR(("VMFAIL: VMENTRY bad injected event type %d", event_type));
|
||||
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
|
||||
@ -1739,6 +1748,13 @@ void BX_CPU_C::VMenterInjectEvents(void)
|
||||
unsigned push_error = vm->vmentry_interr_info & (1 << 11);
|
||||
unsigned error_code = push_error ? vm->vmentry_excep_err_code : 0;
|
||||
|
||||
if (type == 7) {
|
||||
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_MONITOR_TRAP_FLAG)) {
|
||||
signal_event(BX_EVENT_VMX_MONITOR_TRAP_FLAG);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bx_bool is_INT = 0;
|
||||
switch(type) {
|
||||
case BX_EXTERNAL_INTERRUPT:
|
||||
@ -2218,7 +2234,8 @@ void BX_CPU_C::VMexit(Bit32u reason, Bit64u qualification)
|
||||
BX_CPU_THIS_PTR in_vmx_guest = 0;
|
||||
|
||||
// entering VMX root mode: clear possibly pending guest VMX events
|
||||
clear_event(BX_EVENT_VMX_INTERRUPT_WINDOW_EXITING |
|
||||
clear_event(BX_EVENT_VMX_MONITOR_TRAP_FLAG |
|
||||
BX_EVENT_VMX_INTERRUPT_WINDOW_EXITING |
|
||||
BX_EVENT_VMX_PREEMPTION_TIMER_EXPIRED |
|
||||
BX_EVENT_VMX_NMI_WINDOW_EXITING);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user