VirtualBox

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


Ignore:
Timestamp:
Oct 8, 2008 7:42:06 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
37532
Message:

#1865: More PGM changes.

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

Legend:

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

    r13019 r13060  
    785785{
    786786    PPGM           pPGM   = &pVM->pgm.s;
    787     PPGMPOOL       pPool  = pPGM->CTXSUFF(pPool);
     787    PPGMPOOL       pPool  = pPGM->CTX_SUFF(pPool);
    788788    PPGMPOOLPAGE   pShwPage;
    789789    int            rc;
     
    837837{
    838838    PPGM           pPGM   = &pVM->pgm.s;
    839     PPGMPOOL       pPool  = pPGM->CTXSUFF(pPool);
     839    PPGMPOOL       pPool  = pPGM->CTX_SUFF(pPool);
    840840    PPGMPOOLPAGE   pShwPage;
    841841
     
    873873    PPGM           pPGM   = &pVM->pgm.s;
    874874    const unsigned iPml4e = (GCPtr >> X86_PML4_SHIFT) & X86_PML4_MASK;
    875     PPGMPOOL       pPool  = pPGM->CTXSUFF(pPool);
     875    PPGMPOOL       pPool  = pPGM->CTX_SUFF(pPool);
    876876    PX86PML4E      pPml4e;
    877877    PPGMPOOLPAGE   pShwPage;
     
    977977    PPGM           pPGM   = &pVM->pgm.s;
    978978    const unsigned iPml4e = (GCPtr >> X86_PML4_SHIFT) & X86_PML4_MASK;
    979     PPGMPOOL       pPool  = pPGM->CTXSUFF(pPool);
     979    PPGMPOOL       pPool  = pPGM->CTX_SUFF(pPool);
    980980    PX86PML4E      pPml4e;
    981981    PPGMPOOLPAGE   pShwPage;
     
    10191019    PPGM           pPGM   = &pVM->pgm.s;
    10201020    const unsigned iPml4e = (GCPtr >> EPT_PML4_SHIFT) & EPT_PML4_MASK;
    1021     PPGMPOOL       pPool  = pPGM->CTXSUFF(pPool);
     1021    PPGMPOOL       pPool  = pPGM->CTX_SUFF(pPool);
    10221022    PEPTPML4       pPml4  = (PEPTPML4)pPGM->pHCNestedRoot;
    10231023    PEPTPML4E      pPml4e;
     
    17501750}
    17511751
     1752#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     1753
     1754/**
     1755 * Temporarily maps one guest page specified by GC physical address.
     1756 * These pages must have a physical mapping in HC, i.e. they cannot be MMIO pages.
     1757 *
     1758 * Be WARNED that the dynamic page mapping area is small, 8 pages, thus the space is
     1759 * reused after 8 mappings (or perhaps a few more if you score with the cache).
     1760 *
     1761 * @returns VBox status.
     1762 * @param   pVM         VM handle.
     1763 * @param   GCPhys      GC Physical address of the page.
     1764 * @param   ppv         Where to store the address of the mapping.
     1765 */
     1766VMMDECL(int) PGMDynMapGCPage(PVM pVM, RTGCPHYS GCPhys, void **ppv)
     1767{
     1768    AssertMsg(!(GCPhys & PAGE_OFFSET_MASK), ("GCPhys=%VGp\n", GCPhys));
     1769
     1770    /*
     1771     * Get the ram range.
     1772     */
     1773    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     1774    while (pRam && GCPhys - pRam->GCPhys >= pRam->cb)
     1775        pRam = pRam->CTX_SUFF(pNext);
     1776    if (!pRam)
     1777    {
     1778        AssertMsgFailed(("Invalid physical address %VGp!\n", GCPhys));
     1779        return VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
     1780    }
     1781
     1782    /*
     1783     * Pass it on to PGMDynMapHCPage.
     1784     */
     1785    RTHCPHYS HCPhys = PGM_PAGE_GET_HCPHYS(&pRam->aPages[(GCPhys - pRam->GCPhys) >> PAGE_SHIFT]);
     1786    //Log(("PGMDynMapGCPage: GCPhys=%VGp HCPhys=%VHp\n", GCPhys, HCPhys));
     1787    return PGMDynMapHCPage(pVM, HCPhys, ppv);
     1788}
     1789
     1790
     1791/**
     1792 * Temporarily maps one guest page specified by unaligned GC physical address.
     1793 * These pages must have a physical mapping in HC, i.e. they cannot be MMIO pages.
     1794 *
     1795 * Be WARNED that the dynamic page mapping area is small, 8 pages, thus the space is
     1796 * reused after 8 mappings (or perhaps a few more if you score with the cache).
     1797 *
     1798 * The caller is aware that only the speicifed page is mapped and that really bad things
     1799 * will happen if writing beyond the page!
     1800 *
     1801 * @returns VBox status.
     1802 * @param   pVM         VM handle.
     1803 * @param   GCPhys      GC Physical address within the page to be mapped.
     1804 * @param   ppv         Where to store the address of the mapping address corresponding to GCPhys.
     1805 */
     1806VMMDECL(int) PGMDynMapGCPageOff(PVM pVM, RTGCPHYS GCPhys, void **ppv)
     1807{
     1808    /*
     1809     * Get the ram range.
     1810     */
     1811    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     1812    while (pRam && GCPhys - pRam->GCPhys >= pRam->cb)
     1813        pRam = pRam->CTX_SUFF(pNext);
     1814    if (!pRam)
     1815    {
     1816        AssertMsgFailed(("Invalid physical address %VGp!\n", GCPhys));
     1817        return VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
     1818    }
     1819
     1820    /*
     1821     * Pass it on to PGMDynMapHCPageOff.
     1822     */
     1823    RTHCPHYS HCPhys = PGM_PAGE_GET_HCPHYS(&pRam->aPages[(GCPhys - pRam->GCPhys) >> PAGE_SHIFT]);
     1824    return PGMDynMapHCPageOff(pVM, HCPhys, ppv);
     1825}
     1826
     1827
     1828/**
     1829 * Temporarily maps one host page specified by HC physical address.
     1830 *
     1831 * Be WARNED that the dynamic page mapping area is small, 8 pages, thus the space is
     1832 * reused after 8 mappings (or perhaps a few more if you score with the cache).
     1833 *
     1834 * @returns VBox status.
     1835 * @param   pVM         VM handle.
     1836 * @param   HCPhys      HC Physical address of the page.
     1837 * @param   ppv         Where to store the address of the mapping.
     1838 */
     1839VMMDECL(int) PGMDynMapHCPage(PVM pVM, RTHCPHYS HCPhys, void **ppv)
     1840{
     1841    AssertMsg(!(HCPhys & PAGE_OFFSET_MASK), ("HCPhys=%VHp\n", HCPhys));
     1842# ifdef IN_GC
     1843
     1844    /*
     1845     * Check the cache.
     1846     */
     1847    register unsigned iCache;
     1848    if (    pVM->pgm.s.aHCPhysDynPageMapCache[iCache = 0] == HCPhys
     1849        ||  pVM->pgm.s.aHCPhysDynPageMapCache[iCache = 1] == HCPhys
     1850        ||  pVM->pgm.s.aHCPhysDynPageMapCache[iCache = 2] == HCPhys
     1851        ||  pVM->pgm.s.aHCPhysDynPageMapCache[iCache = 3] == HCPhys)
     1852    {
     1853        static const uint8_t au8Trans[MM_HYPER_DYNAMIC_SIZE >> PAGE_SHIFT][RT_ELEMENTS(pVM->pgm.s.aHCPhysDynPageMapCache)] =
     1854        {
     1855            { 0, 5, 6, 7 },
     1856            { 0, 1, 6, 7 },
     1857            { 0, 1, 2, 7 },
     1858            { 0, 1, 2, 3 },
     1859            { 4, 1, 2, 3 },
     1860            { 4, 5, 2, 3 },
     1861            { 4, 5, 6, 3 },
     1862            { 4, 5, 6, 7 },
     1863        };
     1864        Assert(RT_ELEMENTS(au8Trans) == 8);
     1865        Assert(RT_ELEMENTS(au8Trans[0]) == 4);
     1866        int iPage = au8Trans[pVM->pgm.s.iDynPageMapLast][iCache];
     1867        void *pv = pVM->pgm.s.pbDynPageMapBaseGC + (iPage << PAGE_SHIFT);
     1868        *ppv = pv;
     1869        STAM_COUNTER_INC(&pVM->pgm.s.StatDynMapCacheHits);
     1870        //Log(("PGMGCDynMapHCPage: HCPhys=%VHp pv=%VGv iPage=%d iCache=%d\n", HCPhys, pv, iPage, iCache));
     1871        return VINF_SUCCESS;
     1872    }
     1873    Assert(RT_ELEMENTS(pVM->pgm.s.aHCPhysDynPageMapCache) == 4);
     1874    STAM_COUNTER_INC(&pVM->pgm.s.StatDynMapCacheMisses);
     1875
     1876    /*
     1877     * Update the page tables.
     1878     */
     1879    register unsigned iPage = pVM->pgm.s.iDynPageMapLast;
     1880    pVM->pgm.s.iDynPageMapLast = iPage = (iPage + 1) & ((MM_HYPER_DYNAMIC_SIZE >> PAGE_SHIFT) - 1);
     1881    Assert((MM_HYPER_DYNAMIC_SIZE >> PAGE_SHIFT) == 8);
     1882
     1883    pVM->pgm.s.aHCPhysDynPageMapCache[iPage & (RT_ELEMENTS(pVM->pgm.s.aHCPhysDynPageMapCache) - 1)] = HCPhys;
     1884    pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage].u = (uint32_t)HCPhys | X86_PTE_P | X86_PTE_A | X86_PTE_D;
     1885    pVM->pgm.s.paDynPageMapPaePTEsGC[iPage].u   =           HCPhys | X86_PTE_P | X86_PTE_A | X86_PTE_D;
     1886
     1887    void *pv = pVM->pgm.s.pbDynPageMapBaseGC + (iPage << PAGE_SHIFT);
     1888    *ppv = pv;
     1889    ASMInvalidatePage(pv);
     1890    Log4(("PGMGCDynMapHCPage: HCPhys=%VHp pv=%VGv iPage=%d\n", HCPhys, pv, iPage));
     1891    return VINF_SUCCESS;
     1892
     1893#else  /* VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
     1894    AssertFailed();
     1895    return VERR_NOT_IMPLEMENTED;
     1896#endif /* VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
     1897}
     1898
     1899
     1900/**
     1901 * Temporarily maps one host page specified by HC physical address, returning
     1902 * pointer within the page.
     1903 *
     1904 * Be WARNED that the dynamic page mapping area is small, 8 pages, thus the space is
     1905 * reused after 8 mappings (or perhaps a few more if you score with the cache).
     1906 *
     1907 * @returns VBox status.
     1908 * @param   pVM         VM handle.
     1909 * @param   HCPhys      HC Physical address of the page.
     1910 * @param   ppv         Where to store the address corresponding to HCPhys.
     1911 */
     1912VMMDECL(int) PGMDynMapHCPageOff(PVM pVM, RTHCPHYS HCPhys, void **ppv)
     1913{
     1914    int rc = PGMDynMapHCPage(pVM, HCPhys, ppv);
     1915    if (RT_SUCCESS(rc))
     1916        *ppv = (void *)((uintptr_t)*ppv | (HCPhys & PAGE_OFFSET_MASK));
     1917    return rc;
     1918}
     1919
     1920#endif /* IN_GC || VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
    17521921
    17531922#ifdef VBOX_STRICT
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r13046 r13060  
    121121    if (!pPDSrc)
    122122    {
    123         LogFlow(("Trap0eHandler: guest PDPTR %d not present CR3=%VGp\n", (pvFault >> X86_PML4_SHIFT) & X86_PML4_MASK, (CPUMGetGuestCR3(pVM) & X86_CR3_PAGE_MASK)));
     123#   if PGM_GST_TYPE == PGM_TYPE_AMD64 && GC_ARCH_BITS == 64
     124        LogFlow(("Trap0eHandler: guest PML4 %d not present CR3=%VGp\n", (int)(((RTGCUINTPTR)pvFault >> X86_PML4_SHIFT) & X86_PML4_MASK), CPUMGetGuestCR3(pVM) & X86_CR3_PAGE_MASK));
     125#   else
     126        LogFlow(("Trap0eHandler: guest iPDSrc=%u not present CR3=%VGp\n", iPDSrc, CPUMGetGuestCR3(pVM) & X86_CR3_PAGE_MASK));
     127#   endif
    124128        STAM_STATS({ pVM->pgm.s.CTXSUFF(pStatTrap0eAttribution) = &pVM->pgm.s.StatTrap0eGuestTrap; });
    125129        TRPMSetErrorCode(pVM, uErr);
     
    987991
    988992# if PGM_GST_TYPE == PGM_TYPE_AMD64
    989     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     993    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    990994
    991995    /* Fetch the pgm pool shadow descriptor. */
     
    10851089        PX86PDPAE  pPDPAE  = pVM->pgm.s.CTXMID(ap,PaePDs)[0]; /* root of the 2048 PDE array */
    10861090        PX86PDEPAE pPDEDst = &pPDPAE->a[iPdpte * X86_PG_PAE_ENTRIES];
    1087         PPGMPOOL   pPool   = pVM->pgm.s.CTXSUFF(pPool);
     1091        PPGMPOOL   pPool   = pVM->pgm.s.CTX_SUFF(pPool);
    10881092
    10891093        Assert(!(CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte].n.u1Present));
     
    13121316            if (PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]) == HCPhys)
    13131317            {
    1314                 PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     1318                PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    13151319                pgmTrackDerefGCPhys(pPool, pShwPage, &pRam->aPages[iPage]);
    13161320                pShwPage->cPresent--;
     
    13261330# else  /* !PGMPOOL_WITH_GCPHYS_TRACKING */
    13271331    pShwPage->cPresent--;
    1328     pVM->pgm.s.CTXSUFF(pPool)->cPresent--;
     1332    pVM->pgm.s.CTX_SUFF(pPool)->cPresent--;
    13291333# endif /* !PGMPOOL_WITH_GCPHYS_TRACKING */
    13301334}
     
    13671371
    13681372    /* update statistics. */
    1369     pVM->pgm.s.CTXSUFF(pPool)->cPresent++;
     1373    pVM->pgm.s.CTX_SUFF(pPool)->cPresent++;
    13701374    pShwPage->cPresent++;
    13711375    if (pShwPage->iFirstPresent > iPTDst)
     
    18051809     * Yea, I'm lazy.
    18061810     */
    1807     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     1811    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    18081812# if PGM_GST_TYPE == PGM_TYPE_AMD64
    18091813    pgmPoolFreeByPage(pPool, pShwPage, pShwPde->idx, iPDDst);
     
    31403144    unsigned    iPdNoMapping;
    31413145    const bool  fRawR0Enabled = EMIsRawRing0Enabled(pVM);
    3142     PPGMPOOL    pPool         = pVM->pgm.s.CTXSUFF(pPool);
     3146    PPGMPOOL    pPool         = pVM->pgm.s.CTX_SUFF(pPool);
    31433147
    31443148    /* Only check mappings if they are supposed to be put into the shadow page table. */
     
    36603664
    36613665# if PGM_GST_TYPE == PGM_TYPE_AMD64 || PGM_GST_TYPE == PGM_TYPE_PAE
    3662     PPGMPOOL    pPool         = pVM->pgm.s.CTXSUFF(pPool);
     3666    PPGMPOOL    pPool         = pVM->pgm.s.CTX_SUFF(pPool);
    36633667# endif
    36643668
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r13046 r13060  
    486486            }
    487487# elif PGM_GST_TYPE == PGM_TYPE_AMD64
    488             PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     488            PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    489489
    490490            pVM->pgm.s.pGstPaePML4HC = (R3R0PTRTYPE(PX86PML4))HCPtrGuestCR3;
     
    564564        if (pVM->pgm.s.pHCShwAmd64CR3)
    565565        {
    566             PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     566            PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    567567            pgmPoolFreeByPage(pPool, pVM->pgm.s.pHCShwAmd64CR3, PGMPOOL_IDX_AMD64_CR3, pVM->pgm.s.pHCShwAmd64CR3->GCPhys >> PAGE_SHIFT);
    568568            pVM->pgm.s.pHCShwAmd64CR3 = NULL;
     
    614614                                              pVM->pgm.s.pszR3GstWriteHandlerCR3);
    615615# else  /* PGMPOOL_WITH_MIXED_PT_CR3 */
    616         rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTXSUFF(pPool),
     616        rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTX_SUFF(pPool),
    617617                                         pVM->pgm.s.enmShadowMode == PGMMODE_PAE
    618618                                      || pVM->pgm.s.enmShadowMode == PGMMODE_PAE_NX
     
    640640    if (pVM->pgm.s.GCPhysGstCR3Monitored != GCPhysCR3)
    641641    {
    642         rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTXSUFF(pPool), PGMPOOL_IDX_PDPT, GCPhysCR3);
     642        rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTX_SUFF(pPool), PGMPOOL_IDX_PDPT, GCPhysCR3);
    643643        if (VBOX_FAILURE(rc))
    644644        {
     
    661661                Assert(pVM->pgm.s.enmShadowMode == PGMMODE_PAE || pVM->pgm.s.enmShadowMode == PGMMODE_PAE_NX);
    662662
    663                 rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTXSUFF(pPool), PGMPOOL_IDX_PAE_PD_0 + i, GCPhys);
     663                rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTX_SUFF(pPool), PGMPOOL_IDX_PAE_PD_0 + i, GCPhys);
    664664            }
    665665
     
    674674        else if (pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] != NIL_RTGCPHYS)
    675675        {
    676             rc = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTXSUFF(pPool), PGMPOOL_IDX_PAE_PD_0 + i);
     676            rc = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTX_SUFF(pPool), PGMPOOL_IDX_PAE_PD_0 + i);
    677677            AssertRC(rc);
    678678            pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] = NIL_RTGCPHYS;
     
    710710        AssertRCReturn(rc, rc);
    711711# else /* PGMPOOL_WITH_MIXED_PT_CR3 */
    712         rc = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTXSUFF(pPool),
     712        rc = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTX_SUFF(pPool),
    713713                                           pVM->pgm.s.enmShadowMode == PGMMODE_PAE
    714714                                        || pVM->pgm.s.enmShadowMode == PGMMODE_PAE_NX
     
    728728    if (pVM->pgm.s.GCPhysGstCR3Monitored != NIL_RTGCPHYS)
    729729    {
    730         rc = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTXSUFF(pPool), PGMPOOL_IDX_PDPT);
     730        rc = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTX_SUFF(pPool), PGMPOOL_IDX_PDPT);
    731731        AssertRC(rc);
    732732    }
     
    738738        {
    739739            Assert(pVM->pgm.s.enmShadowMode == PGMMODE_PAE || pVM->pgm.s.enmShadowMode == PGMMODE_PAE_NX);
    740             int rc2 = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTXSUFF(pPool), PGMPOOL_IDX_PAE_PD_0 + i);
     740            int rc2 = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTX_SUFF(pPool), PGMPOOL_IDX_PAE_PD_0 + i);
    741741            AssertRC(rc2);
    742742            if (VBOX_FAILURE(rc2))
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r13046 r13060  
    491491int pgmPhysPageMap(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, PPPGMPAGEMAP ppMap, void **ppv)
    492492{
    493 #ifdef IN_GC
    494     /*
    495      * Just some sketchy GC code.
     493#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     494    /*
     495     * Just some sketchy GC/R0-darwin code.
    496496     */
    497497    *ppMap = NULL;
    498498    RTHCPHYS HCPhys = PGM_PAGE_GET_HCPHYS(pPage);
    499499    Assert(HCPhys != pVM->pgm.s.HCPhysZeroPg);
    500     return PGMGCDynMapHCPage(pVM, HCPhys, ppv);
     500    return PGMDynMapHCPage(pVM, HCPhys, ppv);
    501501
    502502#else /* IN_RING3 || IN_RING0 */
     
    557557
    558558
    559 #ifndef IN_GC
     559#if !defined(IN_GC) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    560560/**
    561561 * Load a guest page into the ring-3 physical TLB.
     
    613613    return VINF_SUCCESS;
    614614}
    615 #endif /* !IN_GC */
     615#endif /* !IN_GC && !VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
    616616
    617617
     
    644644{
    645645#ifdef VBOX_WITH_NEW_PHYS_CODE
    646 #ifdef IN_GC
    647     /* Until a physical TLB is implemented for GC, let PGMGCDynMapGCPageEx handle it. */
    648     return PGMGCDynMapGCPageEx(pVM, GCPhys, ppv);
     646# if defined(IN_GC) && defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     647    /* Until a physical TLB is implemented for GC or/and R0-darwin, let PGMDynMapGCPageEx handle it. */
     648    return PGMDynMapGCPageOff(pVM, GCPhys, ppv);
     649
    649650#else
    650651    int rc = pgmLock(pVM);
     
    697698     * Temporary fallback code.
    698699     */
    699 # ifdef IN_GC
    700     return PGMGCDynMapGCPageEx(pVM, GCPhys, ppv);
     700# if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     701    return PGMDynMapGCPageOff(pVM, GCPhys, ppv);
    701702# else
    702703    return PGMPhysGCPhys2HCPtr(pVM, GCPhys, 1, ppv);
     
    816817{
    817818#ifdef VBOX_WITH_NEW_PHYS_CODE
    818 #ifdef IN_GC
     819#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    819820    /* currently nothing to do here. */
    820821/* --- postponed
     
    11071108 * @thread  EMT.
    11081109 */
    1109 static void pgmPhysCacheAdd(PVM pVM, PGMPHYSCACHE *pCache, RTGCPHYS GCPhys, uint8_t *pbHC)
     1110static void pgmPhysCacheAdd(PVM pVM, PGMPHYSCACHE *pCache, RTGCPHYS GCPhys, uint8_t *pbR3)
    11101111{
    11111112    uint32_t iCacheIndex;
     
    11141115
    11151116    GCPhys = PHYS_PAGE_ADDRESS(GCPhys);
    1116     pbHC   = (uint8_t *)PAGE_ADDRESS(pbHC);
     1117    pbR3   = (uint8_t *)PAGE_ADDRESS(pbR3);
    11171118
    11181119    iCacheIndex = ((GCPhys >> PAGE_SHIFT) & PGM_MAX_PHYSCACHE_ENTRIES_MASK);
     
    11211122
    11221123    pCache->Entry[iCacheIndex].GCPhys = GCPhys;
    1123     pCache->Entry[iCacheIndex].pbHC   = pbHC;
     1124    pCache->Entry[iCacheIndex].pbR3   = pbR3;
    11241125}
    11251126#endif
     
    12191220                    if (rc == VINF_PGM_HANDLER_DO_DEFAULT)
    12201221                    {
    1221 #ifdef IN_GC /** @todo @bugref{3202}: R0 too */
     1222#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    12221223                        void *pvSrc = NULL;
    1223                         PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvSrc);
    1224                         pvSrc = (char *)pvSrc + (off & PAGE_OFFSET_MASK);
     1224                        PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvSrc);
    12251225#else
    12261226                        void *pvSrc = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    12681268                    if (rc == VINF_PGM_HANDLER_DO_DEFAULT)
    12691269                    {
    1270 #ifdef IN_GC  /** @todo @bugref{3202}: R0 too */
     1270#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    12711271                        void *pvSrc = NULL;
    1272                         PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvSrc);
    1273                         pvSrc = (char *)pvSrc + (off & PAGE_OFFSET_MASK);
     1272                        PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvSrc);
    12741273#else
    12751274                        void *pvSrc = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    12981297                        case MM_RAM_FLAGS_MMIO2: // MMIO2 isn't in the mask.
    12991298                        {
    1300 #ifdef IN_GC /** @todo @bugref{3202}: R0 too */
     1299#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    13011300                            void *pvSrc = NULL;
    1302                             PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvSrc);
    1303                             pvSrc = (char *)pvSrc + (off & PAGE_OFFSET_MASK);
     1301                            PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvSrc);
    13041302#else
    13051303                            void *pvSrc = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    15221520                        if (rc == VINF_PGM_HANDLER_DO_DEFAULT)
    15231521                        {
    1524 #ifdef IN_GC /** @todo @bugref{3202}: R0 too */
     1522#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    15251523                            void *pvDst = NULL;
    1526                             PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvDst);
    1527                             pvDst = (char *)pvDst + (off & PAGE_OFFSET_MASK);
     1524                            PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvDst);
    15281525#else
    15291526                            void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    15671564                        if (rc == VINF_PGM_HANDLER_DO_DEFAULT)
    15681565                        {
    1569 #ifdef IN_GC /** @todo @bugref{3202}: R0 too */
     1566#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    15701567                            void *pvDst = NULL;
    1571                             PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvDst);
    1572                             pvDst = (char *)pvDst + (off & PAGE_OFFSET_MASK);
     1568                            PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvDst);
    15731569#else
    15741570                            void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    16121608                    if (rc == VINF_PGM_HANDLER_DO_DEFAULT)
    16131609                    {
    1614 #ifdef IN_GC /** @todo @bugref{3202}: R0 too */
     1610#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    16151611                        void *pvDst = NULL;
    1616                         PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvDst);
    1617                         pvDst = (char *)pvDst + (off & PAGE_OFFSET_MASK);
     1612                        PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvDst);
    16181613#else
    16191614                        void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    16411636                        case MM_RAM_FLAGS_ROM | MM_RAM_FLAGS_MMIO2: /* shadow rom */
    16421637                        {
    1643 #ifdef IN_GC /** @todo @bugref{3202}: R0 too */
     1638#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    16441639                            void *pvDst = NULL;
    1645                             PGMGCDynMapHCPage(pVM, PGM_PAGE_GET_HCPHYS(pPage), &pvDst);
    1646                             pvDst = (char *)pvDst + (off & PAGE_OFFSET_MASK);
     1640                            PGMDynMapHCPageOff(pVM, PGM_PAGE_GET_HCPHYS(pPage) + (off & PAGE_OFFSET_MASK), &pvDst);
    16471641#else
    16481642                            void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
     
    17231717}
    17241718
    1725 #ifndef IN_GC /* Ring 0 & 3 only */  /** @todo @bugref{1865,3202}: this'll be fun! */
     1719#if !defined(IN_GC) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Ring 0 & 3 only */  /** @todo @bugref{1865,3202}: this'll be fun! */
    17261720
    17271721/**
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r13042 r13060  
    8787
    8888
    89 #ifdef IN_GC
     89#if defined(IN_GC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    9090/**
    9191 * Maps a pool page into the current context.
     
    9595 * @param   pPage   The page to map.
    9696 */
    97 void *pgmGCPoolMapPage(PVM pVM, PPGMPOOLPAGE pPage)
     97void *pgmPoolMapPage(PVM pVM, PPGMPOOLPAGE pPage)
    9898{
    9999    /* general pages. */
    100100    if (pPage->idx >= PGMPOOL_IDX_FIRST)
    101101    {
    102         Assert(pPage->idx < pVM->pgm.s.pPoolGC->cCurPages);
     102        Assert(pPage->idx < pVM->pgm.s.CTX_SUFF(pPool)->cCurPages);
    103103        void *pv;
    104         int rc = PGMGCDynMapHCPage(pVM, pPage->Core.Key, &pv);
     104        int rc = PGMDynMapHCPage(pVM, pPage->Core.Key, &pv);
    105105        AssertReleaseRC(rc);
    106106        return pv;
     
    108108
    109109    /* special pages. */
     110# ifdef IN_GC
    110111    switch (pPage->idx)
    111112    {
     
    127128            return NULL;
    128129    }
    129 }
    130 #endif /* IN_GC */
     130
     131# else  /* VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
     132    RTHCPHYS HCPhys;
     133    switch (pPage->idx)
     134    {
     135        case PGMPOOL_IDX_PD:
     136            HCPhys = pVM->pgm.s.HCPhys32BitPD;
     137            break;
     138        case PGMPOOL_IDX_PAE_PD:
     139        case PGMPOOL_IDX_PAE_PD_0:
     140            HCPhys = pVM->pgm.s.aHCPhysPaePDs[0];
     141            break;
     142        case PGMPOOL_IDX_PAE_PD_1:
     143            HCPhys = pVM->pgm.s.aHCPhysPaePDs[1];
     144            break;
     145        case PGMPOOL_IDX_PAE_PD_2:
     146            HCPhys = pVM->pgm.s.aHCPhysPaePDs[2];
     147            break;
     148        case PGMPOOL_IDX_PAE_PD_3:
     149            HCPhys = pVM->pgm.s.aHCPhysPaePDs[3];
     150            break;
     151        case PGMPOOL_IDX_PDPT:
     152            HCPhys = pVM->pgm.s.HCPhysPaePDPT;
     153            break;
     154        default:
     155            AssertReleaseMsgFailed(("Invalid index %d\n", pPage->idx));
     156            return NULL;
     157    }
     158    void *pv;
     159    int rc = PGMDynMapHCPage(pVM, pPage->Core.Key, &pv);
     160    AssertReleaseRC(rc);
     161    return pv;
     162# endif /* VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
     163}
     164#endif /* IN_GC || VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
    131165
    132166
     
    213247#ifdef IN_GC
    214248    return (const void *)((RTGCUINTPTR)pvFault & ~(RTGCUINTPTR)(cbEntry - 1));
     249
     250#elif defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     251    void *pvRet;
     252    int rc = PGMDynMapGCPageOff(pPool->pVMHC, GCPhysFault & ~(RTGCPHYS)(cbEntry - 1), &pvRet);
     253    AssertFatalRCSuccess(rc);
     254    return pvRet;
    215255
    216256#elif defined(IN_RING0)
     
    950990DECLEXPORT(int) pgmPoolAccessHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPHYS GCPhysFault, void *pvUser)
    951991{
    952     STAM_PROFILE_START(&pVM->pgm.s.CTXSUFF(pPool)->CTXSUFF(StatMonitor), a);
    953     PPGMPOOL        pPool = pVM->pgm.s.CTXSUFF(pPool);
     992    STAM_PROFILE_START(&pVM->pgm.s.CTX_SUFF(pPool)->CTXSUFF(StatMonitor), a);
     993    PPGMPOOL        pPool = pVM->pgm.s.CTX_SUFF(pPool);
    954994    PPGMPOOLPAGE    pPage = (PPGMPOOLPAGE)pvUser;
    955995    LogFlow(("pgmPoolAccessHandler: pvFault=%VGv pPage=%p:{.idx=%d} GCPhysFault=%VGp\n", pvFault, pPage, pPage->idx, GCPhysFault));
     
    9831023        {
    9841024             rc = pgmPoolAccessHandlerSimple(pVM, pPool, pPage, &Cpu, pRegFrame, GCPhysFault, pvFault);
    985              STAM_PROFILE_STOP_EX(&pVM->pgm.s.CTXSUFF(pPool)->CTXSUFF(StatMonitor), &pPool->CTXMID(StatMonitor,Handled), a);
     1025             STAM_PROFILE_STOP_EX(&pVM->pgm.s.CTX_SUFF(pPool)->CTXSUFF(StatMonitor), &pPool->CTXMID(StatMonitor,Handled), a);
    9861026             return rc;
    9871027        }
     
    10051045        {
    10061046             rc = pgmPoolAccessHandlerSTOSD(pVM, pPool, pPage, &Cpu, pRegFrame, GCPhysFault, pvFault);
    1007              STAM_PROFILE_STOP_EX(&pVM->pgm.s.CTXSUFF(pPool)->CTXSUFF(StatMonitor), &pPool->CTXMID(StatMonitor,RepStosd), a);
     1047             STAM_PROFILE_STOP_EX(&pVM->pgm.s.CTX_SUFF(pPool)->CTXSUFF(StatMonitor), &pPool->CTXMID(StatMonitor,RepStosd), a);
    10081048             return rc;
    10091049        }
     
    10261066    if (rc == VINF_EM_RAW_EMULATE_INSTR && fReused)
    10271067        rc = VINF_SUCCESS;
    1028     STAM_PROFILE_STOP_EX(&pVM->pgm.s.CTXSUFF(pPool)->CTXSUFF(StatMonitor), &pPool->CTXMID(StatMonitor,FlushPage), a);
     1068    STAM_PROFILE_STOP_EX(&pVM->pgm.s.CTX_SUFF(pPool)->CTXSUFF(StatMonitor), &pPool->CTXMID(StatMonitor,FlushPage), a);
    10291069    return rc;
    10301070}
     
    18361876void pgmPoolMonitorModifiedClearAll(PVM pVM)
    18371877{
    1838     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     1878    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    18391879    LogFlow(("pgmPoolMonitorModifiedClearAll: cModifiedPages=%d\n", pPool->cModifiedPages));
    18401880
     
    18651905void pgmPoolClearAll(PVM pVM)
    18661906{
    1867     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     1907    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    18681908    STAM_PROFILE_START(&pPool->StatClearAll, c);
    18691909    LogFlow(("pgmPoolClearAll: cUsedPages=%d\n", pPool->cUsedPages));
     
    23752415{
    23762416    LogFlow(("pgmPoolTrackFlushGCPhysPT: HCPhys=%RHp iShw=%d cRefs=%d\n", pPhysPage->HCPhys, iShw, cRefs));
    2377     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     2417    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    23782418
    23792419    /*
     
    24632503void pgmPoolTrackFlushGCPhysPT(PVM pVM, PPGMPAGE pPhysPage, uint16_t iShw, uint16_t cRefs)
    24642504{
    2465     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool); NOREF(pPool);
     2505    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool); NOREF(pPool);
    24662506    LogFlow(("pgmPoolTrackFlushGCPhysPT: HCPhys=%RHp iShw=%d cRefs=%d\n", pPhysPage->HCPhys, iShw, cRefs));
    24672507    STAM_PROFILE_START(&pPool->StatTrackFlushGCPhysPT, f);
     
    24812521void pgmPoolTrackFlushGCPhysPTs(PVM pVM, PPGMPAGE pPhysPage, uint16_t iPhysExt)
    24822522{
    2483     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     2523    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    24842524    STAM_PROFILE_START(&pPool->StatTrackFlushGCPhysPTs, f);
    24852525    LogFlow(("pgmPoolTrackFlushGCPhysPTs: HCPhys=%RHp iPhysExt\n", pPhysPage->HCPhys, iPhysExt));
     
    25282568int pgmPoolTrackFlushGCPhysPTsSlow(PVM pVM, PPGMPAGE pPhysPage)
    25292569{
    2530     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     2570    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    25312571    STAM_PROFILE_START(&pPool->StatTrackFlushGCPhysPTsSlow, s);
    25322572    LogFlow(("pgmPoolTrackFlushGCPhysPTsSlow: cUsedPages=%d cPresent=%d HCPhys=%RHp\n",
     
    27642804PPGMPOOLPHYSEXT pgmPoolTrackPhysExtAlloc(PVM pVM, uint16_t *piPhysExt)
    27652805{
    2766     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     2806    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    27672807    uint16_t iPhysExt = pPool->iPhysExtFreeHead;
    27682808    if (iPhysExt == NIL_PGMPOOL_PHYSEXT_INDEX)
     
    27872827void pgmPoolTrackPhysExtFree(PVM pVM, uint16_t iPhysExt)
    27882828{
    2789     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     2829    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    27902830    Assert(iPhysExt < pPool->cMaxPhysExts);
    27912831    PPGMPOOLPHYSEXT pPhysExt = &pPool->CTXSUFF(paPhysExts)[iPhysExt];
     
    28052845void pgmPoolTrackPhysExtFreeList(PVM pVM, uint16_t iPhysExt)
    28062846{
    2807     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     2847    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    28082848
    28092849    const uint16_t  iPhysExtStart = iPhysExt;
     
    28362876static uint16_t pgmPoolTrackPhysExtInsert(PVM pVM, uint16_t iPhysExt, uint16_t iShwPT)
    28372877{
    2838     PPGMPOOL        pPool = pVM->pgm.s.CTXSUFF(pPool);
     2878    PPGMPOOL        pPool = pVM->pgm.s.CTX_SUFF(pPool);
    28392879    PPGMPOOLPHYSEXT paPhysExts = pPool->CTXSUFF(paPhysExts);
    28402880
     
    38753915int pgmPoolAlloc(PVM pVM, RTGCPHYS GCPhys, PGMPOOLKIND enmKind, uint16_t iUser, uint32_t iUserTable, PPPGMPOOLPAGE ppPage)
    38763916{
    3877     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     3917    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    38783918    STAM_PROFILE_ADV_START(&pPool->StatAlloc, a);
    38793919    LogFlow(("pgmPoolAlloc: GCPhys=%VGp enmKind=%d iUser=%#x iUserTable=%#x\n", GCPhys, enmKind, iUser, iUserTable));
     
    39984038{
    39994039    LogFlow(("pgmPoolFree: HCPhys=%VHp iUser=%#x iUserTable=%#x\n", HCPhys, iUser, iUserTable));
    4000     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     4040    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    40014041    pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, HCPhys), iUser, iUserTable);
    40024042}
     
    40144054{
    40154055    /** @todo profile this! */
    4016     PPGMPOOL pPool = pVM->pgm.s.CTXSUFF(pPool);
     4056    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    40174057    PPGMPOOLPAGE pPage = pgmPoolGetPage(pPool, HCPhys);
    40184058    Log3(("pgmPoolGetPageByHCPhys: HCPhys=%VHp -> %p:{.idx=%d .GCPhys=%VGp .enmKind=%d}\n",
     
    40334073{
    40344074    LogFlow(("pgmPoolFlushAll:\n"));
    4035     pgmPoolFlushAllInt(pVM->pgm.s.CTXSUFF(pPool));
    4036 }
    4037 
     4075    pgmPoolFlushAllInt(pVM->pgm.s.CTX_SUFF(pPool));
     4076}
     4077
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