VirtualBox

Changeset 86488 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Oct 8, 2020 8:32:24 AM (4 years ago)
Author:
vboxsync
Message:

VMM/PGM: Working on eliminating page table bitfield use (32-bit PDEs). bugref:9841 bugref:9746

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r86476 r86488  
    14181418                AssertReturn(pPde, VERR_INTERNAL_ERROR_3);
    14191419                Log(("pgmShwMakePageSupervisorAndWritable: PDE=%#llx", pPde->u));
    1420                 pPde->n.u1Write = 1;
     1420                pPde->u |= X86_PDE_RW;
    14211421                Log(("-> PDE=%#llx (32)\n", pPde->u));
    14221422                break;
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r86487 r86488  
    345345                LogFlow(("pgmPoolMonitorChainChanging: PGMPOOLKIND_32BIT_PD %x\n", iShw));
    346346                STAM_COUNTER_INC(&pPool->CTX_MID_Z(StatMonitor,FaultPD));
    347                 if (uShw.pPD->a[iShw].n.u1Present)
     347                X86PGUINT const uPde = uShw.pPD->a[iShw].u;
     348                if (uPde & X86_PDE_P)
    348349                {
    349                     LogFlow(("pgmPoolMonitorChainChanging: 32 bit pd iShw=%#x: %RX64 -> freeing it!\n", iShw, uShw.pPD->a[iShw].u));
    350                     pgmPoolFree(pVM,
    351                                 uShw.pPD->a[iShw].u & X86_PDE_PAE_PG_MASK,
    352                                 pPage->idx,
    353                                 iShw);
     350                    LogFlow(("pgmPoolMonitorChainChanging: 32 bit pd iShw=%#x: %RX64 -> freeing it!\n", iShw, uPde));
     351                    pgmPoolFree(pVM, uPde & X86_PDE_PG_MASK, pPage->idx, iShw);
    354352                    ASMAtomicWriteU32(&uShw.pPD->a[iShw].u, 0);
    355353                }
     354
    356355                /* paranoia / a bit assumptive. */
    357356                if (    (off & 3)
     
    362361                        &&  iShw2 < RT_ELEMENTS(uShw.pPD->a))
    363362                    {
    364                         if (uShw.pPD->a[iShw2].n.u1Present)
     363                        X86PGUINT const uPde2 = uShw.pPD->a[iShw2].u;
     364                        if (uPde2 & X86_PDE_P)
    365365                        {
    366                             LogFlow(("pgmPoolMonitorChainChanging: 32 bit pd iShw=%#x: %RX64 -> freeing it!\n", iShw2, uShw.pPD->a[iShw2].u));
    367                             pgmPoolFree(pVM,
    368                                         uShw.pPD->a[iShw2].u & X86_PDE_PAE_PG_MASK,
    369                                         pPage->idx,
    370                                         iShw2);
     366                            LogFlow(("pgmPoolMonitorChainChanging: 32 bit pd iShw=%#x: %RX64 -> freeing it!\n", iShw2, uPde2));
     367                            pgmPoolFree(pVM, uPde2 & X86_PDE_PG_MASK, pPage->idx, iShw2);
    371368                            ASMAtomicWriteU32(&uShw.pPD->a[iShw2].u, 0);
    372369                        }
     
    44824479    for (unsigned i = 0; i < RT_ELEMENTS(pShwPD->a); i++)
    44834480    {
    4484         if (    pShwPD->a[i].n.u1Present
     4481        X86PGUINT const uPde = pShwPD->a[i].u;
    44854482#ifndef PGM_WITHOUT_MAPPINGS
    4486             &&  !(pShwPD->a[i].u & PGM_PDFLAGS_MAPPING)
     4483        if ((uPde & (X86_PDE_P | PGM_PDFLAGS_MAPPING)) == X86_PDE_P)
     4484#else
     4485        if (uPde & X86_PDE_P)
    44874486#endif
    4488            )
    44894487        {
    44904488            PPGMPOOLPAGE pSubPage = (PPGMPOOLPAGE)RTAvloHCPhysGet(&pPool->HCPhysTree, pShwPD->a[i].u & X86_PDE_PG_MASK);
  • trunk/src/VBox/VMM/VMMAll/PGMAllShw.h

    r86476 r86488  
    7474# define SHW_PD_MASK                    X86_PD_MASK
    7575# define SHW_TOTAL_PD_ENTRIES           X86_PG_ENTRIES
    76 # define SHW_PDE_IS_P(Pde)              ( (Pde).n.u1Present )
    77 # define SHW_PDE_IS_A(Pde)              ( (Pde).n.u1Accessed )
    78 # define SHW_PDE_IS_BIG(Pde)            ( (Pde).b.u1Size )
     76# define SHW_PDE_IS_P(Pde)              ( (Pde).u & X86_PDE_P )
     77# define SHW_PDE_IS_A(Pde)              ( (Pde).u & X86_PDE_A )
     78# define SHW_PDE_IS_BIG(Pde)            ( (Pde).u & X86_PDE_PS )
    7979# define SHW_PDE_ATOMIC_SET(Pde, uNew)  do { ASMAtomicWriteU32(&(Pde).u, (uNew)); } while (0)
    8080# define SHW_PDE_ATOMIC_SET2(Pde, Pde2) do { ASMAtomicWriteU32(&(Pde).u, (Pde2).u); } while (0)
  • trunk/src/VBox/VMM/VMMR3/PGM.cpp

    r86473 r86488  
    23452345    {
    23462346        X86PDE PdeSrc = pPDSrc->a[iPD];
    2347         if (PdeSrc.n.u1Present)
     2347        if (PdeSrc.u & X86_PDE_P)
    23482348        {
    2349             if (PdeSrc.b.u1Size && fPSE)
     2349            if ((PdeSrc.u & X86_PDE_PS) && fPSE)
    23502350                pHlp->pfnPrintf(pHlp,
    23512351                                "%04X - %RGp P=%d U=%d RW=%d G=%d - BIG\n",
    23522352                                iPD,
    2353                                 pgmGstGet4MBPhysPage(pVM, PdeSrc),
    2354                                 PdeSrc.b.u1Present, PdeSrc.b.u1User, PdeSrc.b.u1Write, PdeSrc.b.u1Global && fPGE);
     2353                                pgmGstGet4MBPhysPage(pVM, PdeSrc), PdeSrc.u & X86_PDE_P, !!(PdeSrc.u & X86_PDE_US),
     2354                                !!(PdeSrc.u & X86_PDE_RW), (PdeSrc.u & X86_PDE4M_G) && fPGE);
    23552355            else
    23562356                pHlp->pfnPrintf(pHlp,
    23572357                                "%04X - %RGp P=%d U=%d RW=%d [G=%d]\n",
    23582358                                iPD,
    2359                                 (RTGCPHYS)(PdeSrc.u & X86_PDE_PG_MASK),
    2360                                 PdeSrc.n.u1Present, PdeSrc.n.u1User, PdeSrc.n.u1Write, PdeSrc.b.u1Global && fPGE);
     2359                                (RTGCPHYS)(PdeSrc.u & X86_PDE_PG_MASK), PdeSrc.u & X86_PDE_P, !!(PdeSrc.u & X86_PDE_US),
     2360                                !!(PdeSrc.u & X86_PDE_RW), (PdeSrc.u & X86_PDE4M_G) && fPGE);
    23612361        }
    23622362    }
  • trunk/src/VBox/VMM/include/PGMInline.h

    r86465 r86488  
    638638{
    639639    RTGCPHYS GCPhys = Pde.u & X86_PDE4M_PG_MASK;
    640     GCPhys |= (RTGCPHYS)Pde.b.u8PageNoHigh << 32;
     640    GCPhys |= (RTGCPHYS)(Pde.u & X86_PDE4M_PG_HIGH_MASK) << X86_PDE4M_PG_HIGH_SHIFT;
    641641
    642642    return GCPhys & pVM->pgm.s.GCPhys4MBPSEMask;
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