VirtualBox

Ignore:
Timestamp:
Sep 28, 2010 9:38:35 AM (14 years ago)
Author:
vboxsync
Message:

Cleaned up SyncPageWorker for non-paging modes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r32778 r32785  
    3737static int PGM_BTH_NAME(CheckDirtyPageFault)(PVMCPU pVCpu, uint32_t uErr, PSHWPDE pPdeDst, GSTPDE const *pPdeSrc, RTGCPTR GCPtrPage);
    3838static int PGM_BTH_NAME(SyncPT)(PVMCPU pVCpu, unsigned iPD, PGSTPD pPDSrc, RTGCPTR GCPtrPage);
     39#if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    3940static void PGM_BTH_NAME(SyncPageWorker)(PVMCPU pVCpu, PSHWPTE pPteDst, GSTPDE PdeSrc, GSTPTE PteSrc, PPGMPOOLPAGE pShwPage, unsigned iPTDst);
     41#else
     42static void PGM_BTH_NAME(SyncPageWorker)(PVMCPU pVCpu, PSHWPTE pPteDst, RTGCPHYS GCPhysPage, PPGMPOOLPAGE pShwPage, unsigned iPTDst);
     43#endif
    4044PGM_BTH_DECL(int, VerifyAccessSyncPage)(PVMCPU pVCpu, RTGCPTR Addr, unsigned fPage, unsigned uErr);
    4145PGM_BTH_DECL(int, PrefetchPage)(PVMCPU pVCpu, RTGCPTR GCPtrPage);
     
    15811585 * @remark  Not used for 2/4MB pages!
    15821586 */
     1587#if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    15831588static void PGM_BTH_NAME(SyncPageWorker)(PVMCPU pVCpu, PSHWPTE pPteDst, GSTPDE PdeSrc, GSTPTE PteSrc,
    15841589                                         PPGMPOOLPAGE pShwPage, unsigned iPTDst)
     1590#else
     1591static void PGM_BTH_NAME(SyncPageWorker)(PVMCPU pVCpu, PSHWPTE pPteDst, RTGCPHYS GCPhysPage, PPGMPOOLPAGE pShwPage, unsigned iPTDst)
     1592#endif
    15851593{
    15861594    PVM      pVM = pVCpu->CTX_SUFF(pVM);
     
    16041612#endif
    16051613
     1614#if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    16061615    if (   PteSrc.n.u1Present
    16071616        && GST_IS_PTE_VALID(pVCpu, PteSrc))
    1608     {
     1617#endif
     1618    {
     1619# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
     1620        RTGCPHYS GCPhysPage = GST_GET_PTE_GCPHYS(PteSrc);
     1621# endif
    16091622        /*
    16101623         * Find the ram range.
    16111624         */
    16121625        PPGMPAGE pPage;
    1613         int rc = pgmPhysGetPageEx(&pVM->pgm.s, GST_GET_PTE_GCPHYS(PteSrc), &pPage);
     1626        int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysPage, &pPage);
    16141627        if (RT_SUCCESS(rc))
    16151628        {
     
    16271640            if (    PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
    16281641                &&  (   PGM_PAGE_IS_ZERO(pPage)
     1642# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    16291643                     || (   PteSrc.n.u1Write
     1644# else
     1645                     || (   1
     1646# endif
    16301647                         && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
    16311648# ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     
    16391656               )
    16401657            {
    1641                 rc = pgmPhysPageMakeWritable(pVM, pPage, GST_GET_PTE_GCPHYS(PteSrc));
     1658                rc = pgmPhysPageMakeWritable(pVM, pPage, GCPhysPage);
    16421659                AssertRC(rc);
    16431660            }
     
    16481665             */
    16491666            SHWPTE PteDst;
     1667# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
     1668            uint64_t fGstShwPteFlags = GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc);
     1669# else
     1670            uint64_t fGstShwPteFlags = X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D;
     1671# endif
    16501672            if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    1651                 PGM_BTH_NAME(SyncHandlerPte)(pVM, pPage, GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc), &PteDst);
     1673                PGM_BTH_NAME(SyncHandlerPte)(pVM, pPage, fGstShwPteFlags, &PteDst);
    16521674            else
    16531675            {
     
    16711693                    STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,DirtyPage));
    16721694                    SHW_PTE_SET(PteDst,
    1673                                   GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc)
     1695                                  fGstShwPteFlags
    16741696                                | PGM_PAGE_GET_HCPHYS(pPage)
    16751697                                | PGM_PTFLAGS_TRACK_DIRTY);
     
    16891711                    /* PteDst.n.u1Size = 0 */
    16901712#else
    1691                     SHW_PTE_SET(PteDst, GST_GET_PTE_SHW_FLAGS(pVCpu, PteSrc) | PGM_PAGE_GET_HCPHYS(pPage));
     1713                    SHW_PTE_SET(PteDst, fGstShwPteFlags | PGM_PAGE_GET_HCPHYS(pPage));
    16921714#endif
    16931715                }
     
    17021724                    Assert(!PGM_PAGE_IS_ZERO(pPage));
    17031725                    SHW_PTE_SET_RO(PteDst);   /** @todo this isn't quite working yet. Why, isn't it? */
    1704                     Log3(("SyncPageWorker: write-protecting %RGp pPage=%R[pgmpage]at iPTDst=%d\n", (RTGCPHYS)GST_GET_PTE_GCPHYS(PteSrc), pPage, iPTDst));
     1726                    Log3(("SyncPageWorker: write-protecting %RGp pPage=%R[pgmpage]at iPTDst=%d\n", GCPhysPage, pPage, iPTDst));
    17051727                }
    17061728            }
     
    17401762        Log2(("SyncPageWorker: invalid address in Pte\n"));
    17411763    }
     1764#if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    17421765    else if (!PteSrc.n.u1Present)
    17431766        Log2(("SyncPageWorker: page not present in Pte\n"));
    17441767    else
    17451768        Log2(("SyncPageWorker: invalid Pte\n"));
     1769#endif
    17461770
    17471771    /*
     
    22082232            {
    22092233                RTGCPTR GCPtrCurPage = (GCPtrPage & ~(RTGCPTR)(SHW_PT_MASK << SHW_PT_SHIFT)) | (iPTDst << PAGE_SHIFT);
    2210                 GSTPTE  PteSrc;
    2211 
    2212                 /* Fake the page table entry */
    2213                 PteSrc.u = GCPtrCurPage;
    2214                 PteSrc.n.u1Present  = 1;
    2215                 PteSrc.n.u1Dirty    = 1;
    2216                 PteSrc.n.u1Accessed = 1;
    2217                 PteSrc.n.u1Write    = 1;
    2218                 PteSrc.n.u1User     = 1;
    2219 
    2220                 PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
    2221                 Log2(("SyncPage: 4K+ %RGv PteSrc:{P=%d RW=%d U=%d raw=%08llx} PteDst=%08llx%s\n",
    2222                       GCPtrCurPage, PteSrc.n.u1Present,
    2223                       PteSrc.n.u1Write & PdeSrc.n.u1Write,
    2224                       PteSrc.n.u1User  & PdeSrc.n.u1User,
    2225                       (uint64_t)PteSrc.u,
     2234
     2235                PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], GCPtrCurPage, pShwPage, iPTDst);
     2236                Log2(("SyncPage: 4K+ %RGv PteSrc:{P=1 RW=1 U=1} PteDst=%08llx%s\n",
     2237                      GCPtrCurPage,
    22262238                      SHW_PTE_LOG64(pPTDst->a[iPTDst]),
    22272239                      SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
     
    22392251        const unsigned  iPTDst       = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    22402252        RTGCPTR         GCPtrCurPage = (GCPtrPage & ~(RTGCPTR)(SHW_PT_MASK << SHW_PT_SHIFT)) | (iPTDst << PAGE_SHIFT);
    2241         GSTPTE          PteSrc;
    2242 
    2243         /* Fake the page table entry */
    2244         PteSrc.u = GCPtrCurPage;
    2245         PteSrc.n.u1Present  = 1;
    2246         PteSrc.n.u1Dirty    = 1;
    2247         PteSrc.n.u1Accessed = 1;
    2248         PteSrc.n.u1Write    = 1;
    2249         PteSrc.n.u1User     = 1;
    2250         PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
    2251 
    2252         Log2(("SyncPage: 4K  %RGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}PteDst=%08llx%s\n",
    2253               GCPtrPage, PteSrc.n.u1Present,
    2254               PteSrc.n.u1Write & PdeSrc.n.u1Write,
    2255               PteSrc.n.u1User  & PdeSrc.n.u1User,
    2256               (uint64_t)PteSrc.u,
     2253
     2254        PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], GCPtrCurPage, pShwPage, iPTDst);
     2255
     2256        Log2(("SyncPage: 4K  %RGv PteSrc:{P=1 RW=1 U=1}PteDst=%08llx%s\n",
     2257              GCPtrPage,
    22572258              SHW_PTE_LOG64(pPTDst->a[iPTDst]),
    22582259              SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
     
    31343135# endif /* HC_ARCH_BITS == 64 */
    31353136
    3136     GSTPDE PdeSrc;
    3137     PdeSrc.u            = 0; /* faked so we don't have to #ifdef everything */
    3138     PdeSrc.n.u1Present  = 1;
    3139     PdeSrc.n.u1Write    = 1;
    3140     PdeSrc.n.u1Accessed = 1;
    3141     PdeSrc.n.u1User     = 1;
    3142 
    31433137    /*
    31443138     * Allocate & map the page table.
     
    31693163        {
    31703164            RTGCPTR GCPtrCurPage = (GCPtrPage & ~(RTGCPTR)(SHW_PT_MASK << SHW_PT_SHIFT)) | (iPTDst << PAGE_SHIFT);
    3171             GSTPTE  PteSrc;
    3172 
    3173             /* Fake the page table entry */
    3174             PteSrc.u = GCPtrCurPage;
    3175             PteSrc.n.u1Present  = 1;
    3176             PteSrc.n.u1Dirty    = 1;
    3177             PteSrc.n.u1Accessed = 1;
    3178             PteSrc.n.u1Write    = 1;
    3179             PteSrc.n.u1User     = 1;
    3180 
    3181             PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
    3182             Log2(("SyncPage: 4K+ %RGv PteSrc:{P=%d RW=%d U=%d raw=%08llx} PteDst=%08llx%s\n",
    3183                     GCPtrCurPage, PteSrc.n.u1Present,
    3184                     PteSrc.n.u1Write & PdeSrc.n.u1Write,
    3185                     PteSrc.n.u1User  & PdeSrc.n.u1User,
    3186                     (uint64_t)PteSrc.u,
     3165
     3166            PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], GCPtrCurPage, pShwPage, iPTDst);
     3167            Log2(("SyncPage: 4K+ %RGv PteSrc:{P=1 RW=1 U=1} PteDst=%08llx%s\n",
     3168                    GCPtrCurPage,
    31873169                    SHW_PTE_LOG64(pPTDst->a[iPTDst]),
    31883170                    SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
     
    32083190
    32093191    STAM_PROFILE_STOP(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,SyncPT), a);
     3192    if (RT_FAILURE(rc))
     3193        STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,SyncPTFailed));
    32103194    return rc;
    32113195
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