VirtualBox

Changeset 31870 in vbox


Ignore:
Timestamp:
Aug 23, 2010 3:42:59 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
65078
Message:

PGM: Don't sync unnecessary PTE bits.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGMGstDefs.h

    r31849 r31870  
    4747#undef GST_PDPT_MASK
    4848#undef GST_PDPE_PG_MASK
     49#undef GST_GET_PTE_GCPHYS
    4950#undef GST_GET_PDE_GCPHYS
    5051#undef GST_GET_BIG_PDE_GCPHYS
     
    106107#  endif
    107108# endif
    108 # define GST_GET_PTE_SHW_FLAGS(pVCpu, Pte)      (true && This_should_perhaps_not_be_used_in_this_context) //??
     109# define GST_GET_PTE_GCPHYS(Pte)                ((Pte).u & GST_PTE_PG_MASK)
     110# define GST_GET_PDE_GCPHYS(Pde)                (true && This_should_perhaps_not_be_used_in_this_context) //??
     111# define GST_GET_BIG_PDE_GCPHYS(Pde)            (true && This_should_perhaps_not_be_used_in_this_context) //??
     112# define GST_GET_PTE_SHW_FLAGS(pVCpu, Pte)      ((Pte).u & (X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D | X86_PTE_G)) /**< @todo Could return P|RW|US|A|D here without consulting the PTE. */
    109113# define GST_GET_PDE_SHW_FLAGS(pVCpu, Pde)      (true && This_should_perhaps_not_be_used_in_this_context) //??
    110114# define GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, Pde)  (true && This_should_perhaps_not_be_used_in_this_context) //??
     
    134138# define GST_PDE_PG_MASK                        X86_PDE_PG_MASK
    135139# define GST_PDE_BIG_PG_MASK                    X86_PDE4M_PG_MASK
     140# define GST_GET_PTE_GCPHYS(Pte)                ((Pte).u & GST_PDE_PG_MASK)
    136141# define GST_GET_PDE_GCPHYS(Pde)                ((Pde).u & GST_PDE_PG_MASK)
    137142# define GST_GET_BIG_PDE_GCPHYS(pVM, Pde)       pgmGstGet4MBPhysPage(&(pVM)->pgm.s, Pde)
     
    173178# define GST_PDE_PG_MASK                        X86_PDE_PAE_PG_MASK_FULL
    174179# define GST_PDE_BIG_PG_MASK                    X86_PDE2M_PAE_PG_MASK
    175 # define GST_GET_PDE_GCPHYS(Pde)                ((Pde).u & X86_PDE_PAE_PG_MASK_FULL)
     180# define GST_GET_PTE_GCPHYS(Pte)                ((Pte).u & GST_PTE_PG_MASK)
     181# define GST_GET_PDE_GCPHYS(Pde)                ((Pde).u & GST_PDE_PG_MASK)
    176182# define GST_GET_BIG_PDE_GCPHYS(pVM, Pde)       ((Pde).u & GST_PDE_BIG_PG_MASK)
    177183# define GST_GET_PTE_SHW_FLAGS(pVCpu, Pte)      ((Pte).u & (pVCpu)->pgm.s.fGst64ShadowedPteMask )
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r31849 r31870  
    405405    PVM pVM = pVCpu->CTX_SUFF(pVM);
    406406
    407     Log(("PGMTrap0eHandler: uErr=%RGx pvFault=%RGv eip=%04x:%RGv\n", uErr, pvFault, pRegFrame->cs, (RTGCPTR)pRegFrame->rip));
     407    Log(("PGMTrap0eHandler: uErr=%RGx pvFault=%RGv eip=%04x:%RGv cr3=%RGp\n", uErr, pvFault, pRegFrame->cs, (RTGCPTR)pRegFrame->rip, (RTGCPHYS)CPUMGetGuestCR3(pVCpu)));
    408408    STAM_PROFILE_START(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0e, a);
    409409    STAM_STATS({ pVCpu->pgm.s.CTX_SUFF(pStatTrap0eAttribution) = NULL; } );
     
    11911191
    11921192    *ppPD = (PX86PDPAE)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPage);
     1193Log4(("pgmShwGetLongModePDPtr %RGv -> *ppPD=%p PDE=%p/%RX64\n", GCPtr, *ppPD, &(*ppPD)->a[(GCPtr >> X86_PD_PAE_SHIFT) & X86_PD_PAE_MASK], (*ppPD)->a[(GCPtr >> X86_PD_PAE_SHIFT) & X86_PD_PAE_MASK].u));
    11931194    return VINF_SUCCESS;
    11941195}
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r31851 r31870  
    14791479 * @param   pVM         The VM handle.
    14801480 * @param   pPage       The page in question.
    1481  * @param   fPteSrc     The flags of the source PTE.
     1481 * @param   fPteSrc     The shadowed flags of the source PTE.  Must include the
     1482 *                      A (accessed) bit so it can be emulated correctly.
    14821483 * @param   pPteDst     The shadow PTE (output).  This is temporary storage and
    14831484 *                      does not need to be set atomically.
    14841485 */
    1485 DECLINLINE(void) PGM_BTH_NAME(SyncHandlerPte)(PVM pVM, PCPGMPAGE pPage, uint32_t fPteSrc, PSHWPTE pPteDst)
     1486DECLINLINE(void) PGM_BTH_NAME(SyncHandlerPte)(PVM pVM, PCPGMPAGE pPage, uint64_t fPteSrc, PSHWPTE pPteDst)
    14861487{
    14871488    /** @todo r=bird: Are we actually handling dirty and access bits for pages with access handlers correctly? No.
     
    14981499        /* PteDst.n.u1Write = 0 && PteDst.n.u1Size = 0 */
    14991500#else
    1500         SHW_PTE_SET(*pPteDst,
    1501                       (fPteSrc & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT | X86_PTE_RW))
    1502                     | PGM_PAGE_GET_HCPHYS(pPage));
     1501        if (fPteSrc & X86_PTE_A)
     1502        {
     1503            SHW_PTE_SET(*pPteDst, fPteSrc | PGM_PAGE_GET_HCPHYS(pPage));
     1504            SHW_PTE_SET_RO(*pPteDst);
     1505        }
     1506        else
     1507            SHW_PTE_SET(*pPteDst, 0);
    15031508#endif
    15041509    }
     
    15801585         */
    15811586        PPGMPAGE pPage;
    1582         int rc = pgmPhysGetPageEx(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK, &pPage);
     1587        int rc = pgmPhysGetPageEx(&pVM->pgm.s, GST_GET_PTE_GCPHYS(PteSrc), &pPage);
    15831588        if (RT_SUCCESS(rc))
    15841589        {
     
    16081613               )
    16091614            {
    1610                 rc = pgmPhysPageMakeWritable(pVM, pPage, PteSrc.u & GST_PTE_PG_MASK);
     1615                rc = pgmPhysPageMakeWritable(pVM, pPage, GST_GET_PTE_GCPHYS(PteSrc));
    16111616                AssertRC(rc);
    16121617            }
     
    16181623            SHWPTE PteDst;
    16191624            if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    1620                 PGM_BTH_NAME(SyncHandlerPte)(pVM, pPage,
    1621                                              PteSrc.u & ~(  X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK
    1622                                                           | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT),
    1623                                              &PteDst);
     1625                PGM_BTH_NAME(SyncHandlerPte)(pVM, pPage, GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc), &PteDst);
    16241626            else
    16251627            {
     
    16431645                    STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,DirtyPage));
    16441646                    SHW_PTE_SET(PteDst,
    1645                                   (PteSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT | X86_PTE_RW))
     1647                                  GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc)
    16461648                                | PGM_PAGE_GET_HCPHYS(pPage)
    16471649                                | PGM_PTFLAGS_TRACK_DIRTY);
     1650                    SHW_PTE_SET_RO(PteDst);
    16481651                }
    16491652                else
     
    16601663                    /* PteDst.n.u1Size = 0 */
    16611664#else
    1662                     SHW_PTE_SET(PteDst,
    1663                                   (PteSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT))
    1664                                 | PGM_PAGE_GET_HCPHYS(pPage));
     1665                    SHW_PTE_SET(PteDst, GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc) | PGM_PAGE_GET_HCPHYS(pPage));
    16651666#endif
    16661667                }
     
    16751676                    Assert(!PGM_PAGE_IS_ZERO(pPage));
    16761677                    SHW_PTE_SET_RO(PteDst);   /** @todo this isn't quite working yet. Why, isn't it? */
    1677                     Log3(("SyncPageWorker: write-protecting %RGp pPage=%R[pgmpage]at iPTDst=%d\n", (RTGCPHYS)(PteSrc.u & X86_PTE_PAE_PG_MASK), pPage, iPTDst));
     1678                    Log3(("SyncPageWorker: write-protecting %RGp pPage=%R[pgmpage]at iPTDst=%d\n", (RTGCPHYS)GST_GET_PTE_GCPHYS(PteSrc), pPage, iPTDst));
    16781679                }
    16791680            }
     
    19251926                                      GCPtrCurPage, PteSrc.n.u1Present,
    19261927                                      PteSrc.n.u1Write & PdeSrc.n.u1Write,
    1927                                       PteSrc.n.u1User & PdeSrc.n.u1User,
     1928                                      PteSrc.n.u1User  & PdeSrc.n.u1User,
    19281929                                      (uint64_t)PteSrc.u,
    19291930                                      SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     
    19421943                              GCPtrPage, PteSrc.n.u1Present,
    19431944                              PteSrc.n.u1Write & PdeSrc.n.u1Write,
    1944                               PteSrc.n.u1User & PdeSrc.n.u1User,
     1945                              PteSrc.n.u1User  & PdeSrc.n.u1User,
    19451946                              (uint64_t)PteSrc.u,
    19461947                              SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     
    21812182                      GCPtrCurPage, PteSrc.n.u1Present,
    21822183                      PteSrc.n.u1Write & PdeSrc.n.u1Write,
    2183                       PteSrc.n.u1User & PdeSrc.n.u1User,
     2184                      PteSrc.n.u1User  & PdeSrc.n.u1User,
    21842185                      (uint64_t)PteSrc.u,
    21852186                      SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     
    22122213              GCPtrPage, PteSrc.n.u1Present,
    22132214              PteSrc.n.u1Write & PdeSrc.n.u1Write,
    2214               PteSrc.n.u1User & PdeSrc.n.u1User,
     2215              PteSrc.n.u1User  & PdeSrc.n.u1User,
    22152216              (uint64_t)PteSrc.u,
    22162217              SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     
    23992400                if (SHW_PTE_IS_TRACK_DIRTY(*pPteDst))
    24002401                {
    2401                     PPGMPAGE pPage  = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & GST_PTE_PG_MASK);
     2402                    PPGMPAGE pPage  = pgmPhysGetPage(&pVM->pgm.s, GST_GET_PTE_GCPHYS(*pPteSrc));
    24022403                    SHWPTE   PteDst = *pPteDst;
    24032404
     
    24252426                                && PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM)
    24262427                            {
    2427                                 rc = pgmPhysPageMakeWritable(pVM, pPage, pPteSrc->u & GST_PTE_PG_MASK);
     2428                                rc = pgmPhysPageMakeWritable(pVM, pPage, GST_GET_PTE_GCPHYS(*pPteSrc));
    24282429                                AssertRC(rc);
    24292430                            }
     
    27492750                const unsigned  iPTDstEnd = RT_ELEMENTS(pPTDst->a);
    27502751# endif /* !PGM_SYNC_N_PAGES */
     2752                RTGCPTR         GCPtrCur  = (GCPtrPage & ~(RTGCPTR)((1 << SHW_PD_SHIFT) - 1))
     2753                                          | ((RTGCPTR)iPTDst << PAGE_SHIFT);
    27512754# if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    27522755                /* Select the right PDE as we're emulating a 4kb page table with 2 shadow page tables. */
     
    27552758                const unsigned  offPTSrc  = 0;
    27562759# endif
    2757                 for (; iPTDst < iPTDstEnd; iPTDst++)
     2760                for (; iPTDst < iPTDstEnd; iPTDst++, GCPtrCur += PAGE_SIZE)
    27582761                {
    27592762                    const unsigned iPTSrc = iPTDst + offPTSrc;
     
    27702773                        PPGMPAGE pPage;
    27712774                        if (    ((PdeSrc.u & pPTSrc->a[iPTSrc].u) & (X86_PTE_RW | X86_PTE_US))
    2772                             ||  !CSAMDoesPageNeedScanning(pVM, (iPDSrc << GST_PD_SHIFT) | (iPTSrc << PAGE_SHIFT))
    2773                             ||  (   (pPage = pgmPhysGetPage(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK))
     2775                            ||  !CSAMDoesPageNeedScanning(pVM, GCPtrCur)
     2776                            ||  (   (pPage = pgmPhysGetPage(&pVM->pgm.s, GST_GET_PTE_GCPHYS(PteSrc)))
    27742777                                 &&  PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    27752778                           )
     
    27772780                            PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
    27782781                        Log2(("SyncPT:   4K+ %RGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s dst.raw=%08llx iPTSrc=%x PdeSrc.u=%x physpte=%RGp\n",
    2779                               (RTGCPTR)(((RTGCPTR)iPDSrc << GST_PD_SHIFT) | ((RTGCPTR)iPTSrc << PAGE_SHIFT)),
     2782                              GCPtrCur,
    27802783                              PteSrc.n.u1Present,
    27812784                              PteSrc.n.u1Write & PdeSrc.n.u1Write,
    2782                               PteSrc.n.u1User & PdeSrc.n.u1User,
     2785                              PteSrc.n.u1User  & PdeSrc.n.u1User,
    27832786                              (uint64_t)PteSrc.u,
    27842787                              SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : "", SHW_PTE_LOG64(pPTDst->a[iPTDst]), iPTSrc, PdeSrc.au32[0],
     
    39873990                            /* match the physical addresses */
    39883991                            HCPhysShw = SHW_PTE_GET_HCPHYS(PteDst);
    3989                             GCPhysGst = PteSrc.u & GST_PTE_PG_MASK;
     3992                            GCPhysGst = GST_GET_PTE_GCPHYS(PteSrc);
    39903993
    39913994# ifdef IN_RING3
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r31851 r31870  
    174174void pgmPoolMonitorChainChanging(PVMCPU pVCpu, PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTGCPHYS GCPhysFault, CTXTYPE(RTGCPTR, RTHCPTR, RTGCPTR) pvAddress, unsigned cbWrite)
    175175{
    176     AssertMsg(pPage->iMonitoredPrev == NIL_PGMPOOL_IDX, ("%#x (idx=%#x)\n", pPage->iMonitoredPrev, pPage->idx));
     176    AssertMsg(pPage->iMonitoredPrev == NIL_PGMPOOL_IDX, ("%u (idx=%u)\n", pPage->iMonitoredPrev, pPage->idx));
    177177    const unsigned off     = GCPhysFault & PAGE_OFFSET_MASK;
    178178    PVM pVM = pPool->CTX_SUFF(pVM);
     
    18031803            if (i == NIL_PGMPOOL_IDX)
    18041804            {
    1805                 AssertReleaseMsgFailed(("GCPhys=%RGp idx=%#x\n", pPage->GCPhys, pPage->idx));
     1805                AssertReleaseMsgFailed(("GCPhys=%RGp idx=%d\n", pPage->GCPhys, pPage->idx));
    18061806                break;
    18071807            }
     
    20062006     */
    20072007    unsigned i = pPool->aiHash[PGMPOOL_HASH(GCPhys)];
    2008     Log3(("pgmPoolCacheAlloc: %RGp kind %s iUser=%x iUserTable=%x SLOT=%d\n", GCPhys, pgmPoolPoolKindToStr(enmKind), iUser, iUserTable, i));
     2008    Log3(("pgmPoolCacheAlloc: %RGp kind %s iUser=%d iUserTable=%x SLOT=%d\n", GCPhys, pgmPoolPoolKindToStr(enmKind), iUser, iUserTable, i));
    20092009    if (i != NIL_PGMPOOL_IDX)
    20102010    {
     
    26242624    PPGMPOOLUSER paUsers = pPool->CTX_SUFF(paUsers);
    26252625
    2626     LogFlow(("pgmPoolTrackInsert GCPhys=%RGp iUser %x iUserTable %x\n", GCPhys, iUser, iUserTable));
     2626    LogFlow(("pgmPoolTrackInsert GCPhys=%RGp iUser=%d iUserTable=%x\n", GCPhys, iUser, iUserTable));
    26272627
    26282628#ifdef VBOX_STRICT
     
    28132813
    28142814    /* Fatal: didn't find it */
    2815     AssertFatalMsgFailed(("Didn't find the user entry! iUser=%#x iUserTable=%#x GCPhys=%RGp\n",
     2815    AssertFatalMsgFailed(("Didn't find the user entry! iUser=%d iUserTable=%#x GCPhys=%RGp\n",
    28162816                          iUser, iUserTable, pPage->GCPhys));
    28172817}
     
    36513651
    36523652        default:
    3653             AssertFatalMsgFailed(("enmKind=%d iUser=%#x iUserTable=%#x\n", pUserPage->enmKind, pUser->iUser, pUser->iUserTable));
     3653            AssertFatalMsgFailed(("enmKind=%d iUser=%d iUserTable=%#x\n", pUserPage->enmKind, pUser->iUser, pUser->iUserTable));
    36543654    }
    36553655    PGM_DYNMAP_UNUSED_HINT_VM(pPool->CTX_SUFF(pVM), u.pau64);
     
    46784678
    46794679    STAM_PROFILE_START(&pPool->StatFree, a);
    4680     LogFlow(("pgmPoolFreeByPage: pPage=%p:{.Key=%RHp, .idx=%d, enmKind=%s} iUser=%#x iUserTable=%#x\n",
     4680    LogFlow(("pgmPoolFreeByPage: pPage=%p:{.Key=%RHp, .idx=%d, enmKind=%s} iUser=%d iUserTable=%#x\n",
    46814681             pPage, pPage->Core.Key, pPage->idx, pgmPoolPoolKindToStr(pPage->enmKind), iUser, iUserTable));
    46824682    Assert(pPage->idx >= PGMPOOL_IDX_FIRST);
     
    47054705    PVM pVM = pPool->CTX_SUFF(pVM);
    47064706
    4707     LogFlow(("pgmPoolMakeMoreFreePages: iUser=%#x\n", iUser));
     4707    LogFlow(("pgmPoolMakeMoreFreePages: iUser=%d\n", iUser));
    47084708
    47094709    /*
     
    47634763    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    47644764    STAM_PROFILE_ADV_START(&pPool->StatAlloc, a);
    4765     LogFlow(("pgmPoolAlloc: GCPhys=%RGp enmKind=%s iUser=%#x iUserTable=%#x\n", GCPhys, pgmPoolPoolKindToStr(enmKind), iUser, iUserTable));
     4765    LogFlow(("pgmPoolAllocEx: GCPhys=%RGp enmKind=%s iUser=%d iUserTable=%#x\n", GCPhys, pgmPoolPoolKindToStr(enmKind), iUser, iUserTable));
    47664766    *ppPage = NULL;
    47674767    /** @todo CSAM/PGMPrefetchPage messes up here during CSAMR3CheckGates
     
    47804780            pgmUnlock(pVM);
    47814781            STAM_PROFILE_ADV_STOP(&pPool->StatAlloc, a);
    4782             LogFlow(("pgmPoolAlloc: cached returns %Rrc *ppPage=%p:{.Key=%RHp, .idx=%d}\n", rc2, *ppPage, (*ppPage)->Core.Key, (*ppPage)->idx));
     4782            LogFlow(("pgmPoolAllocEx: cached returns %Rrc *ppPage=%p:{.Key=%RHp, .idx=%d}\n", rc2, *ppPage, (*ppPage)->Core.Key, (*ppPage)->idx));
    47834783            return rc2;
    47844784        }
     
    47964796        {
    47974797            pgmUnlock(pVM);
    4798             Log(("pgmPoolAlloc: returns %Rrc (Free)\n", rc));
     4798            Log(("pgmPoolAllocEx: returns %Rrc (Free)\n", rc));
    47994799            STAM_PROFILE_ADV_STOP(&pPool->StatAlloc, a);
    48004800            return rc;
     
    48474847        pgmUnlock(pVM);
    48484848        STAM_PROFILE_ADV_STOP(&pPool->StatAlloc, a);
    4849         Log(("pgmPoolAlloc: returns %Rrc (Insert)\n", rc3));
     4849        Log(("pgmPoolAllocEx: returns %Rrc (Insert)\n", rc3));
    48504850        return rc3;
    48514851    }
     
    48714871        pgmPoolLockPage(pPool, pPage);
    48724872    pgmUnlock(pVM);
    4873     LogFlow(("pgmPoolAlloc: returns %Rrc *ppPage=%p:{.Key=%RHp, .idx=%d, .fCached=%RTbool, .fMonitored=%RTbool}\n",
     4873    LogFlow(("pgmPoolAllocEx: returns %Rrc *ppPage=%p:{.Key=%RHp, .idx=%d, .fCached=%RTbool, .fMonitored=%RTbool}\n",
    48744874             rc, pPage, pPage->Core.Key, pPage->idx, pPage->fCached, pPage->fMonitored));
    48754875    STAM_PROFILE_ADV_STOP(&pPool->StatAlloc, a);
     
    48884888void pgmPoolFree(PVM pVM, RTHCPHYS HCPhys, uint16_t iUser, uint32_t iUserTable)
    48894889{
    4890     LogFlow(("pgmPoolFree: HCPhys=%RHp iUser=%#x iUserTable=%#x\n", HCPhys, iUser, iUserTable));
     4890    LogFlow(("pgmPoolFree: HCPhys=%RHp iUser=%d iUserTable=%#x\n", HCPhys, iUser, iUserTable));
    48914891    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    48924892    pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, HCPhys), iUser, iUserTable);
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