Changeset 1865 in vbox for trunk/src/VBox
- Timestamp:
- Apr 2, 2007 3:45:56 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 20091
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r1839 r1865 544 544 STAM_COUNTER_INC(&pVM->pgm.s.StatGCPageOutOfSyncSupervisor); 545 545 546 # if def LOG_ENABLED546 # if defined(LOG_ENABLED) && !defined(IN_RING0) 547 547 RTGCPHYS GCPhys; 548 548 uint64_t fPageGst; 549 549 PGMGstGetPage(pVM, pvFault, &fPageGst, &GCPhys); 550 Log Flow(("Page out of sync: %p eip=%08x PdeSrc.n.u1User=%d fPageGst=%08llx GCPhys=%VGp\n",551 pvFault, pRegFrame->eip, PdeSrc.n.u1User, fPageGst, GCPhys));550 Log(("Page out of sync: %p eip=%08x PdeSrc.n.u1User=%d fPageGst=%08llx GCPhys=%VGp scan=%d\n", 551 pvFault, pRegFrame->eip, PdeSrc.n.u1User, fPageGst, GCPhys, CSAMDoesPageNeedScanning(pVM, (RTGCPTR)pRegFrame->eip))); 552 552 # endif /* LOG_ENABLED */ 553 553 554 554 # ifndef IN_RING0 555 if ( CSAMIsEnabled(pVM) && (cpl == 0))555 if (cpl == 0) 556 556 { 557 557 uint64_t fPageGst; … … 560 560 && !(fPageGst & X86_PTE_US)) 561 561 { 562 if (pvFault == (RTGCPTR)pRegFrame->eip) 562 /** Note: can't check for X86_TRAP_ID bit, because that requires execute disable support on the CPU */ 563 if ( pvFault == (RTGCPTR)pRegFrame->eip 564 || (RTGCUINTPTR)pvFault - pRegFrame->eip < 8 /* instruction crossing a page boundary */ 565 #if 0 /* Note: enable if ever required in the future; it's a bit aggressive */ 566 || ( !PATMIsPatchGCAddr(pVM, (RTGCPTR)pRegFrame->eip) 567 && CSAMDoesPageNeedScanning(pVM, (RTGCPTR)pRegFrame->eip)) /* any new code we encounter here */ 568 #endif 569 ) 563 570 { 564 LogFlow(("CSAMExecFault %VGv\n", p vFault));565 rc = CSAMExecFault(pVM, pvFault);571 LogFlow(("CSAMExecFault %VGv\n", pRegFrame->eip)); 572 rc = CSAMExecFault(pVM, (RTGCPTR)pRegFrame->eip); 566 573 if (rc != VINF_SUCCESS) 567 574 { … … 581 588 } 582 589 } 590 else 591 if ( uErr == X86_TRAP_PF_RW 592 && pRegFrame->ecx >= 0x100 /* early check for movswd count */ 593 && pRegFrame->ecx < 0x10000 594 ) 595 { 596 /* In case of a write to a non-present supervisor shadow page, we'll take special precautions 597 * to detect loading of new code pages. 598 */ 599 600 /* 601 * Decode the instruction. 602 */ 603 RTGCPTR PC; 604 rc = SELMValidateAndConvertCSAddr(pVM, pRegFrame->eflags, pRegFrame->ss, pRegFrame->cs, &pRegFrame->csHid, (RTGCPTR)pRegFrame->eip, &PC); 605 if (rc == VINF_SUCCESS) 606 { 607 DISCPUSTATE Cpu; 608 uint32_t cbOp; 609 rc = EMInterpretDisasOneEx(pVM, (RTGCUINTPTR)PC, pRegFrame, &Cpu, &cbOp); 610 611 /* For now we'll restrict this to rep movsw/d instructions */ 612 if ( rc == VINF_SUCCESS 613 && Cpu.pCurInstr->opcode == OP_MOVSWD 614 && (Cpu.prefix & PREFIX_REP)) 615 { 616 CSAMMarkPossibleCodePage(pVM, pvFault); 617 } 618 } 619 } 583 620 584 621 /* … … 587 624 /** @todo not correct for pages that contain both code and data!! */ 588 625 Log2(("CSAMMarkPage %p; scanned=%d\n", pvFault, true)); 589 CSAMMarkPage(pVM, (RTGCPTR)pvFault, true);626 CSAMMarkPage(pVM, pvFault, true); 590 627 } 591 628 } … … 864 901 if (pShwPage->GCPhys == GCPhys) 865 902 { 866 #if 0 /* debug build + flash + xp (=1000Hz timer?) => bad invalidation + sync loops. */867 903 const unsigned iPTEDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK; 868 904 PSHWPT pPT = (PSHWPT)PGMPOOL_PAGE_2_PTR(pVM, pShwPage); … … 875 911 pPT->a[iPTEDst].u = 0; 876 912 } 877 #else /* Syncing it here isn't 100% safe and it's probably not worth spending time syncing it. */878 rc = PGM_BTH_NAME(SyncPage)(pVM, PdeSrc, GCPtrPage, 1, 0);879 if (VBOX_SUCCESS(rc))880 rc = VINF_SUCCESS;881 #endif882 913 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePage4KBPages)); 883 914 PGM_INVL_PG(GCPtrPage); … … 1332 1363 { 1333 1364 VBOXPTE PteSrc = pPTSrc->a[offPTSrc + iPTDst]; 1334 PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst); 1335 Log2(("SyncPage: 4K+ %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s\n", 1336 (GCPtrPage & ~(RTGCUINTPTR)(X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT), 1337 PteSrc.n.u1Present, PteSrc.n.u1Write, PteSrc.n.u1User, (uint64_t)PteSrc.u, 1365 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT); 1366 1367 #ifndef IN_RING0 1368 /* 1369 * Assuming kernel code will be marked as supervisor - and not as user level 1370 * and executed using a conforming code selector - And marked as readonly. 1371 * Also assume that if we're monitoring a page, it's of no interest to CSAM. 1372 */ 1373 if ( ((PdeSrc.u & PteSrc.u) & (X86_PTE_RW | X86_PTE_US)) 1374 || iPTDst == ((GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK) /* always sync GCPtrPage */ 1375 || !CSAMDoesPageNeedScanning(pVM, (RTGCPTR)GCPtrCurPage) 1376 || PGMRamTestFlags(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK, 1377 MM_RAM_FLAGS_PHYSICAL_ALL | MM_RAM_FLAGS_VIRTUAL_ALL | MM_RAM_FLAGS_PHYSICAL_WRITE | MM_RAM_FLAGS_VIRTUAL_WRITE) 1378 ) 1379 #endif 1380 PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst); 1381 Log2(("SyncPage: 4K+ %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx} PteDst=%08llx%s\n", 1382 GCPtrCurPage, PteSrc.n.u1Present, 1383 PteSrc.n.u1Write & PdeSrc.n.u1Write, 1384 PteSrc.n.u1User & PdeSrc.n.u1User, 1385 (uint64_t)PteSrc.u, 1386 (uint64_t)pPTDst->a[iPTDst].u, 1338 1387 pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : "")); 1339 1388 } … … 1348 1397 PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst); 1349 1398 Log2(("SyncPage: 4K %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s\n", 1350 GCPtrPage, PteSrc.n.u1Present, PteSrc.n.u1Write, PteSrc.n.u1User, (uint64_t)PteSrc.u, 1399 GCPtrPage, PteSrc.n.u1Present, 1400 PteSrc.n.u1Write & PdeSrc.n.u1Write, 1401 PteSrc.n.u1User & PdeSrc.n.u1User, 1402 (uint64_t)PteSrc.u, 1351 1403 pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : "")); 1352 1404 } … … 1886 1938 */ 1887 1939 if ( ((PdeSrc.u & pPTSrc->a[iPTSrc].u) & (X86_PTE_RW | X86_PTE_US)) 1888 || !CSAMIsEnabled(pVM)1889 1940 || !CSAMDoesPageNeedScanning(pVM, (RTGCPTR)((iPDSrc << GST_PD_SHIFT) | (iPTSrc << PAGE_SHIFT))) 1890 1941 || PGMRamTestFlags(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK, … … 1895 1946 Log2(("SyncPT: 4K+ %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s dst.raw=%08llx iPTSrc=%x PdeSrc.u=%x physpte=%VGp\n", 1896 1947 (RTGCPTR)((iPDSrc << GST_PD_SHIFT) | (iPTSrc << PAGE_SHIFT)), 1897 PteSrc.n.u1Present, PteSrc.n.u1Write, PteSrc.n.u1User, (uint64_t)PteSrc.u, 1948 PteSrc.n.u1Present, 1949 PteSrc.n.u1Write & PdeSrc.n.u1Write, 1950 PteSrc.n.u1User & PdeSrc.n.u1User, 1951 (uint64_t)PteSrc.u, 1898 1952 pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : "", pPTDst->a[iPTDst].u, iPTSrc, PdeSrc.au32[0], 1899 1953 (PdeSrc.u & GST_PDE_PG_MASK) + iPTSrc*sizeof(PteSrc))); … … 2004 2058 */ 2005 2059 else if ( !PdeSrc.n.u1User 2006 && CSAMIsEnabled(pVM)2007 2060 && CSAMDoesPageNeedScanning(pVM, (RTGCPTR)(GCPtr | (iPTDst << SHW_PT_SHIFT)))) 2008 2061 PteDst.u = 0;
Note:
See TracChangeset
for help on using the changeset viewer.