implemented injection of MTF event. The MTF VMexec control is still not implemented yet

This commit is contained in:
Stanislav Shwartsman 2012-10-05 20:48:22 +00:00
parent d0a545c010
commit c48e516386
3 changed files with 34 additions and 10 deletions

@ -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);