VirtualBox

Changeset 92076 in vbox


Ignore:
Timestamp:
Oct 26, 2021 11:30:00 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
147889
Message:

VMM: Nested VMX: bugref:10092 EPT walking bits - PTE.

File:
1 edited

Legend:

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

    r92072 r92076  
    266266            uint8_t const fAccessed   = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    267267            uint8_t const fDirty      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY);
    268             uint16_t const fMemType   = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_MEMTYPE);
    269             uint16_t const fIgnorePat = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_IGNORE_PAT);
    270268            uint32_t const fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK;
    271269            pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X,       fExecute)
     
    310308            uint8_t const fAccessed   = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
    311309            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);
    314310            uint32_t fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK;
    315311            pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X,       fExecute)
     
    393389         * We're done.
    394390         */
    395 # if PGM_GST_TYPE == PGM_TYPE_32BIT
     391# if PGM_GST_TYPE == PGM_TYPE_EPT
     392        uint64_t const fEptAttrs  = Pte.u & EPT_PTE_ATTR_MASK;
     393        uint8_t const fExecute    = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_EXECUTE);
     394        uint8_t const fWrite      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_WRITE);
     395        uint8_t const fAccessed   = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_ACCESSED);
     396        uint8_t const fDirty      = RT_BF_GET(fEptAttrs, VMX_BF_EPT_PT_DIRTY);
     397        uint32_t fEffectiveEpt = ((uint32_t)fEptAttrs << PGMPTWALK_EFF_EPT_ATTR_SHIFT) & PGMPTWALK_EFF_EPT_ATTR_MASK;
     398        pWalk->Core.fEffective = fEffective &= RT_BF_MAKE(PGM_BF_PTWALK_EFF_X,       fExecute)
     399                                             | RT_BF_MAKE(PGM_BF_PTWALK_EFF_RW,      fWrite)
     400                                             | RT_BF_MAKE(PGM_BF_PTWALK_EFF_US,      1)
     401                                             | RT_BF_MAKE(PGM_BF_PTWALK_EFF_A,       fAccessed)
     402                                             | RT_BF_MAKE(PGM_BF_PTWALK_EFF_D,       fDirty)
     403                                             | RT_BF_MAKE(PGM_BF_PTWALK_EFF_MEMTYPE, 0)
     404                                             | fEffectiveEpt;
     405        pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW);
     406        pWalk->Core.fEffectiveUS = true;
     407        pWalk->Core.fEffectiveNX = !fExecute;
     408# else
     409#  if PGM_GST_TYPE == PGM_TYPE_32BIT
    396410        fEffective &= Pte.u & (X86_PTE_RW  | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A);
    397 # else
     411#  else
    398412        fEffective &= ((uint32_t)Pte.u & (X86_PTE_RW  | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A))
    399413                    | ((uint32_t)(Pte.u >> 63) ^ 1) /*NX */;
    400 # endif
     414#  endif
    401415        fEffective |= (uint32_t)Pte.u & (X86_PTE_D | X86_PTE_PAT | X86_PTE_G);
    402416        pWalk->Core.fEffective = fEffective;
    403417
    404418        pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW);
     419#  if PGM_GST_TYPE == PGM_TYPE_EPT
     420        pWalk->Core.fEffectiveUS = true;
     421#  else
    405422        pWalk->Core.fEffectiveUS = !!(fEffective & X86_PTE_US);
    406 # if PGM_GST_TYPE == PGM_TYPE_AMD64 || PGM_GST_TYPE == PGM_TYPE_PAE
     423#  endif
     424#  if PGM_GST_TYPE == PGM_TYPE_AMD64 || PGM_GST_TYPE == PGM_TYPE_PAE
    407425        pWalk->Core.fEffectiveNX = !(fEffective & 1) && GST_IS_NX_ACTIVE(pVCpu);
    408 # else
     426#  else
    409427        pWalk->Core.fEffectiveNX = false;
     428#  endif
    410429# endif
    411430        pWalk->Core.fSucceeded   = true;
    412 
    413         pWalk->Core.GCPhys       = GST_GET_PDE_GCPHYS(Pte)
     431        pWalk->Core.GCPhys       = GST_GET_PDE_GCPHYS(Pte)      /** @todo Shouldn't this be PTE_GCPHYS? */
    414432                                 | (GCPtr & PAGE_OFFSET_MASK);
    415433        return VINF_SUCCESS;
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