VirtualBox

Changeset 77610 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Mar 8, 2019 10:31:35 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
129238
Message:

VMM/EM, VMM/IEM: Nested VMX: bugref:9180 Implemented NMI-exiting, NMI-window and virtual-NMI support. Moved VMCPU_FF_VMX_APIC_WRITE to high-priority post mask. Fixed calling iemMemRollback in IEMExecDecodedXXX for VMX instructions. Clear all VMX force-flags in common VM-exit handler rather than in the specific handler, esp since multiple of them may be active at the time of VM-exit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r77575 r77610  
    16971697    }
    16981698
    1699 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    1700         /*
    1701          * VMX Nested-guest APIC-write pending (can cause VM-exits).
    1702          * Takes priority over even SMI and INIT signals.
    1703          * See Intel spec. 29.4.3.2 "APIC-Write Emulation".
    1704          */
    1705         if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE))
    1706         {
    1707             rc = VBOXSTRICTRC_VAL(IEMExecVmxVmexitApicWrite(pVCpu));
    1708             Assert(rc != VINF_VMX_INTERCEPT_NOT_ACTIVE);
    1709         }
    1710 #endif
    1711 
    17121699#ifdef VBOX_WITH_RAW_MODE
    17131700    if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_CSAM_PENDING_ACTION))
     
    21522139#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    21532140        /*
     2141         * VMX Nested-guest APIC-write pending (can cause VM-exits).
     2142         * Takes priority over even SMI and INIT signals.
     2143         * See Intel spec. 29.4.3.2 "APIC-Write Emulation".
     2144         */
     2145        if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE))
     2146        {
     2147            rc = VBOXSTRICTRC_VAL(IEMExecVmxVmexitApicWrite(pVCpu));
     2148            Assert(rc != VINF_VMX_INTERCEPT_NOT_ACTIVE);
     2149        }
     2150
     2151        /*
    21542152         * VMX Nested-guest monitor-trap flag (MTF) VM-exit.
    21552153         * Takes priority over "Traps on the previous instruction".
     
    21652163        /*
    21662164         * VMX Nested-guest preemption timer VM-exit.
    2167          * Takes priority over non-maskable interrupts (NMIs).
     2165         * Takes priority over NMI-window VM-exits.
    21682166         */
    21692167        if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_PREEMPT_TIMER))
     
    21722170            if (rc2 == VINF_VMX_INTERCEPT_NOT_ACTIVE)
    21732171                rc2 = VINF_SUCCESS;
     2172            UPDATE_RC();
     2173        }
     2174
     2175        /*
     2176         * VMX NMI-window VM-exit.
     2177         * Takes priority over non-maskable interrupts (NMIs).
     2178         */
     2179        if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_NMI_WINDOW))
     2180        {
     2181            rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexitNmiWindow(pVCpu));
     2182            Assert(rc2 != VINF_VMX_INTERCEPT_NOT_ACTIVE);
    21742183            UPDATE_RC();
    21752184        }
     
    23972406        /* check that we got them all  */
    23982407        AssertCompile(VM_FF_HIGH_PRIORITY_PRE_MASK == (VM_FF_TM_VIRTUAL_SYNC | VM_FF_DBGF | VM_FF_CHECK_VM_STATE | VM_FF_DEBUG_SUSPEND | VM_FF_PGM_NEED_HANDY_PAGES | VM_FF_PGM_NO_MEMORY | VM_FF_EMT_RENDEZVOUS));
    2399         AssertCompile(VMCPU_FF_HIGH_PRIORITY_PRE_MASK == (VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL | VMCPU_FF_INHIBIT_INTERRUPTS | VMCPU_FF_DBGF | VMCPU_FF_INTERRUPT_NESTED_GUEST | VMCPU_FF_VMX_MTF | VM_WHEN_RAW_MODE(VMCPU_FF_SELM_SYNC_TSS | VMCPU_FF_TRPM_SYNC_IDT | VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_LDT, 0)));
     2408        AssertCompile(VMCPU_FF_HIGH_PRIORITY_PRE_MASK == (VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL | VMCPU_FF_INHIBIT_INTERRUPTS | VMCPU_FF_DBGF | VMCPU_FF_INTERRUPT_NESTED_GUEST | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_PREEMPT_TIMER | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW | VM_WHEN_RAW_MODE(VMCPU_FF_SELM_SYNC_TSS | VMCPU_FF_TRPM_SYNC_IDT | VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_LDT, 0)));
    24002409    }
    24012410
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette