VirtualBox

Changeset 95404 in vbox


Ignore:
Timestamp:
Jun 28, 2022 7:05:49 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152001
Message:

VMM: Nested VMX: bugref:10092 Shadow reserved bits that trigger EPT misconfigs while shadowing guest EPT tables.

File:
1 edited

Legend:

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

    r95248 r95404  
    16651665    uint64_t fMbzPageFrameMask = pVM->pgm.s.GCPhysInvAddrMask & UINT64_C(0x000ffffffffff000);
    16661666#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    1667     uint64_t const fEptVpidCap = CPUMGetGuestIa32VmxEptVpidCap(pVM->apCpusR3[0]);   /* should be identical for all VCPUs. */
     1667    uint64_t const fEptVpidCap = CPUMGetGuestIa32VmxEptVpidCap(pVM->apCpusR3[0]);   /* should be identical for all VCPUs */
    16681668    uint64_t const fGstEptMbzBigPdeMask   = EPT_PDE2M_MBZ_MASK
    16691669                                          | (RT_BF_GET(fEptVpidCap, VMX_BF_EPT_VPID_CAP_PDE_2M) ^ 1) << EPT_E_BIT_LEAF;
    16701670    uint64_t const fGstEptMbzBigPdpteMask = EPT_PDPTE1G_MBZ_MASK
    16711671                                          | (RT_BF_GET(fEptVpidCap, VMX_BF_EPT_VPID_CAP_PDPTE_1G) ^ 1) << EPT_E_BIT_LEAF;
     1672    uint64_t const GCPhysRsvdAddrMask     = pVM->pgm.s.GCPhysInvAddrMask & UINT64_C(0x000fffffffffffff); /* bits 63:52 ignored */
    16721673#endif
    16731674    for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
     
    17091710        pVCpu->pgm.s.fGstEptMbzBigPdpteMask   = fMbzPageFrameMask | fGstEptMbzBigPdpteMask;
    17101711        pVCpu->pgm.s.fGstEptMbzPml4eMask      = fMbzPageFrameMask | EPT_PML4E_MBZ_MASK;
    1711 
    1712         /* If any of the features (in the assert below) are enabled, we might have to shadow the relevant bits. */
     1712        pVCpu->pgm.s.fGstEptPresentMask       = EPT_PRESENT_MASK;
     1713
     1714        /* If any of the features (in the assert below) are enabled, we would have to shadow the relevant bits. */
    17131715        Assert(   !pVM->cpum.ro.GuestFeatures.fVmxModeBasedExecuteEpt
    17141716               && !pVM->cpum.ro.GuestFeatures.fVmxSppEpt
    1715                && !pVM->cpum.ro.GuestFeatures.fVmxEptXcptVe);
    1716         pVCpu->pgm.s.fGstEptPresentMask       = EPT_E_READ | EPT_E_WRITE | EPT_E_EXECUTE;
     1717               && !pVM->cpum.ro.GuestFeatures.fVmxEptXcptVe
     1718               && !(fEptVpidCap & MSR_IA32_VMX_EPT_VPID_CAP_ACCESS_DIRTY));
     1719        /* We need to shadow reserved bits as guest EPT tables can set them to trigger EPT misconfigs.  */
     1720        pVCpu->pgm.s.fGstEptShadowedPteMask   = GCPhysRsvdAddrMask | EPT_PRESENT_MASK | EPT_E_MEMTYPE_MASK;
     1721        pVCpu->pgm.s.fGstEptShadowedPdeMask   = GCPhysRsvdAddrMask | EPT_PRESENT_MASK | EPT_E_MEMTYPE_MASK | EPT_E_LEAF;
     1722        pVCpu->pgm.s.fGstEptShadowedPdpteMask = GCPhysRsvdAddrMask | EPT_PRESENT_MASK | EPT_E_MEMTYPE_MASK | EPT_E_LEAF;
     1723        pVCpu->pgm.s.fGstEptShadowedPml4eMask = GCPhysRsvdAddrMask | EPT_PRESENT_MASK | EPT_PML4E_MBZ_MASK;
    17171724#endif
    17181725    }
     
    18531860    pVCpu->pgm.s.GCPhysCR3 = NIL_RTGCPHYS;
    18541861    pVCpu->pgm.s.GCPhysNstGstCR3 = NIL_RTGCPHYS;
     1862    pVCpu->pgm.s.GCPhysPaeCR3 = NIL_RTGCPHYS;
    18551863
    18561864    int rc = PGMHCChangeMode(pVM, pVCpu, PGMMODE_REAL, false /* fForce */);
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