Changeset 92333 in vbox
- Timestamp:
- Nov 10, 2021 5:12:35 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllGstSlatEpt.cpp.h
r92313 r92333 99 99 Assert(!pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fVmxModeBasedExecuteEpt); 100 100 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); 101 103 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 102 104 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) 104 108 | fEffectiveEpt; 105 109 pWalk->Core.fEffective = fEffective; … … 122 126 { 123 127 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); 125 131 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); 128 136 pWalk->Core.fEffective = fEffective; 129 137 } … … 131 139 { 132 140 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); 133 143 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 134 144 uint8_t const fDirty = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY); 135 145 uint8_t const fMemType = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE); 136 146 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); 139 151 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); 141 153 pWalk->Core.fEffective = fEffective; 142 154 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; 144 156 pWalk->Core.fEffectiveUS = true; 145 157 pWalk->Core.fGigantPage = true; … … 165 177 166 178 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); 167 181 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 168 182 uint8_t const fDirty = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY); 169 183 uint8_t const fMemType = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE); 170 184 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); 174 189 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); 176 191 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; 178 194 pWalk->Core.fEffectiveUS = true; 179 195 pWalk->Core.fBigPage = true; … … 189 205 190 206 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); 191 209 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 192 210 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); 196 215 pWalk->Core.fEffective = fEffective; 197 216 … … 213 232 214 233 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); 215 236 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 216 237 uint8_t const fDirty = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY); 217 238 uint8_t const fMemType = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE); 218 239 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); 221 244 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); 223 246 pWalk->Core.fEffective = fEffective; 224 247 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; 226 249 pWalk->Core.fEffectiveUS = true; 227 250 pWalk->Core.fSucceeded = true;
Note:
See TracChangeset
for help on using the changeset viewer.