- Timestamp:
- Oct 26, 2021 9:34:40 AM (3 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
-
VMMAll/PGMAllGst.h (modified) (4 diffs)
-
include/PGMGstDefs.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r92062 r92072 253 253 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 254 254 uint32_t const fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK; 255 fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X, fExecute) 256 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW, fWrite) 257 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US, 1) 258 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A, fAccessed) 259 | fEffectiveEpt; 260 pWalk->Core.fEffective = fEffective; 255 pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X, fExecute) 256 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW, fWrite) 257 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US, 1) 258 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A, fAccessed) 259 | fEffectiveEpt; 261 260 } 262 261 else if (GST_IS_BIG_PDPE_VALID(pVCpu, Pdpte)) … … 270 269 uint16_t const fIgnorePat = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_IGNORE_PAT); 271 270 uint32_t const fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK; 272 fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X, fExecute) 273 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW, fWrite) 274 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US, 1) 275 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A, fAccessed) 276 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_D, fDirty) 277 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_MEMTYPE, 0) 278 | fEffectiveEpt; 279 fEffective |= RT_BF_MAKE(PGM_BF_PTWALK_EFF_MEMTYPE, fMemType) 280 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_IGNORE_PAT, fIgnorePat); 281 282 pWalk->Core.fEffective = fEffective; 283 pWalk->Core.fEffectiveRW = RT_BOOL(fEffective & X86_PTE_RW); 284 pWalk->Core.fEffectiveUS = RT_BOOL(fEffective & X86_PTE_US); 271 pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X, fExecute) 272 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW, fWrite) 273 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US, 1) 274 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A, fAccessed) 275 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_D, fDirty) 276 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_MEMTYPE, 0) 277 | fEffectiveEpt; 278 pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW); 279 pWalk->Core.fEffectiveUS = true; 285 280 pWalk->Core.fEffectiveNX = !fExecute; 286 pWalk->Core.fBigPage = false;287 281 pWalk->Core.fGigantPage = true; 288 282 pWalk->Core.fSucceeded = true; … … 310 304 * We're done. 311 305 */ 312 # if PGM_GST_TYPE == PGM_TYPE_32BIT 313 fEffective &= Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A); 306 # if PGM_GST_TYPE == PGM_TYPE_EPT 307 uint64_t const fEptAttrs = Pde.u & EPT_PDE2M_ATTR_MASK; 308 uint8_t const fExecute = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_EXECUTE); 309 uint8_t const fWrite = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE); 310 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 311 uint8_t const fDirty = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY); 312 uint16_t const fMemType = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE); 313 uint16_t const fIgnorePat = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_IGNORE_PAT); 314 uint32_t fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK; 315 pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X, fExecute) 316 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW, fWrite) 317 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US, 1) 318 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A, fAccessed) 319 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_D, fDirty) 320 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_MEMTYPE, 0) 321 | fEffectiveEpt; 322 pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW); 323 pWalk->Core.fEffectiveUS = true; 324 pWalk->Core.fEffectiveNX = !fExecute; 314 325 # else 315 fEffective &= ((uint32_t)Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A)) 316 | ((uint32_t)(Pde.u >> 63) ^ 1) /*NX */; 317 # endif 318 fEffective |= (uint32_t)Pde.u & (X86_PDE4M_D | X86_PDE4M_G); 319 fEffective |= (uint32_t)(Pde.u & X86_PDE4M_PAT) >> X86_PDE4M_PAT_SHIFT; 320 pWalk->Core.fEffective = fEffective; 321 322 pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW); 323 pWalk->Core.fEffectiveUS = !!(fEffective & X86_PTE_US); 324 # if PGM_GST_TYPE == PGM_TYPE_AMD64 || PGM_GST_TYPE == PGM_TYPE_PAE 325 pWalk->Core.fEffectiveNX = !(fEffective & 1) && GST_IS_NX_ACTIVE(pVCpu); 326 # else 327 pWalk->Core.fEffectiveNX = false; 326 # if PGM_GST_TYPE == PGM_TYPE_32BIT 327 fEffective &= Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A); 328 # else 329 fEffective &= ((uint32_t)Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A)) 330 | ((uint32_t)(Pde.u >> 63) ^ 1) /*NX */; 331 # endif 332 fEffective |= (uint32_t)Pde.u & (X86_PDE4M_D | X86_PDE4M_G); 333 fEffective |= (uint32_t)(Pde.u & X86_PDE4M_PAT) >> X86_PDE4M_PAT_SHIFT; 334 pWalk->Core.fEffective = fEffective; 335 336 pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW); 337 pWalk->Core.fEffectiveUS = !!(fEffective & X86_PTE_US); 338 # if PGM_GST_TYPE == PGM_TYPE_AMD64 || PGM_GST_TYPE == PGM_TYPE_PAE 339 pWalk->Core.fEffectiveNX = !(fEffective & 1) && GST_IS_NX_ACTIVE(pVCpu); 340 # else 341 pWalk->Core.fEffectiveNX = false; 342 # endif 328 343 # endif 329 344 pWalk->Core.fBigPage = true; … … 338 353 if (RT_UNLIKELY(!GST_IS_PDE_VALID(pVCpu, Pde))) 339 354 return PGM_GST_NAME(WalkReturnRsvdError)(pVCpu, pWalk, 2); 340 # if PGM_GST_TYPE == PGM_TYPE_32BIT 355 # if PGM_GST_TYPE == PGM_TYPE_EPT 356 uint64_t const fEptAttrs = Pde.u & EPT_PDE_ATTR_MASK; 357 uint8_t const fExecute = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_EXECUTE); 358 uint8_t const fWrite = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE); 359 uint8_t const fAccessed = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED); 360 uint32_t const fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK; 361 pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X, fExecute) 362 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW, fWrite) 363 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US, 1) 364 | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A, fAccessed) 365 | fEffectiveEpt; 366 # elif PGM_GST_TYPE == PGM_TYPE_32BIT 341 367 pWalk->Core.fEffective = fEffective &= Pde.u & (X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A); 342 368 # else -
trunk/src/VBox/VMM/include/PGMGstDefs.h
r92065 r92072 286 286 # define GST_IS_PTE_VALID(pVCpu, Pte) (!( (Pte).u & (pVCpu)->pgm.s.fGstAmd64MbzPteMask )) // TODO 287 287 # define GST_IS_PDE_VALID(pVCpu, Pde) (!( (Pde).u & (pVCpu)->pgm.s.fGstAmd64MbzPdeMask )) // TODO 288 # define GST_IS_BIG_PDE_VALID(pVCpu, Pde) (!( (Pde).u & (pVCpu)->pgm.s.fGst Amd64MbzBigPdeMask )) // TODO288 # define GST_IS_BIG_PDE_VALID(pVCpu, Pde) (!( (Pde).u & (pVCpu)->pgm.s.fGstEptMbzBigPdeMask )) 289 289 # define GST_IS_PDPE_VALID(pVCpu, Pdpe) (!( (Pdpe).u & (pVCpu)->pgm.s.fGstEptMbzPdpteMask )) 290 290 # define GST_IS_BIG_PDPE_VALID(pVCpu, Pdpe) (!( (Pdpe).u & (pVCpu)->pgm.s.fGstEptMbzBigPdpteMask ))
Note:
See TracChangeset
for help on using the changeset viewer.

