VirtualBox

Changeset 23250 in vbox for trunk


Ignore:
Timestamp:
Sep 23, 2009 10:00:46 AM (15 years ago)
Author:
vboxsync
Message:

Deal with dirty page tracking and monitored pages.

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

Legend:

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

    r23116 r23250  
    22502250                    PGM_INVL_BIG_PG(pVCpu, GCPtrPage);
    22512251                    STAM_PROFILE_STOP(&pVCpu->pgm.s.CTX_MID_Z(Stat,DirtyBitTracking), a);
    2252                     return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;
     2252                    return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;    /* restarts the instruction. */
    22532253                }
    22542254# ifdef IN_RING0
     
    22722272
    22732273                            STAM_PROFILE_STOP(&pVCpu->pgm.s.CTX_MID_Z(Stat,DirtyBitTracking), a);
    2274                             return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;
     2274                            return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;    /* restarts the instruction. */
    22752275                        }
    22762276                    }
     
    23692369                        if (pPteDst->u & PGM_PTFLAGS_TRACK_DIRTY)
    23702370                        {
     2371                            PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & GST_PTE_PG_MASK);
     2372
    23712373                            LogFlow(("DIRTY page trap addr=%RGv\n", GCPtrPage));
    2372 #  ifdef VBOX_STRICT
    2373                             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & GST_PTE_PG_MASK);
    2374                             if (pPage)
    2375                                 AssertMsg(!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage),
    2376                                         ("Unexpected dirty bit tracking on monitored page %RGv (phys %RGp)!!!!!!\n", GCPtrPage, pPteSrc->u & X86_PTE_PAE_PG_MASK));
    2377 #  endif
     2374
    23782375                            STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_MID_Z(Stat,DirtyPageTrap));
    23792376
     
    23832380                             *       fault again and take this path to only invalidate the entry.
    23842381                             */
    2385                             pPteDst->n.u1Write    = 1;
     2382                            if (    pPage
     2383                                &&  PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
     2384                            {
     2385                                /* Assuming write handlers here as the PTE is present (otherwise it wouldn't be). */
     2386                                pPteDst->n.u1Write    = 0;
     2387                            }
     2388                            else
     2389                                pPteDst->n.u1Write    = 1;
     2390
    23862391                            pPteDst->n.u1Dirty    = 1;
    23872392                            pPteDst->n.u1Accessed = 1;
     
    23902395
    23912396                            STAM_PROFILE_STOP(&pVCpu->pgm.s.CTX_MID_Z(Stat,DirtyBitTracking), a);
    2392                             return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;
     2397                            return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;    /* restarts the instruction. */
    23932398                        }
    23942399# ifdef IN_RING0
     
    24042409
    24052410                            STAM_PROFILE_STOP(&pVCpu->pgm.s.CTX_MID_Z(Stat,DirtyBitTracking), a);
    2406                             return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;
     2411                            return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;    /* restarts the instruction. */
    24072412                        }
    24082413# endif
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r23199 r23250  
    31973197                    Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX32 cRefs=%#x\n", i, pPT->a[i], cRefs));
    31983198                    pPT->a[i].u = (pPT->a[i].u & u32AndMask) | u32OrMask;
     3199                    if (pPT->a[i].u & PGM_PTFLAGS_TRACK_DIRTY)
     3200                        pPT->a[i].n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
     3201
    31993202                    cRefs--;
    32003203                    if (!cRefs)
     
    32573260                    Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64 cRefs=%#x\n", i, pPT->a[i], cRefs));
    32583261                    pPT->a[i].u = (pPT->a[i].u & u64AndMask) | u64OrMask;
     3262                    if (pPT->a[i].u & PGM_PTFLAGS_TRACK_DIRTY)
     3263                        pPT->a[i].n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
     3264
    32593265                    cRefs--;
    32603266                    if (!cRefs)
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