VirtualBox

Changeset 92072 in vbox for trunk


Ignore:
Timestamp:
Oct 26, 2021 9:34:40 AM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 EPT walking bits - PDE and 2M page.

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

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

    r92062 r92072  
    253253            uint8_t const fAccessed  = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    254254            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;
    261260        }
    262261        else if (GST_IS_BIG_PDPE_VALID(pVCpu, Pdpte))
     
    270269            uint16_t const fIgnorePat = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_IGNORE_PAT);
    271270            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;
    285280            pWalk->Core.fEffectiveNX = !fExecute;
    286             pWalk->Core.fBigPage     = false;
    287281            pWalk->Core.fGigantPage  = true;
    288282            pWalk->Core.fSucceeded   = true;
     
    310304             * We're done.
    311305             */
    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;
    314325# 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
    328343# endif
    329344            pWalk->Core.fBigPage     = true;
     
    338353        if (RT_UNLIKELY(!GST_IS_PDE_VALID(pVCpu, Pde)))
    339354            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
    341367        pWalk->Core.fEffective = fEffective &= Pde.u & (X86_PDE_RW  | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A);
    342368# else
  • trunk/src/VBox/VMM/include/PGMGstDefs.h

    r92065 r92072  
    286286# define GST_IS_PTE_VALID(pVCpu, Pte)           (!( (Pte).u   & (pVCpu)->pgm.s.fGstAmd64MbzPteMask ))                            // TODO
    287287# 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.fGstAmd64MbzBigPdeMask ))                         // TODO
     288# define GST_IS_BIG_PDE_VALID(pVCpu, Pde)       (!( (Pde).u   & (pVCpu)->pgm.s.fGstEptMbzBigPdeMask ))
    289289# define GST_IS_PDPE_VALID(pVCpu, Pdpe)         (!( (Pdpe).u  & (pVCpu)->pgm.s.fGstEptMbzPdpteMask ))
    290290# define GST_IS_BIG_PDPE_VALID(pVCpu, Pdpe)     (!( (Pdpe).u  & (pVCpu)->pgm.s.fGstEptMbzBigPdpteMask ))
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