Lines Matching defs:page

199     SSMFIELD_ENTRY_RCPTR(       CSAMPAGEREC, page.pPageGC),
202 SSMFIELD_ENTRY_GCPHYS( CSAMPAGEREC, page.GCPhys),
203 SSMFIELD_ENTRY( CSAMPAGEREC, page.fFlags),
204 SSMFIELD_ENTRY( CSAMPAGEREC, page.uSize),
206 SSMFIELD_ENTRY_HCPTR_NI( CSAMPAGEREC, page.pBitmap),
207 SSMFIELD_ENTRY( CSAMPAGEREC, page.fCode32),
208 SSMFIELD_ENTRY( CSAMPAGEREC, page.fMonitorActive),
209 SSMFIELD_ENTRY( CSAMPAGEREC, page.fMonitorInvalidation),
211 SSMFIELD_ENTRY( CSAMPAGEREC, page.enmTag),
212 SSMFIELD_ENTRY( CSAMPAGEREC, page.u64Hash),
241 /* Allocate bitmap for the page directory. */
261 STAM_REG(pVM, &pVM->csam.s.StatNrTraps, STAMTYPE_COUNTER, "/CSAM/PageTraps", STAMUNIT_OCCURENCES, "The number of CSAM page traps.");
266 STAM_REG(pVM, &pVM->csam.s.StatNrPages, STAMTYPE_COUNTER, "/CSAM/PageRec/AddedRW", STAMUNIT_OCCURENCES, "The number of CSAM page records (RW monitoring).");
267 STAM_REG(pVM, &pVM->csam.s.StatNrPagesInv, STAMTYPE_COUNTER, "/CSAM/PageRec/AddedRWI", STAMUNIT_OCCURENCES, "The number of CSAM page records (RW & invalidation monitoring).");
268 STAM_REG(pVM, &pVM->csam.s.StatNrRemovedPages, STAMTYPE_COUNTER, "/CSAM/PageRec/Removed", STAMUNIT_OCCURENCES, "The number of removed CSAM page records.");
269 STAM_REG(pVM, &pVM->csam.s.StatPageRemoveREMFlush,STAMTYPE_COUNTER, "/CSAM/PageRec/Removed/REMFlush", STAMUNIT_OCCURENCES, "The number of removed CSAM page records that caused a REM flush.");
271 STAM_REG(pVM, &pVM->csam.s.StatNrPatchPages, STAMTYPE_COUNTER, "/CSAM/PageRec/Patch", STAMUNIT_OCCURENCES, "The number of CSAM patch page records.");
272 STAM_REG(pVM, &pVM->csam.s.StatNrUserPages, STAMTYPE_COUNTER, "/CSAM/PageRec/Ignore/User", STAMUNIT_OCCURENCES, "The number of CSAM user page records (ignored).");
273 STAM_REG(pVM, &pVM->csam.s.StatPagePATM, STAMTYPE_COUNTER, "/CSAM/PageRec/Type/PATM", STAMUNIT_OCCURENCES, "The number of PATM page records.");
274 STAM_REG(pVM, &pVM->csam.s.StatPageCSAM, STAMTYPE_COUNTER, "/CSAM/PageRec/Type/CSAM", STAMUNIT_OCCURENCES, "The number of CSAM page records.");
275 STAM_REG(pVM, &pVM->csam.s.StatPageREM, STAMTYPE_COUNTER, "/CSAM/PageRec/Type/REM", STAMUNIT_OCCURENCES, "The number of REM page records.");
278 STAM_REG(pVM, &pVM->csam.s.StatCodePageModified, STAMTYPE_COUNTER, "/CSAM/Monitor/DirtyPage", STAMUNIT_OCCURENCES, "The number of code page modifications.");
280 STAM_REG(pVM, &pVM->csam.s.StatNrFlushes, STAMTYPE_COUNTER, "/CSAM/PageFlushes", STAMUNIT_OCCURENCES, "The number of CSAM page flushes.");
281 STAM_REG(pVM, &pVM->csam.s.StatNrFlushesSkipped, STAMTYPE_COUNTER, "/CSAM/PageFlushesSkipped", STAMUNIT_OCCURENCES, "The number of CSAM page flushes that were skipped.");
282 STAM_REG(pVM, &pVM->csam.s.StatNrKnownPagesHC, STAMTYPE_COUNTER, "/CSAM/HC/KnownPageRecords", STAMUNIT_OCCURENCES, "The number of known CSAM page records.");
283 STAM_REG(pVM, &pVM->csam.s.StatNrKnownPagesGC, STAMTYPE_COUNTER, "/CSAM/GC/KnownPageRecords", STAMUNIT_OCCURENCES, "The number of known CSAM page records.");
288 STAM_REG(pVM, &pVM->csam.s.StatBitmapAlloc, STAMTYPE_COUNTER, "/CSAM/Alloc/PageBitmap", STAMUNIT_OCCURENCES, "The number of page bitmap allocations.");
301 STAM_REG(pVM, &pVM->csam.s.StatFlushDirtyPages, STAMTYPE_PROFILE, "/PROF/CSAM/FlushDirtyPage", STAMUNIT_TICKS_PER_CALL, "Dirty page flushing overhead.");
388 /* Adjust pgdir and page bitmap pointers. */
445 /* Clear page bitmaps. */
455 /* Remove all CSAM page records. */
461 csamRemovePageRecord(pVM, pPageRec->page.pPageGC);
490 * Saves the state of the page record
500 CSAMPAGEREC page = *pPage;
504 /* Save the page record itself */
505 rc = SSMR3PutMem(pSSM, &page, sizeof(page));
508 if (page.page.pBitmap)
510 rc = SSMR3PutMem(pSSM, page.page.pBitmap, CSAM_PAGE_BITMAP_SIZE);
530 * Count the number of page records in the tree (feeling lazy)
550 /* Save the page bitmap. */
557 * Save page records
600 /* Restore dirty code page info. */
605 /* Restore possible code page */
615 * Restore page bitmaps
643 * Restore page records
647 CSAMPAGEREC page;
650 RT_ZERO(page);
651 rc = SSMR3GetStructEx(pSSM, &page, sizeof(page), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED, &g_aCsamPageRecFields[0], NULL);
655 * Recreate the page record
657 pPage = csamCreatePageRecord(pVM, page.page.pPageGC, page.page.enmTag, page.page.fCode32, page.page.fMonitorInvalidation);
660 pPage->GCPhys = page.page.GCPhys;
661 pPage->fFlags = page.page.fFlags;
662 pPage->u64Hash = page.page.u64Hash;
664 if (page.page.pBitmap)
800 /* Crossed page boundrary, pbSrcInstr is no good... */
912 { /* Force pCurInstrHC out of scope after we stop using it (page lock!) */
1139 Log(("Disassembly failed at %RRv with %Rrc (probably page not present) -> return to caller\n", pCurInstrGC, rc2));
1152 /// @todo fault in the page
1330 { /* Force pCurInstrHC out of scope after we stop using it (page lock!) */
1353 Log(("Disassembly failed at %RRv with %Rrc (probably page not present) -> return to caller\n", pCurInstrGC, rc2));
1369 /// @todo fault in the page
1427 /* Same page? */
1484 rc2 = PGMPhysGCPtr2CCPtrReadOnly(pVCpu, pJumpTableGC, (PRTHCPTR)&pJumpTableHC, missing page lock);
1492 /* Same page? */
1548 * Calculates the 64 bits hash value for the current page
1568 Log(("csamR3CalcPageHash: page %RRv not present!!\n", pInstr));
1576 Log(("csamR3CalcPageHash: page %RRv not present!!\n", pInstr));
1584 Log(("csamR3CalcPageHash: page %RRv not present!!\n", pInstr));
1592 Log(("csamR3CalcPageHash: page %RRv not present!!\n", pInstr));
1600 Log(("csamR3CalcPageHash: page %RRv not present!!\n", pInstr));
1614 * Notify CSAM of a page flush
1618 * @param addr GC address of the page to flush
1640 * Note: searching for the page in our tree first is more expensive (skipped flushes are two orders of magnitude more common)
1662 /* User page -> not relevant for us. */
1675 if ( GCPhys == pPageRec->page.GCPhys
1683 Log(("CSAMR3FlushPage: page %RRv has changed -> FLUSH (rc=%Rrc) (Phys: %RGp vs %RGp)\n", addr, rc, GCPhys, pPageRec->page.GCPhys));
1692 pPageRec->page.GCPhys = 0;
1693 pPageRec->page.fFlags = 0;
1694 rc = PGMGstGetPage(pVCpu, addr, &pPageRec->page.fFlags, &pPageRec->page.GCPhys);
1696 pPageRec->page.u64Hash = csamR3CalcPageHash(pVM, addr);
1698 if (pPageRec->page.pBitmap == NULL)
1700 pPageRec->page.pBitmap = (uint8_t *)MMR3HeapAllocZ(pVM, MM_TAG_CSAM_PATCH, CSAM_PAGE_BITMAP_SIZE);
1701 Assert(pPageRec->page.pBitmap);
1702 if (pPageRec->page.pBitmap == NULL)
1706 memset(pPageRec->page.pBitmap, 0, CSAM_PAGE_BITMAP_SIZE);
1726 * Notify CSAM of a page flush
1730 * @param addr GC address of the page to flush
1734 return csamFlushPage(pVM, addr, true /* remove page record */);
1738 * Remove a CSAM monitored page. Use with care!
1742 * @param addr GC address of the page to flush
1765 * Check a page record in case a page has been changed
1782 if (u64hash != pPageRec->page.u64Hash)
1783 csamFlushPage(pVM, pInstrGC, false /* don't remove page record */);
1809 * Adds page record to our lookup tree
1816 * @param fMonitorInvalidation Monitor page invalidation flag
1826 Log(("New page record for %RRv\n", GCPtr & PAGE_BASE_GC_MASK));
1834 /* Round down to page boundary. */
1837 pPage->page.pPageGC = GCPtr;
1838 pPage->page.fCode32 = fCode32;
1839 pPage->page.fMonitorInvalidation = fMonitorInvalidation;
1840 pPage->page.enmTag = enmTag;
1841 pPage->page.fMonitorActive = false;
1842 pPage->page.pBitmap = (uint8_t *)MMR3HeapAllocZ(pVM, MM_TAG_CSAM_PATCH, PAGE_SIZE/sizeof(uint8_t));
1843 rc = PGMGstGetPage(pVCpu, GCPtr, &pPage->page.fFlags, &pPage->page.GCPhys);
1846 pPage->page.u64Hash = csamR3CalcPageHash(pVM, GCPtr);
1877 pPage->page.fMonitorActive = true;
1885 Log(("csamCreatePageRecord %RRv GCPhys=%RGp\n", GCPtr, pPage->page.GCPhys));
1910 return &pPage->page;
1914 * Monitors a code page (if not already monitored)
1918 * @param pPageAddrGC The page to monitor
1966 Assert(pPageRec->page.fMonitorActive);
1970 if (!pPageRec->page.fMonitorActive)
1992 pPageRec->page.fMonitorActive = true;
1993 pPageRec->page.fMonitorInvalidation = fMonitorInvalidation;
1996 if ( !pPageRec->page.fMonitorInvalidation
1999 Assert(pPageRec->page.fMonitorActive);
2000 PGMHandlerVirtualChangeInvalidateCallback(pVM, pPageRec->page.pPageGC, CSAMCodePageInvalidate);
2001 pPageRec->page.fMonitorInvalidation = true;
2014 if (pPageRec->page.fMonitorActive)
2021 // || (pPageRec->page.GCPhys == 0), ("Shadow page flags for %RRv (%RHp) aren't readonly (%RX64)!!\n", pPageAddrGC, GCPhys, fPageShw));
2025 if (pPageRec->page.GCPhys == 0)
2030 /* The page was changed behind our back. It won't be made read-only until the next SyncCR3, so force it here. */
2039 * Unmonitors a code page
2043 * @param pPageAddrGC The page to monitor
2060 Assert(pPageRec && pPageRec->page.enmTag == enmTag);
2066 * Removes a page record from our lookup tree
2086 if (pPageRec->page.fMonitorActive)
2095 if (pPageRec->page.enmTag == CSAM_TAG_PATM)
2097 /* Make sure the recompiler flushes its cache as this page is no longer monitored. */
2104 switch (pPageRec->page.enmTag)
2120 if (pPageRec->page.pBitmap) MMR3HeapFree(pPageRec->page.pBitmap);
2145 * Important to realize that a physical page in a range can have aliases, and
2200 /** @todo We can't remove the page (which unregisters the virtual handler) as we are called from a DoWithAll on the virtual handler tree. Argh. */
2201 csamFlushPage(pVM, GCPtr, false /* don't remove page! */);
2241 if (pPage) *pPage= &pPageRec->page;
2242 if (pPageRec->page.pBitmap == NULL || ASMBitTest(pPageRec->page.pBitmap, offset))
2258 * Mark an instruction in a page as scanned/not scanned
2285 Log(("Scanned full page (%RRv) -> free bitmap\n", pInstr & PAGE_BASE_GC_MASK));
2297 * Mark an instruction in a page as scanned/not scanned
2416 /* Notify the recompiler that this page has been changed. */
2427 if (pPageRec && pPageRec->page.enmTag == CSAM_TAG_REM)
2466 /* Resync the page to make sure instruction fetch will fault */