VirtualBox

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


Ignore:
Timestamp:
Nov 6, 2008 6:55:03 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
38956
Message:

PGM: PAE guest mappings, assert GCPtr being 32-bit.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r13832 r13933  
    826826        &&  !(pPdpe->u & X86_PDPE_PG_MASK))
    827827    {
    828         PX86PDPE pPdptGst = &CTXSUFF(pPGM->pGstPaePDPT)->a[iPdPt];
     828        PX86PDPE pPdptGst = pgmGstGetPaePDPEPtr(pPGM, GCPtr);
    829829
    830830        Assert(!(pPdpe->u & X86_PDPE_PG_MASK));
     
    12301230{
    12311231    Assert(iPdpt <= 3);
    1232     return pVM->pgm.s.CTXSUFF(pGstPaePDPT)->a[iPdpt & 3];
     1232    return pgmGstGetPaePDPTPtr(&pVM->pgm.s)->a[iPdpt & 3];
    12331233}
    12341234
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r13919 r13933  
    109109#    if PGM_GST_TYPE == PGM_TYPE_PAE
    110110    unsigned        iPDSrc;
    111     PGSTPD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, (RTGCUINTPTR)pvFault, &iPDSrc);
     111    PGSTPD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, (RTGCUINTPTR)pvFault, &iPDSrc, NULL);
    112112
    113113#    elif PGM_GST_TYPE == PGM_TYPE_AMD64
     
    959959    unsigned        iPDSrc;
    960960#  if PGM_GST_TYPE == PGM_TYPE_PAE
    961     PX86PDPAE       pPDSrc      = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc);
    962     X86PDPE         PdpeSrc     = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte];
     961    X86PDPE         PdpeSrc;
     962    PX86PDPAE       pPDSrc      = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc, &PdpeSrc);
    963963#  else /* AMD64 */
    964964    PX86PML4E       pPml4eSrc;
     
    10951095
    10961096# if PGM_GST_TYPE == PGM_TYPE_PAE
    1097     /* Note: This shouldn't actually be necessary as we monitor the PDPT page for changes. */
     1097    /*
     1098     * Update the shadow PDPE and free all the shadow PD entries if the PDPE is marked not present.
     1099     * Note: This shouldn't actually be necessary as we monitor the PDPT page for changes.
     1100     */
    10981101    if (!pPDSrc)
    10991102    {
     
    11031106        PPGMPOOL   pPool   = pVM->pgm.s.CTX_SUFF(pPool);
    11041107
    1105         Assert(!(CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte].n.u1Present));
     1108        Assert(!PdpeSrc.n.u1Present);
    11061109        LogFlow(("InvalidatePage: guest PDPE %d not present; clear shw pdpe\n", iPdpte));
    1107             /* for each page directory entry */
    1108             for (unsigned iPD = 0; iPD < X86_PG_PAE_ENTRIES; iPD++)
     1110
     1111        /* for each page directory entry */
     1112        for (unsigned iPD = 0; iPD < X86_PG_PAE_ENTRIES; iPD++)
     1113        {
     1114            if (   pPDEDst[iPD].n.u1Present
     1115                && !(pPDEDst[iPD].u & PGM_PDFLAGS_MAPPING))
    11091116            {
    1110                 if (   pPDEDst[iPD].n.u1Present
    1111                     && !(pPDEDst[iPD].u & PGM_PDFLAGS_MAPPING))
    1112                 {
    1113                     pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, pPDEDst[iPD].u & SHW_PDE_PG_MASK), SHW_POOL_ROOT_IDX, iPdpte * X86_PG_PAE_ENTRIES + iPD);
    1114                     pPDEDst[iPD].u = 0;
    1115                 }
    1116             }
     1117                pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, pPDEDst[iPD].u & SHW_PDE_PG_MASK), SHW_POOL_ROOT_IDX, iPdpte * X86_PG_PAE_ENTRIES + iPD);
     1118                pPDEDst[iPD].u = 0;
     1119            }
     1120        }
    11171121        if (!(pPdptDst->a[iPdpte].u & PGM_PLXFLAGS_MAPPING))
    11181122                pPdptDst->a[iPdpte].n.u1Present = 0;
     
    20202024    Assert(pPdpeSrc);
    20212025
    2022 #  else /* PAE */
    2023     PX86PDPE pPdpeSrc = &pVM->pgm.s.CTXSUFF(pGstPaePDPT)->a[(GCPtrPage >> GST_PDPT_SHIFT) & GST_PDPT_MASK];
    2024 #  endif
     2026#  else  /* PAE */
     2027    PX86PDPE pPdpeSrc = pgmGstGetPaePDPEPtr(&pVM->pgm.s, GCPtrPage);
     2028#  endif /* PAE */
    20252029
    20262030    /*
     
    28132817#  elif PGM_GST_TYPE == PGM_TYPE_PAE
    28142818    unsigned        iPDSrc;
    2815     PGSTPD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc);
     2819    PGSTPD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc, NULL);
    28162820    if (!pPDSrc)
    28172821        return VINF_SUCCESS; /* not present */
     
    29322936#  elif PGM_GST_TYPE == PGM_TYPE_PAE
    29332937    unsigned        iPDSrc;
    2934     PGSTPD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc);
     2938    PGSTPD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc, NULL);
    29352939
    29362940    if (pPDSrc)
     
    32253229            unsigned        iPDSrc;
    32263230#   if PGM_GST_TYPE == PGM_TYPE_PAE
     3231            X86PDPE         PdpeSrc;
     3232            PGSTPD          pPDSrc    = pgmGstGetPaePDPtr(&pVM->pgm.s, iPdpte << X86_PDPT_SHIFT, &iPDSrc, &PdpeSrc);
    32273233            PX86PDPAE       pPDPAE    = pVM->pgm.s.CTXMID(ap,PaePDs)[0];
    32283234            PX86PDEPAE      pPDEDst   = &pPDPAE->a[iPdpte * X86_PG_PAE_ENTRIES];
    3229             PGSTPD          pPDSrc    = pgmGstGetPaePDPtr(&pVM->pgm.s, iPdpte << X86_PDPT_SHIFT, &iPDSrc);
    32303235            PX86PDPT        pPdptDst  = pVM->pgm.s.CTXMID(p,PaePDPT);   NOREF(pPdptDst);
    3231             X86PDPE         PdpeSrc   = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte];
    32323236
    32333237            if (pPDSrc == NULL)
     
    36553659    rc = PGMShwGetPage(pVM, (RTGCPTR)pPGM->pGuestPDRC, NULL, &HCPhysShw);
    36563660#  else
    3657     rc = PGMShwGetPage(pVM, (RTGCPTR)pPGM->pGstPaePDPTGC, NULL, &HCPhysShw);
     3661    rc = PGMShwGetPage(pVM, (RTGCPTR)pPGM->pGstPaePDPTRC, NULL, &HCPhysShw);
    36583662#  endif
    36593663    AssertRCReturn(rc, 1);
     
    37643768            RTGCPHYS        GCPhysPdeSrc;
    37653769#   if PGM_GST_TYPE == PGM_TYPE_PAE
     3770            X86PDPE         PdpeSrc;
     3771            PGSTPD          pPDSrc    = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtr, &iPDSrc, &PdpeSrc);
    37663772            PX86PDPAE       pPDDst    = pVM->pgm.s.CTXMID(ap,PaePDs)[0];
    3767             PGSTPD          pPDSrc    = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtr, &iPDSrc);
    37683773            PX86PDPT        pPdptDst  = pVM->pgm.s.CTXMID(p,PaePDPT);
    3769             X86PDPE         PdpeSrc   = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte];
    37703774#   else
    37713775            PX86PML4E       pPml4eSrc;
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r13923 r13933  
    459459
    460460# elif PGM_GST_TYPE == PGM_TYPE_PAE
    461             unsigned offset = GCPhysCR3 & GST_CR3_PAGE_MASK & PAGE_OFFSET_MASK;
    462             pVM->pgm.s.pGstPaePDPTHC = (R3R0PTRTYPE(PX86PDPT)) HCPtrGuestCR3;
    463             pVM->pgm.s.pGstPaePDPTGC = (RCPTRTYPE(PX86PDPT))   ((RCPTRTYPE(uint8_t *))pVM->pgm.s.GCPtrCR3Mapping + offset);
    464             Log(("Cached mapping %RGv\n", pVM->pgm.s.pGstPaePDPTGC));
     461            unsigned off = GCPhysCR3 & GST_CR3_PAGE_MASK & PAGE_OFFSET_MASK;
     462            pVM->pgm.s.pGstPaePDPTR3 = (R3PTRTYPE(PX86PDPT))HCPtrGuestCR3;
     463#  ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     464            pVM->pgm.s.pGstPaePDPTR0 = (R0PTRTYPE(PX86PDPT))HCPtrGuestCR3;
     465#  endif
     466            pVM->pgm.s.pGstPaePDPTRC = (RCPTRTYPE(PX86PDPT))((RCPTRTYPE(uint8_t *))pVM->pgm.s.GCPtrCR3Mapping + off);
     467            Log(("Cached mapping %RGv\n", pVM->pgm.s.pGstPaePDPTRC));
    465468
    466469            /*
    467470             * Map the 4 PDs too.
    468471             */
     472            PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s);
    469473            RTGCUINTPTR GCPtr = (RTGCUINTPTR)pVM->pgm.s.GCPtrCR3Mapping + PAGE_SIZE;
    470474            for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++, GCPtr += PAGE_SIZE)
    471475            {
    472                 if (pVM->pgm.s.CTXSUFF(pGstPaePDPT)->a[i].n.u1Present)
     476                if (pGuestPDPT->a[i].n.u1Present)
    473477                {
    474478                    RTHCPTR     HCPtr;
    475479                    RTHCPHYS    HCPhys;
    476                     RTGCPHYS    GCPhys = pVM->pgm.s.CTXSUFF(pGstPaePDPT)->a[i].u & X86_PDPE_PG_MASK;
     480                    RTGCPHYS    GCPhys = pGuestPDPT->a[i].u & X86_PDPE_PG_MASK;
    477481                    int rc2 = pgmRamGCPhys2HCPtrAndHCPhysWithFlags(&pVM->pgm.s, GCPhys, &HCPtr, &HCPhys);
    478482                    if (RT_SUCCESS(rc2))
     
    480484                        rc = PGMMap(pVM, GCPtr, HCPhys & X86_PTE_PAE_PG_MASK, PAGE_SIZE, 0);
    481485                        AssertRCReturn(rc, rc);
    482                         pVM->pgm.s.apGstPaePDsHC[i]     = (R3R0PTRTYPE(PX86PDPAE))HCPtr;
    483                         pVM->pgm.s.apGstPaePDsGC[i]     = (RCPTRTYPE(PX86PDPAE))GCPtr;
     486
     487                        pVM->pgm.s.apGstPaePDsR3[i]     = (R3PTRTYPE(PX86PDPAE))HCPtr;
     488#  ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     489                        pVM->pgm.s.apGstPaePDsR0[i]     = (R0PTRTYPE(PX86PDPAE))HCPtr;
     490#  endif
     491                        pVM->pgm.s.apGstPaePDsRC[i]     = (RCPTRTYPE(PX86PDPAE))GCPtr;
    484492                        pVM->pgm.s.aGCPhysGstPaePDs[i]  = GCPhys;
    485                         PGM_INVL_PG(GCPtr);
     493                        PGM_INVL_PG(GCPtr); /** @todo This ends up calling HWACCMInvalidatePage, is that correct? */
    486494                        continue;
    487495                    }
     
    489497                }
    490498
    491                 pVM->pgm.s.apGstPaePDsHC[i]     = 0;
    492                 pVM->pgm.s.apGstPaePDsGC[i]     = 0;
     499                pVM->pgm.s.apGstPaePDsR3[i]     = 0;
     500#  ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     501                pVM->pgm.s.apGstPaePDsR0[i]     = 0;
     502#  endif
     503                pVM->pgm.s.apGstPaePDsRC[i]     = 0;
    493504                pVM->pgm.s.aGCPhysGstPaePDs[i]  = NIL_RTGCPHYS;
    494                 PGM_INVL_PG(GCPtr);
     505                PGM_INVL_PG(GCPtr); /** @todo this shouldn't be necessary? */
    495506            }
    496507# elif PGM_GST_TYPE == PGM_TYPE_AMD64
     
    560571
    561572#elif PGM_GST_TYPE == PGM_TYPE_PAE
    562     pVM->pgm.s.pGstPaePDPTHC = 0;
    563     pVM->pgm.s.pGstPaePDPTGC = 0;
    564     for (unsigned i=0; i < X86_PG_PAE_PDPE_ENTRIES; i++)
    565     {
    566         pVM->pgm.s.apGstPaePDsHC[i]    = 0;
    567         pVM->pgm.s.apGstPaePDsGC[i]    = 0;
     573    pVM->pgm.s.pGstPaePDPTR3 = 0;
     574# ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     575    pVM->pgm.s.pGstPaePDPTR0 = 0;
     576# endif
     577    pVM->pgm.s.pGstPaePDPTRC = 0;
     578    for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++)
     579    {
     580        pVM->pgm.s.apGstPaePDsR3[i]    = 0;
     581# ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     582        pVM->pgm.s.apGstPaePDsR0[i]    = 0;
     583# endif
     584        pVM->pgm.s.apGstPaePDsRC[i]    = 0;
    568585        pVM->pgm.s.aGCPhysGstPaePDs[i] = NIL_RTGCPHYS;
    569586    }
     
    666683     * Do the 4 PDs.
    667684     */
     685    PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s);
    668686    for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++)
    669687    {
    670         if (CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].n.u1Present)
    671         {
    672             RTGCPHYS GCPhys = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u & X86_PDPE_PG_MASK;
     688        if (pGuestPDPT->a[i].n.u1Present)
     689        {
     690            RTGCPHYS GCPhys = pGuestPDPT->a[i].u & X86_PDPE_PG_MASK;
    673691            if (pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] != GCPhys)
    674692            {
     
    10891107         * We'll simply check all of them instead of figuring out which one/two to check.
    10901108         */
     1109        PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s);
    10911110        for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++)
    10921111        {
    1093             if (    CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].n.u1Present
    1094                 &&  (   CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u & X86_PDPE_PG_MASK)
    1095                      != pVM->pgm.s.aGCPhysGstPaePDsMonitored[i])
     1112            if (    pGuestPDPT->a[i].n.u1Present
     1113                &&      (pGuestPDPT->a[i].u & X86_PDPE_PG_MASK)
     1114                    != pVM->pgm.s.aGCPhysGstPaePDsMonitored[i])
    10961115            {
    10971116                /*
     
    11071126                pVM->pgm.s.fSyncFlags |= PGM_SYNC_MONITOR_CR3;
    11081127                Log(("pgmXXGstPaeWriteHandlerCR3: detected updated PDPE; [%d] = %#llx, Old GCPhys=%RGp\n",
    1109                      i, CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i]));
     1128                     i, pGuestPDPT->a[i].u, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i]));
    11101129            }
    11111130        }
     
    11551174         */
    11561175        RTGCUINTPTR i;
     1176        PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s);
    11571177        for (i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++)
    1158             if (CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u == (GCPhysFault & X86_PTE_PAE_PG_MASK))
     1178            if (pGuestPDPT->a[i].u == (GCPhysFault & X86_PTE_PAE_PG_MASK))
    11591179            {
    11601180                PX86PDPAE           pPDSrc = pgmGstGetPaePD(&pVM->pgm.s, i << X86_PDPT_SHIFT);
    1161                 const RTGCUINTPTR offPD  = GCPhysFault & PAGE_OFFSET_MASK;
     1181                const RTGCUINTPTR   offPD  = GCPhysFault & PAGE_OFFSET_MASK;
    11621182                const unsigned      iPD1   = offPD / sizeof(X86PDEPAE);
    11631183                const unsigned      iPD2   = (offPD + cb - 1) / sizeof(X86PDEPAE);
     
    11671187                Assert(iPD2 < X86_PG_PAE_ENTRIES);
    11681188
    1169 #ifdef DEBUG
     1189# ifdef LOG_ENABLED
    11701190                Log(("pgmXXGstPaeWriteHandlerPD: emulated change to i=%d iPD1=%#05x (%x)\n",
    11711191                     i, iPD1, (i << X86_PDPT_SHIFT) | (iPD1 << X86_PD_PAE_SHIFT)));
     
    11731193                    Log(("pgmXXGstPaeWriteHandlerPD: emulated change to i=%d iPD2=%#05x (%x)\n",
    11741194                         i, iPD2, (i << X86_PDPT_SHIFT) | (iPD2 << X86_PD_PAE_SHIFT)));
    1175 #endif
     1195# endif
    11761196
    11771197                if (!pVM->pgm.s.fMappingsFixed)
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