VirtualBox

Changeset 92333 in vbox


Ignore:
Timestamp:
Nov 10, 2021 5:12:35 PM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 Make EPT SLAT walk code copy EPT_R, EPT_W bits to R, W bit positions.

File:
1 edited

Legend:

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

    r92313 r92333  
    9999        Assert(!pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fVmxModeBasedExecuteEpt);
    100100        uint64_t const fEptAttrs     = Pml4e.u & EPT_PML4E_ATTR_MASK;
     101        uint8_t const fRead          = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_READ);
     102        uint8_t const fWrite         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
    101103        uint8_t const fAccessed      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    102104        uint64_t const fEffectiveEpt = (fEptAttrs << PGM_PTATTRS_EPT_SHIFT) & PGM_PTATTRS_EPT_MASK;
    103         fEffective = RT_BF_MAKE(PGM_PTATTRS_A, fAccessed)
     105        fEffective = RT_BF_MAKE(PGM_PTATTRS_R, fRead)
     106                   | RT_BF_MAKE(PGM_PTATTRS_W, fWrite)
     107                   | RT_BF_MAKE(PGM_PTATTRS_A, fAccessed)
    104108                   | fEffectiveEpt;
    105109        pWalk->Core.fEffective = fEffective;
     
    122126        {
    123127            uint64_t const fEptAttrs     = Pdpte.u & EPT_PDPTE_ATTR_MASK;
    124             uint8_t const  fAccessed     = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
     128            uint8_t const fRead          = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_READ);
     129            uint8_t const fWrite         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
     130            uint8_t const fAccessed      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    125131            uint64_t const fEffectiveEpt = (fEptAttrs << PGM_PTATTRS_EPT_SHIFT) & PGM_PTATTRS_EPT_MASK;
    126             fEffective &= RT_BF_MAKE(PGM_PTATTRS_A, fAccessed)
    127                        |  (fEffectiveEpt & fCumulativeEpt);
     132            fEffective &= RT_BF_MAKE(PGM_PTATTRS_R, fRead)
     133                        | RT_BF_MAKE(PGM_PTATTRS_W, fWrite)
     134                        | RT_BF_MAKE(PGM_PTATTRS_A, fAccessed)
     135                        | (fEffectiveEpt & fCumulativeEpt);
    128136            pWalk->Core.fEffective = fEffective;
    129137        }
     
    131139        {
    132140            uint64_t const fEptAttrs     = Pdpte.u & EPT_PDPTE1G_ATTR_MASK;
     141            uint8_t const fRead          = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_READ);
     142            uint8_t const fWrite         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
    133143            uint8_t const fAccessed      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    134144            uint8_t const fDirty         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY);
    135145            uint8_t const fMemType       = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE);
    136146            uint64_t const fEffectiveEpt = (fEptAttrs << PGM_PTATTRS_EPT_SHIFT) & PGM_PTATTRS_EPT_MASK;
    137             fEffective &= RT_BF_MAKE(PGM_PTATTRS_A,           fAccessed)
    138                        |  (fEffectiveEpt & fCumulativeEpt);
     147            fEffective &= RT_BF_MAKE(PGM_PTATTRS_R,           fRead)
     148                        | RT_BF_MAKE(PGM_PTATTRS_W,           fWrite)
     149                        | RT_BF_MAKE(PGM_PTATTRS_A,           fAccessed)
     150                        | (fEffectiveEpt & fCumulativeEpt);
    139151            fEffective |= RT_BF_MAKE(PGM_PTATTRS_D,           fDirty)
    140                        | RT_BF_MAKE(PGM_PTATTRS_EPT_MEMTYPE, fMemType);
     152                        | RT_BF_MAKE(PGM_PTATTRS_EPT_MEMTYPE, fMemType);
    141153            pWalk->Core.fEffective = fEffective;
    142154
    143             pWalk->Core.fEffectiveRW = !!(fEffective & PGM_PTATTRS_RW_MASK);    /** @todo RW isn't copied from EPT R, W. This will break callers who use RW for EPT attributes. */
     155            pWalk->Core.fEffectiveRW = !!fWrite;
    144156            pWalk->Core.fEffectiveUS = true;
    145157            pWalk->Core.fGigantPage  = true;
     
    165177
    166178            uint64_t const fEptAttrs     = Pde.u & EPT_PDE2M_ATTR_MASK;
     179            uint8_t const fRead          = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_READ);
     180            uint8_t const fWrite         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
    167181            uint8_t const fAccessed      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    168182            uint8_t const fDirty         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY);
    169183            uint8_t const fMemType       = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE);
    170184            uint64_t const fEffectiveEpt = (fEptAttrs << PGM_PTATTRS_EPT_SHIFT) & PGM_PTATTRS_EPT_MASK;
    171 
    172             fEffective &= RT_BF_MAKE(PGM_PTATTRS_A,           fAccessed)
    173                        |  (fEffectiveEpt & fCumulativeEpt);
     185            fEffective &= RT_BF_MAKE(PGM_PTATTRS_R,           fRead)
     186                        | RT_BF_MAKE(PGM_PTATTRS_W,           fWrite)
     187                        | RT_BF_MAKE(PGM_PTATTRS_A,           fAccessed)
     188                        | (fEffectiveEpt & fCumulativeEpt);
    174189            fEffective |= RT_BF_MAKE(PGM_PTATTRS_D,           fDirty)
    175                        | RT_BF_MAKE(PGM_PTATTRS_EPT_MEMTYPE, fMemType);
     190                        | RT_BF_MAKE(PGM_PTATTRS_EPT_MEMTYPE, fMemType);
    176191            pWalk->Core.fEffective = fEffective;
    177             pWalk->Core.fEffectiveRW = !!(fEffective & PGM_PTATTRS_RW_MASK); /** @todo RW isn't copied from EPT R, W. This will break callers who use RW for EPT attributes. */
     192
     193            pWalk->Core.fEffectiveRW = !!fWrite;
    178194            pWalk->Core.fEffectiveUS = true;
    179195            pWalk->Core.fBigPage     = true;
     
    189205
    190206        uint64_t const fEptAttrs     = Pde.u & EPT_PDE_ATTR_MASK;
     207        uint8_t const fRead          = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_READ);
     208        uint8_t const fWrite         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
    191209        uint8_t const fAccessed      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    192210        uint64_t const fEffectiveEpt = (fEptAttrs << PGM_PTATTRS_EPT_SHIFT) & PGM_PTATTRS_EPT_MASK;
    193 
    194         fEffective &= RT_BF_MAKE(PGM_PTATTRS_A,  fAccessed)
    195                    |  (fEffectiveEpt & fCumulativeEpt);
     211        fEffective &= RT_BF_MAKE(PGM_PTATTRS_R, fRead)
     212                    | RT_BF_MAKE(PGM_PTATTRS_W, fWrite)
     213                    | RT_BF_MAKE(PGM_PTATTRS_A, fAccessed)
     214                    | (fEffectiveEpt & fCumulativeEpt);
    196215        pWalk->Core.fEffective = fEffective;
    197216
     
    213232
    214233        uint64_t const fEptAttrs     = Pte.u & EPT_PTE_ATTR_MASK;
     234        uint8_t const fRead          = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_READ);
     235        uint8_t const fWrite         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
    215236        uint8_t const fAccessed      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    216237        uint8_t const fDirty         = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY);
    217238        uint8_t const fMemType       = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE);
    218239        uint64_t const fEffectiveEpt = (fEptAttrs << PGM_PTATTRS_EPT_SHIFT) & PGM_PTATTRS_EPT_MASK;
    219         fEffective &= RT_BF_MAKE(PGM_PTATTRS_A,           fAccessed)
    220                    |  (fEffectiveEpt & fCumulativeEpt);
     240        fEffective &= RT_BF_MAKE(PGM_PTATTRS_R,           fRead)
     241                    | RT_BF_MAKE(PGM_PTATTRS_W,           fWrite)
     242                    | RT_BF_MAKE(PGM_PTATTRS_A,           fAccessed)
     243                    | (fEffectiveEpt & fCumulativeEpt);
    221244        fEffective |= RT_BF_MAKE(PGM_PTATTRS_D,           fDirty)
    222                    | RT_BF_MAKE(PGM_PTATTRS_EPT_MEMTYPE, fMemType);
     245                    | RT_BF_MAKE(PGM_PTATTRS_EPT_MEMTYPE, fMemType);
    223246        pWalk->Core.fEffective = fEffective;
    224247
    225         pWalk->Core.fEffectiveRW = !!(fEffective & PGM_PTATTRS_RW_MASK); /** @todo RW isn't copied from EPT R, W. This will break callers who use RW for EPT attributes. */
     248        pWalk->Core.fEffectiveRW = !!fWrite;
    226249        pWalk->Core.fEffectiveUS = true;
    227250        pWalk->Core.fSucceeded   = true;
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