VirtualBox

Changeset 9778 in vbox


Ignore:
Timestamp:
Jun 17, 2008 3:24:11 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
32139
Message:

InvalidatePage corrections.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGMPool.cpp

    r9692 r9778  
    200200        paUsers[i].iNext = i + 1;
    201201        paUsers[i].iUser = NIL_PGMPOOL_IDX;
    202         paUsers[i].iUserTable = 0xfffffffe;
     202        paUsers[i].iUserTable = 0xfffe;
    203203    }
    204204    paUsers[cMaxUsers - 1].iNext = NIL_PGMPOOL_USER_INDEX;
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r9758 r9778  
    870870     * (Guessing that it is frequent for a shadow PDE to not be present, do this first.)
    871871     */
    872     const unsigned  iPDDst = GCPtrPage >> SHW_PD_SHIFT;
    873872# if PGM_SHW_TYPE == PGM_TYPE_32BIT
    874     PX86PDE     pPdeDst = &pVM->pgm.s.CTXMID(p,32BitPD)->a[iPDDst];
     873    const unsigned  iPDDst    = GCPtrPage >> SHW_PD_SHIFT;
     874    PX86PDE         pPdeDst   = &pVM->pgm.s.CTXMID(p,32BitPD)->a[iPDDst];
    875875# elif PGM_SHW_TYPE == PGM_TYPE_PAE
    876     PX86PDEPAE  pPdeDst = &pVM->pgm.s.CTXMID(ap,PaePDs[0])->a[iPDDst];
     876    const unsigned  iPDDst    = GCPtrPage >> SHW_PD_SHIFT;
     877    const unsigned  iPdPte    = (GCPtrPage >> X86_PDPT_SHIFT);   /* no mask; flat index into the 2048 entry array. */
     878    PX86PDEPAE      pPdeDst   = &pVM->pgm.s.CTXMID(ap,PaePDs[0])->a[iPDDst];
     879    PX86PDPT        pPdptDst  = pVM->pgm.s.CTXMID(p,PaePDPT);
    877880# else /* AMD64 */
    878881    /* PML4 */
    879     const unsigned iPml4  = ((RTGCUINTPTR64)GCPtrPage >> X86_PML4_SHIFT) & X86_PML4_MASK;
    880     PX86PML4E pPml4eDst = &CTXMID(pVM->pgm.s.p,PaePML4)->a[iPml4];
    881     if (!pPml4eDst->n.u1Present)
    882     {
     882    const unsigned  iPml4e    = (GCPtrPage >> X86_PML4_SHIFT) & X86_PML4_MASK;
     883    const unsigned  iPdPte    = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;
     884    const unsigned  iPDDst    = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
     885    PX86PDPAE       pPDDst;
     886    PX86PDPT        pPdptDst;
     887    PX86PML4E       pPml4eDst = &pVM->pgm.s.pHCPaePML4->a[iPml4e];
     888    rc = PGMShwGetLongModePDPtr(pVM, GCPtrPage, &pPdptDst, &pPDDst);
     889    if (rc != VINF_SUCCESS)
     890    {
     891        AssertMsg(rc == VERR_PAGE_DIRECTORY_PTR_NOT_PRESENT || rc == VERR_PAGE_MAP_LEVEL4_NOT_PRESENT, ("Unexpected rc=%Vrc\n", rc));
    883892        STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePageSkipped));
    884893        return VINF_SUCCESS;
    885894    }
    886 
    887     /* PDPT */
    888     PX86PDPT pPDPT;
    889     rc = PGM_HCPHYS_2_PTR(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, &pPDPT);
    890     if (VBOX_FAILURE(rc))
    891         return rc;
    892     const unsigned iPDPT = ((RTGCUINTPTR64)GCPtrPage >> SHW_PDPT_SHIFT) & SHW_PDPT_MASK;
    893     PX86PDPE pPdpeDst = &pPDPT->a[iPDPT];
    894     if (!pPdpeDst->n.u1Present)
    895     {
    896         STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePageSkipped));
    897         return VINF_SUCCESS;
    898     }
    899 
    900     /* PD */
    901     PX86PDPAE pPd;
    902     rc = PGM_HCPHYS_2_PTR(pVM, pPdpeDst->u & X86_PDPE_PG_MASK, &pPd);
    903     if (VBOX_FAILURE(rc))
    904         return rc;
    905     const unsigned iPd = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
    906     PX86PDEPAE  pPdeDst = &pPd->a[iPd];
     895    Assert(pPDDst);
     896
     897    PX86PDEPAE  pPdeDst  = &pPDDst->a[iPDDst];
     898    PX86PDPE    pPdpeDst = &pPdptDst->a[iPdPte];
    907899# endif
    908900
     
    969961
    970962
     963# if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     964    /* Fetch the pgm pool shadow descriptor. */
     965    PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdPte].u & X86_PDPE_PG_MASK);
     966    Assert(pShwPde);
     967# endif
     968
    971969# if PGM_GST_TYPE == PGM_TYPE_AMD64
    972970    Assert(pPml4eDst->n.u1Present && pPml4eDst->u & SHW_PDPT_MASK);
     
    981979            LogFlow(("InvalidatePage: Out-of-sync PML4E at %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n",
    982980                     GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u));
    983             pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4);
     981            pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4e);
    984982            pPml4eDst->u = 0;
    985983            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync));
     
    993991            LogFlow(("InvalidatePage: Out-of-sync PML4E (A) at %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n",
    994992                     GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u));
    995             pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4);
     993            pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4e);
    996994            pPml4eDst->u = 0;
    997995            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs));
     
    10031001        LogFlow(("InvalidatePage: Out-of-sync PML4E (P) at %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n",
    10041002                    GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u));
    1005         pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4);
     1003        pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4e);
    10061004        pPml4eDst->u = 0;
    10071005        STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNPs));
     
    10211019            LogFlow(("InvalidatePage: Out-of-sync PDPE at %VGp PdpeSrc=%RX64 PdpeDst=%RX64\n",
    10221020                     GCPtrPage, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u));
    1023             pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4);
     1021            pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4e);
    10241022            pPdpeDst->u = 0;
    10251023            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync));
     
    10331031            LogFlow(("InvalidatePage: Out-of-sync PDPE (A) at %VGp PdpeSrc=%RX64 PdpeDst=%RX64\n",
    10341032                     GCPtrPage, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u));
    1035             pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4);
     1033            pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4e);
    10361034            pPdpeDst->u = 0;
    10371035            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs));
     
    10741072            LogFlow(("InvalidatePage: Out-of-sync at %VGp PdeSrc=%RX64 PdeDst=%RX64\n",
    10751073                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
     1074# if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     1075            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
     1076# else
    10761077            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst);
     1078# endif
    10771079            pPdeDst->u = 0;
    10781080            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync));
     
    10861088            LogFlow(("InvalidatePage: Out-of-sync (A) at %VGp PdeSrc=%RX64 PdeDst=%RX64\n",
    10871089                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
     1090# if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     1091            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
     1092# else
    10881093            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst);
     1094# endif
    10891095            pPdeDst->u = 0;
    10901096            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs));
     
    11301136                LogFlow(("InvalidatePage: Out-of-sync at %VGp PdeSrc=%RX64 PdeDst=%RX64 ShwGCPhys=%VGp iPDDst=%#x\n",
    11311137                         GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u, pShwPage->GCPhys, iPDDst));
     1138# if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     1139                pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
     1140# else
    11321141                pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst);
     1142# endif
    11331143                pPdeDst->u = 0;
    11341144                STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync));
     
    11721182            LogFlow(("InvalidatePage: Out-of-sync PD at %VGp PdeSrc=%RX64 PdeDst=%RX64\n",
    11731183                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
     1184# if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     1185            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
     1186# else
    11741187            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst);
     1188# endif
    11751189            pPdeDst->u = 0;
    11761190            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePage4MBPages));
     
    11851199        if (!(PdeDst.u & PGM_PDFLAGS_MAPPING))
    11861200        {
     1201# if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     1202            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
     1203# else
    11871204            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst);
     1205# endif
    11881206            pPdeDst->u = 0;
    11891207            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNPs));
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r9777 r9778  
    32143214        paUsers[i].iNext = i + 1;
    32153215        paUsers[i].iUser = NIL_PGMPOOL_IDX;
    3216         paUsers[i].iUserTable = 0xfffffffe;
     3216        paUsers[i].iUserTable = 0xfffe;
    32173217    }
    32183218    paUsers[cMaxUsers - 1].iNext = NIL_PGMPOOL_USER_INDEX;
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