VirtualBox

Ignore:
Timestamp:
Nov 8, 2021 9:04:38 AM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 Defined a combined layout for regular page table and extended page table (Intel EPT) attributes. Adjusted EPT SLAT code accordingly.

File:
1 edited

Legend:

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

    r92186 r92257  
    149149# endif
    150150
    151     uint32_t fEffective = X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A | 1;
     151    uint64_t fEffective = X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A | 1;
    152152    {
    153153# if PGM_GST_TYPE == PGM_TYPE_AMD64
     
    170170        else return PGM_GST_NAME(WalkReturnRsvdError)(pVCpu, pWalk, 4);
    171171
    172         pWalk->Core.fEffective = fEffective = ((uint32_t)Pml4e.u & (X86_PML4E_RW | X86_PML4E_US | X86_PML4E_PWT | X86_PML4E_PCD | X86_PML4E_A))
    173                                             | ((uint32_t)(Pml4e.u >> 63) ^ 1) /*NX */;
     172        pWalk->Core.fEffective = fEffective = (Pml4e.u & (X86_PML4E_RW | X86_PML4E_US | X86_PML4E_PWT | X86_PML4E_PCD | X86_PML4E_A))
     173                                            | ((Pml4e.u >> 63) ^ 1) /*NX */;
    174174
    175175        /*
     
    204204
    205205# if PGM_GST_TYPE == PGM_TYPE_AMD64
    206         pWalk->Core.fEffective = fEffective &= ((uint32_t)Pdpe.u & (X86_PDPE_RW | X86_PDPE_US | X86_PDPE_PWT | X86_PDPE_PCD | X86_PDPE_A))
    207                                              | ((uint32_t)(Pdpe.u >> 63) ^ 1) /*NX */;
     206        pWalk->Core.fEffective = fEffective &= (Pdpe.u & (X86_PDPE_RW | X86_PDPE_US | X86_PDPE_PWT | X86_PDPE_PCD | X86_PDPE_A))
     207                                             | ((Pdpe.u >> 63) ^ 1) /*NX */;
    208208# else
    209209        pWalk->Core.fEffective = fEffective  = X86_PDPE_RW  | X86_PDPE_US | X86_PDPE_A
    210                                              | ((uint32_t)Pdpe.u & (X86_PDPE_PWT | X86_PDPE_PCD))
    211                                              | ((uint32_t)(Pdpe.u >> 63) ^ 1) /*NX */;
     210                                             | (Pdpe.u & (X86_PDPE_PWT | X86_PDPE_PCD))
     211                                             | ((Pdpe.u >> 63) ^ 1) /*NX */;
    212212# endif
    213213
     
    245245             */
    246246# if PGM_GST_TYPE == PGM_TYPE_32BIT
    247             fEffective &= Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A);
    248 # else
    249             fEffective &= ((uint32_t)Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A))
    250                         | ((uint32_t)(Pde.u >> 63) ^ 1) /*NX */;
    251 # endif
    252             fEffective |= (uint32_t)Pde.u & (X86_PDE4M_D | X86_PDE4M_G);
    253             fEffective |= (uint32_t)(Pde.u & X86_PDE4M_PAT) >> X86_PDE4M_PAT_SHIFT;
     247            fEffective &=  Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A);
     248# else
     249            fEffective &= (Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A))
     250                        | ((Pde.u >> 63) ^ 1) /*NX */;
     251# endif
     252            fEffective |= Pde.u & (X86_PDE4M_D | X86_PDE4M_G);
     253            fEffective |= (Pde.u & X86_PDE4M_PAT) >> X86_PDE4M_PAT_SHIFT;
    254254            pWalk->Core.fEffective = fEffective;
    255255
     
    277277            return PGM_GST_NAME(WalkReturnRsvdError)(pVCpu, pWalk, 2);
    278278# if PGM_GST_TYPE == PGM_TYPE_32BIT
    279         pWalk->Core.fEffective = fEffective &= Pde.u & (X86_PDE_RW  | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A);
    280 # else
    281         pWalk->Core.fEffective = fEffective &= ((uint32_t)Pde.u & (X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A))
    282                                              | ((uint32_t)(Pde.u >> 63) ^ 1) /*NX */;
     279        pWalk->Core.fEffective = fEffective &= Pde.u & (X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A);
     280# else
     281        pWalk->Core.fEffective = fEffective &= (Pde.u & (X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A))
     282                                             | ((Pde.u >> 63) ^ 1) /*NX */;
    283283# endif
    284284
     
    310310         */
    311311# if PGM_GST_TYPE == PGM_TYPE_32BIT
    312         fEffective &= Pte.u & (X86_PTE_RW  | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A);
    313 # else
    314         fEffective &= ((uint32_t)Pte.u & (X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A))
    315                    | ((uint32_t)(Pte.u >> 63) ^ 1) /*NX */;
    316 # endif
    317         fEffective |= (uint32_t)Pte.u & (X86_PTE_D | X86_PTE_PAT | X86_PTE_G);
     312        fEffective &= Pte.u & (X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A);
     313# else
     314        fEffective &= (Pte.u & (X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A))
     315                   |  ((Pte.u >> 63) ^ 1) /*NX */;
     316# endif
     317        fEffective |= Pte.u & (X86_PTE_D | X86_PTE_PAT | X86_PTE_G);
    318318        pWalk->Core.fEffective = fEffective;
    319319
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