VirtualBox

Changeset 92331 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Nov 10, 2021 4:55:00 PM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 Have R and W as separate bits in PGMPTATTRS now that bit 0 is freed up (still retains 1:1 with regular page-table format).

File:
1 edited

Legend:

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

    r92319 r92331  
    149149# endif
    150150
    151     uint64_t fEffective = X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A | 1;  /** @todo can this default assignment be removed? */
     151    uint64_t fEffective;
    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 = Pml4e.u & (  X86_PML4E_RW | X86_PML4E_US | X86_PML4E_PWT
     172        pWalk->Core.fEffective = fEffective = Pml4e.u & (  X86_PML4E_P   | X86_PML4E_RW | X86_PML4E_US | X86_PML4E_PWT
    173173                                                         | X86_PML4E_PCD | X86_PML4E_A  | X86_PML4E_NX);
    174174
     
    204204
    205205# if PGM_GST_TYPE == PGM_TYPE_AMD64
    206         pWalk->Core.fEffective = fEffective &= (Pdpe.u & (X86_PDPE_RW | X86_PDPE_US | X86_PDPE_PWT | X86_PDPE_PCD | X86_PDPE_A))
     206        pWalk->Core.fEffective = fEffective &= (Pdpe.u & (  X86_PDPE_P   | X86_PDPE_RW  | X86_PDPE_US
     207                                                          | X86_PDPE_PWT | X86_PDPE_PCD | X86_PDPE_A))
    207208                                             | (Pdpe.u & X86_PDPE_LM_NX);
    208209# else
    209210        /* NX in the legacy-mode PAE PDPE is reserved. The valid check above ensures the NX bit is not set. */
    210         pWalk->Core.fEffective = fEffective  = X86_PDPE_RW  | X86_PDPE_US | X86_PDPE_A
     211        pWalk->Core.fEffective = fEffective  = X86_PDPE_P | X86_PDPE_RW  | X86_PDPE_US | X86_PDPE_A
    211212                                             | (Pdpe.u & (X86_PDPE_PWT | X86_PDPE_PCD));
    212213# endif
     
    245246             */
    246247# 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            fEffective  =  Pde.u & (X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A);
    248249# else
    249             fEffective &= (Pde.u & (X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A))
     250            fEffective &= (Pde.u & (X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PWT | X86_PDE4M_PCD | X86_PDE4M_A))
    250251                        | (Pde.u & X86_PDE2M_PAE_NX);
    251252# endif
     
    254255            pWalk->Core.fEffective = fEffective;
    255256            Assert(GST_IS_NX_ACTIVE(pVCpu) || !(fEffective & PGM_PTATTRS_NX_MASK));
     257            Assert(fEffective & PGM_PTATTRS_R_MASK);
    256258
    257259            pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW);
     
    273275            return PGM_GST_NAME(WalkReturnRsvdError)(pVCpu, pWalk, 2);
    274276# if PGM_GST_TYPE == PGM_TYPE_32BIT
    275         pWalk->Core.fEffective = fEffective &= Pde.u & (X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A);
     277        pWalk->Core.fEffective = fEffective  = Pde.u & (  X86_PDE_P   | X86_PDE_RW  | X86_PDE_US
     278                                                        | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A);
    276279# else
    277         pWalk->Core.fEffective = fEffective &= (Pde.u & (X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A))
     280        pWalk->Core.fEffective = fEffective &= (Pde.u & (  X86_PDE_P   | X86_PDE_RW  | X86_PDE_US
     281                                                         | X86_PDE_PWT | X86_PDE_PCD | X86_PDE_A))
    278282                                             | (Pde.u & X86_PDE_PAE_NX);
    279283# endif
     
    306310         */
    307311# if PGM_GST_TYPE == PGM_TYPE_32BIT
    308         fEffective &= Pte.u & (X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A);
     312        fEffective &=  Pte.u & (X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A);
    309313# else
    310         fEffective &= (Pte.u & (X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A))
     314        fEffective &= (Pte.u & (X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_PWT | X86_PTE_PCD | X86_PTE_A))
    311315                   |  (Pte.u & X86_PTE_PAE_NX);
    312316# endif
     
    314318        pWalk->Core.fEffective = fEffective;
    315319        Assert(GST_IS_NX_ACTIVE(pVCpu) || !(fEffective & PGM_PTATTRS_NX_MASK));
     320        Assert(fEffective & PGM_PTATTRS_R_MASK);
    316321
    317322        pWalk->Core.fEffectiveRW = !!(fEffective & X86_PTE_RW);
     
    376381        if (!Walk.Core.fBigPage)
    377382            *pfFlags = (Walk.Pte.u & ~(GST_PTE_PG_MASK | X86_PTE_RW | X86_PTE_US))                      /* NX not needed */
    378                      | (Walk.Core.fEffective & (  PGM_PTATTRS_RW_MASK
     383                     | (Walk.Core.fEffective & (  PGM_PTATTRS_W_MASK
    379384                                                | PGM_PTATTRS_US_MASK))
    380385# if PGM_WITH_NX(PGM_GST_TYPE, PGM_GST_TYPE)
     
    385390        {
    386391            *pfFlags = (Walk.Pde.u & ~(GST_PTE_PG_MASK | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PS))   /* NX not needed */
    387                      | (Walk.Core.fEffective & (  PGM_PTATTRS_RW_MASK
     392                     | (Walk.Core.fEffective & (  PGM_PTATTRS_W_MASK
    388393                                                | PGM_PTATTRS_US_MASK
    389394                                                | PGM_PTATTRS_PAT_MASK))
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