VirtualBox

Changeset 91427 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 28, 2021 8:54:40 AM (3 years ago)
Author:
vboxsync
Message:

VMM/IEM: Nested VMX: bugref:10092 Save PAE PDPTEs from CPU context to VMCS on VM-exit when EPT is enabled.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r91423 r91427  
    15251525        pVmcs->u32PreemptTimer = iemVmxCalcPreemptTimer(pVCpu);
    15261526
    1527     /* PDPTEs. */
    1528     /* We don't support EPT yet. */
    1529     Assert(!(pVmcs->u32ProcCtls2 & VMX_PROC_CTLS2_EPT));
    1530     pVmcs->u64GuestPdpte0.u = 0;
    1531     pVmcs->u64GuestPdpte1.u = 0;
    1532     pVmcs->u64GuestPdpte2.u = 0;
    1533     pVmcs->u64GuestPdpte3.u = 0;
     1527    /*
     1528     * PAE PDPTEs.
     1529     *
     1530     * If EPT is enabled and PAE paging was used at the time of the VM-exit,
     1531     * the PDPTEs are saved from the VMCS. Otherwise they're undefined but
     1532     * we zero them for consistency.
     1533     */
     1534    if (    (pVmcs->u32ProcCtls2 & VMX_PROC_CTLS2_EPT)
     1535        && !(pVmcs->u32EntryCtls & VMX_ENTRY_CTLS_IA32E_MODE_GUEST)
     1536        &&  (pVCpu->cpum.GstCtx.cr4 & X86_CR4_PAE)
     1537        &&  (pVCpu->cpum.GstCtx.cr0 & X86_CR0_PG))
     1538    {
     1539        pVmcs->u64GuestPdpte0.u = pVCpu->cpum.GstCtx.aPaePdpes[0].u;
     1540        pVmcs->u64GuestPdpte1.u = pVCpu->cpum.GstCtx.aPaePdpes[1].u;
     1541        pVmcs->u64GuestPdpte2.u = pVCpu->cpum.GstCtx.aPaePdpes[2].u;
     1542        pVmcs->u64GuestPdpte3.u = pVCpu->cpum.GstCtx.aPaePdpes[3].u;
     1543    }
     1544    else
     1545    {
     1546        pVmcs->u64GuestPdpte0.u = 0;
     1547        pVmcs->u64GuestPdpte1.u = 0;
     1548        pVmcs->u64GuestPdpte2.u = 0;
     1549        pVmcs->u64GuestPdpte3.u = 0;
     1550    }
    15341551}
    15351552
     
    56385655    const char * const pszFailure = "VM-exit";
    56395656
    5640     bool const fGstInLongMode = RT_BOOL(pVmcs->u32EntryCtls & VMX_ENTRY_CTLS_IA32E_MODE_GUEST);
    5641     if (   !fGstInLongMode
    5642         && (pVmcs->u64GuestCr4.u & X86_CR4_PAE)
    5643         && (pVmcs->u64GuestCr0.u & X86_CR0_PG))
     5657    if (   !(pVmcs->u32EntryCtls & VMX_ENTRY_CTLS_IA32E_MODE_GUEST)
     5658        &&  (pVmcs->u64GuestCr4.u & X86_CR4_PAE)
     5659        &&  (pVmcs->u64GuestCr0.u & X86_CR0_PG))
    56445660    {
    56455661        /* Get the PDPTEs. */
Note: See TracChangeset for help on using the changeset viewer.

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