Changeset 5662 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Nov 10, 2007 2:10:41 PM (17 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r5630 r5662 2441 2441 pVM->pgm.s.pfnR3GstMapCR3 = pModeData->pfnR3GstMapCR3; 2442 2442 pVM->pgm.s.pfnR3GstUnmapCR3 = pModeData->pfnR3GstUnmapCR3; 2443 pVM->pgm.s.pfnHCGstWriteHandlerCR3 = pModeData->pfnHCGstWriteHandlerCR3; 2444 pVM->pgm.s.pszHCGstWriteHandlerCR3 = pModeData->pszHCGstWriteHandlerCR3; 2443 pVM->pgm.s.pfnR3GstWriteHandlerCR3 = pModeData->pfnR3GstWriteHandlerCR3; 2444 pVM->pgm.s.pszR3GstWriteHandlerCR3 = pModeData->pszR3GstWriteHandlerCR3; 2445 pVM->pgm.s.pfnR3GstPAEWriteHandlerCR3 = pModeData->pfnR3GstPAEWriteHandlerCR3; 2446 pVM->pgm.s.pszR3GstPAEWriteHandlerCR3 = pModeData->pszR3GstPAEWriteHandlerCR3; 2445 2447 2446 2448 pVM->pgm.s.pfnGCGstGetPage = pModeData->pfnGCGstGetPage; … … 2452 2454 pVM->pgm.s.pfnGCGstUnmapCR3 = pModeData->pfnGCGstUnmapCR3; 2453 2455 pVM->pgm.s.pfnGCGstWriteHandlerCR3 = pModeData->pfnGCGstWriteHandlerCR3; 2456 pVM->pgm.s.pfnGCGstPAEWriteHandlerCR3 = pModeData->pfnGCGstPAEWriteHandlerCR3; 2454 2457 2455 2458 pVM->pgm.s.pfnR0GstGetPage = pModeData->pfnR0GstGetPage; … … 2460 2463 pVM->pgm.s.pfnR0GstMapCR3 = pModeData->pfnR0GstMapCR3; 2461 2464 pVM->pgm.s.pfnR0GstUnmapCR3 = pModeData->pfnR0GstUnmapCR3; 2462 pVM->pgm.s.pfnR0GstWriteHandlerCR3 = pModeData->pfnR0GstWriteHandlerCR3;2463 2465 2464 2466 -
trunk/src/VBox/VMM/PGMGst.h
r4071 r5662 128 128 129 129 #if PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_PAE 130 pModeData->pfnHCGstWriteHandlerCR3 = PGM_GST_NAME(WriteHandlerCR3); 131 pModeData->pszHCGstWriteHandlerCR3 = "Guest CR3 Write access handler"; 130 pModeData->pfnR3GstWriteHandlerCR3 = PGM_GST_NAME(WriteHandlerCR3); 131 pModeData->pszR3GstWriteHandlerCR3 = "Guest CR3 Write access handler"; 132 pModeData->pfnR3GstPAEWriteHandlerCR3 = PGM_GST_NAME(WriteHandlerCR3); 133 pModeData->pszR3GstPAEWriteHandlerCR3 = "Guest CR3 Write access handler (PAE)"; 132 134 #else 133 pModeData->pfnHCGstWriteHandlerCR3 = NULL; 134 pModeData->pszHCGstWriteHandlerCR3 = NULL; 135 pModeData->pfnGCGstWriteHandlerCR3 = 0; 135 pModeData->pfnR3GstWriteHandlerCR3 = NULL; 136 pModeData->pszR3GstWriteHandlerCR3 = NULL; 137 pModeData->pfnR3GstPAEWriteHandlerCR3 = NULL; 138 pModeData->pszR3GstPAEWriteHandlerCR3 = NULL; 136 139 #endif 137 140 … … 158 161 rc = PDMR3GetSymbolGC(pVM, NULL, PGM_GST_NAME_GC_STR(WriteHandlerCR3), &pModeData->pfnGCGstWriteHandlerCR3); 159 162 AssertMsgRCReturn(rc, ("%s -> rc=%Vrc\n", PGM_GST_NAME_GC_STR(WriteHandlerCR3), rc), rc); 163 rc = PDMR3GetSymbolGC(pVM, NULL, PGM_GST_NAME_GC_STR(WriteHandlerCR3), &pModeData->pfnGCGstPAEWriteHandlerCR3); 164 AssertMsgRCReturn(rc, ("%s -> rc=%Vrc\n", PGM_GST_NAME_GC_STR(PAEWriteHandlerCR3), rc), rc); 160 165 #endif 161 166 -
trunk/src/VBox/VMM/PGMInternal.h
r5661 r5662 1405 1405 DECLR3CALLBACKMEMBER(int, pfnR3GstMapCR3,(PVM pVM, RTGCPHYS GCPhysCR3)); 1406 1406 DECLR3CALLBACKMEMBER(int, pfnR3GstUnmapCR3,(PVM pVM)); 1407 R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHCGstWriteHandlerCR3; 1408 R3PTRTYPE(const char *) pszHCGstWriteHandlerCR3; 1407 R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnR3GstWriteHandlerCR3; 1408 R3PTRTYPE(const char *) pszR3GstWriteHandlerCR3; 1409 R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnR3GstPAEWriteHandlerCR3; 1410 R3PTRTYPE(const char *) pszR3GstPAEWriteHandlerCR3; 1409 1411 1410 1412 DECLGCCALLBACKMEMBER(int, pfnGCGstGetPage,(PVM pVM, RTGCUINTPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys)); … … 1416 1418 DECLGCCALLBACKMEMBER(int, pfnGCGstUnmapCR3,(PVM pVM)); 1417 1419 GCPTRTYPE(PFNPGMGCPHYSHANDLER) pfnGCGstWriteHandlerCR3; 1420 GCPTRTYPE(PFNPGMGCPHYSHANDLER) pfnGCGstPAEWriteHandlerCR3; 1418 1421 1419 1422 DECLR0CALLBACKMEMBER(int, pfnR0GstGetPage,(PVM pVM, RTGCUINTPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys)); … … 1424 1427 DECLR0CALLBACKMEMBER(int, pfnR0GstMapCR3,(PVM pVM, RTGCPHYS GCPhysCR3)); 1425 1428 DECLR0CALLBACKMEMBER(int, pfnR0GstUnmapCR3,(PVM pVM)); 1426 R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnR0GstWriteHandlerCR3;1427 1429 /** @} */ 1428 1430 … … 1627 1629 DECLR3CALLBACKMEMBER(int, pfnR3GstMapCR3,(PVM pVM, RTGCPHYS GCPhysCR3)); 1628 1630 DECLR3CALLBACKMEMBER(int, pfnR3GstUnmapCR3,(PVM pVM)); 1629 R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHCGstWriteHandlerCR3; 1630 R3PTRTYPE(const char *) pszHCGstWriteHandlerCR3; 1631 R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnR3GstWriteHandlerCR3; 1632 R3PTRTYPE(const char *) pszR3GstWriteHandlerCR3; 1633 R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnR3GstPAEWriteHandlerCR3; 1634 R3PTRTYPE(const char *) pszR3GstPAEWriteHandlerCR3; 1631 1635 1632 1636 DECLGCCALLBACKMEMBER(int, pfnGCGstGetPage,(PVM pVM, RTGCUINTPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys)); … … 1638 1642 DECLGCCALLBACKMEMBER(int, pfnGCGstUnmapCR3,(PVM pVM)); 1639 1643 GCPTRTYPE(PFNPGMGCPHYSHANDLER) pfnGCGstWriteHandlerCR3; 1644 GCPTRTYPE(PFNPGMGCPHYSHANDLER) pfnGCGstPAEWriteHandlerCR3; 1640 1645 1641 1646 DECLR0CALLBACKMEMBER(int, pfnR0GstGetPage,(PVM pVM, RTGCUINTPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys)); … … 1646 1651 DECLR0CALLBACKMEMBER(int, pfnR0GstMapCR3,(PVM pVM, RTGCPHYS GCPhysCR3)); 1647 1652 DECLR0CALLBACKMEMBER(int, pfnR0GstUnmapCR3,(PVM pVM)); 1648 R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnR0GstWriteHandlerCR3;1649 1653 /** @} */ 1650 1654 … … 2765 2769 return pPD; 2766 2770 AssertMsgFailed(("Impossible! rc=%d PDPE=%#llx\n", rc, CTXSUFF(pPGM->pGstPaePDPTR)->a[iPdPtr].u)); 2767 /* returning NIL_RTGCPHYS is ok if we assume it's just an invalid page of some kind emu alted as all 0s. */2771 /* returning NIL_RTGCPHYS is ok if we assume it's just an invalid page of some kind emulated as all 0s. */ 2768 2772 } 2769 2773 return NULL; … … 2858 2862 } 2859 2863 AssertMsgFailed(("Impossible! rc=%d PDPE=%#llx\n", rc, CTXSUFF(pPGM->pGstPaePDPTR)->a[iPdPtr].u)); 2860 /* returning NIL_RTGCPHYS is ok if we assume it's just an invalid page of some kind emu alted as all 0s. */2864 /* returning NIL_RTGCPHYS is ok if we assume it's just an invalid page of some kind emulated as all 0s. */ 2861 2865 } 2862 2866 return NULL; -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r5629 r5662 24 24 PGM_BTH_DECL(int, Trap0eHandler)(PVM pVM, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault); 25 25 PGM_BTH_DECL(int, InvalidatePage)(PVM pVM, RTGCUINTPTR GCPtrPage); 26 PGM_BTH_DECL(int, SyncPage)(PVM pVM, VBOXPDE PdeSrc, RTGCUINTPTR GCPtrPage, unsigned cPages, unsigned uErr);27 PGM_BTH_DECL(int, CheckPageFault)(PVM pVM, uint32_t uErr, PSHWPDE pPdeDst, P VBOXPDE pPdeSrc, RTGCUINTPTR GCPtrPage);28 PGM_BTH_DECL(int, SyncPT)(PVM pVM, unsigned iPD, P VBOXPD pPDSrc, RTGCUINTPTR GCPtrPage);26 PGM_BTH_DECL(int, SyncPage)(PVM pVM, GSTPDE PdeSrc, RTGCUINTPTR GCPtrPage, unsigned cPages, unsigned uErr); 27 PGM_BTH_DECL(int, CheckPageFault)(PVM pVM, uint32_t uErr, PSHWPDE pPdeDst, PGSTPDE pPdeSrc, RTGCUINTPTR GCPtrPage); 28 PGM_BTH_DECL(int, SyncPT)(PVM pVM, unsigned iPD, PGSTPD pPDSrc, RTGCUINTPTR GCPtrPage); 29 29 PGM_BTH_DECL(int, VerifyAccessSyncPage)(PVM pVM, RTGCUINTPTR Addr, unsigned fPage, unsigned uErr); 30 30 PGM_BTH_DECL(int, PrefetchPage)(PVM pVM, RTGCUINTPTR GCPtrPage); … … 50 50 PGM_BTH_DECL(int, Trap0eHandler)(PVM pVM, RTGCUINT uErr, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault) 51 51 { 52 #if (PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_REAL || PGM_GST_TYPE == PGM_TYPE_PROT ) && PGM_SHW_TYPE != PGM_TYPE_AMD6452 #if (PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_REAL || PGM_GST_TYPE == PGM_TYPE_PROT || PGM_GST_TYPE == PGM_TYPE_PAE) && PGM_SHW_TYPE != PGM_TYPE_AMD64 53 53 54 54 # if PGM_SHW_TYPE != PGM_TYPE_32BIT && PGM_SHW_TYPE != PGM_TYPE_PAE … … 56 56 # endif 57 57 58 # if PGM_SHW_TYPE == PGM_TYPE_PAE 58 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE != PGM_TYPE_PAE 59 59 /* 60 60 * Hide the instruction fetch trap indicator for now. … … 71 71 * Get PDs. 72 72 */ 73 int 73 int rc; 74 74 # if PGM_WITH_PAGING(PGM_GST_TYPE) 75 PVBOXPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 75 # if PGM_GST_TYPE == PGM_TYPE_32BIT 76 76 const unsigned iPDSrc = (RTGCUINTPTR)pvFault >> GST_PD_SHIFT; 77 PGSTPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 78 # else /* PAE */ 79 unsigned iPDSrc; 80 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, (RTGCUINTPTR)pvFault, &iPDSrc); 81 # endif 77 82 # else 78 P VBOXPDpPDSrc = NULL;83 PGSTPD pPDSrc = NULL; 79 84 const unsigned iPDSrc = 0; 80 85 # endif … … 124 129 */ 125 130 # if PGM_WITH_PAGING(PGM_GST_TYPE) 126 VBOXPDE PdeSrc = pPDSrc->a[iPDSrc];131 GSTPDE PdeSrc = pPDSrc->a[iPDSrc]; 127 132 # else 128 VBOXPDE PdeSrc;133 GSTPDE PdeSrc; 129 134 PdeSrc.au32[0] = 0; /* faked so we don't have to #ifdef everything */ 130 135 PdeSrc.n.u1Present = 1; … … 272 277 if ( PdeSrc.b.u1Size 273 278 && (cr4 & X86_CR4_PSE)) 274 GCPhys = (PdeSrc.u & X86_PDE4M_PG_MASK)275 | ((RTGCPHYS)pvFault & ( X86_PAGE_4M_OFFSET_MASK ^ PAGE_OFFSET_MASK));279 GCPhys = (PdeSrc.u & GST_PDE4M_PG_MASK) 280 | ((RTGCPHYS)pvFault & (GST_BIG_PAGE_OFFSET_MASK ^ PAGE_OFFSET_MASK)); 276 281 else 277 282 { 278 283 PVBOXPT pPTSrc; 279 284 # ifdef IN_GC 280 rc = PGMGCDynMapGCPage(pVM, PdeSrc.u & X86_PDE_PG_MASK, (void **)&pPTSrc);285 rc = PGMGCDynMapGCPage(pVM, PdeSrc.u & GST_PDE_PG_MASK, (void **)&pPTSrc); 281 286 # else 282 pPTSrc = (PVBOXPT)MMPhysGCPhys2HCVirt(pVM, PdeSrc.u & X86_PDE_PG_MASK, sizeof(*pPTSrc));287 pPTSrc = (PVBOXPT)MMPhysGCPhys2HCVirt(pVM, PdeSrc.u & GST_PDE_PG_MASK, sizeof(*pPTSrc)); 283 288 if (pPTSrc == 0) 284 289 rc = VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS; … … 286 291 if (VBOX_SUCCESS(rc)) 287 292 { 288 unsigned iPTESrc = ((RTGCUINTPTR)pvFault >> PAGE_SHIFT) & X86_PT_MASK;293 unsigned iPTESrc = ((RTGCUINTPTR)pvFault >> PAGE_SHIFT) & GST_PT_MASK; 289 294 if (pPTSrc->a[iPTESrc].n.u1Present) 290 GCPhys = pPTSrc->a[iPTESrc].u & X86_PTE_PG_MASK;295 GCPhys = pPTSrc->a[iPTESrc].u & GST_PTE_PG_MASK; 291 296 } 292 297 } … … 847 852 * Get the guest PD entry and calc big page. 848 853 */ 849 PVBOXPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 854 # if PGM_GST_TYPE == PGM_TYPE_32BIT 855 PX86PD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 850 856 const unsigned iPDSrc = GCPtrPage >> GST_PD_SHIFT; 851 VBOXPDE PdeSrc = pPDSrc->a[iPDSrc]; 857 GSTPDE PdeSrc = pPDSrc->a[iPDSrc]; 858 # else /* PAE */ 859 unsigned iPDSrc; 860 PX86PD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc); 861 862 GSTPDE PdeSrc;; 863 PdeSrc.u = pgmGstGetPaePDE(&pVM->pgm.s, GCPtrPage); 864 # endif 865 852 866 const uint32_t cr4 = CPUMGetGuestCR4(pVM); 853 867 const bool fIsBigPage = PdeSrc.b.u1Size && (cr4 & X86_CR4_PSE); … … 967 981 /* Before freeing the page, check if anything really changed. */ 968 982 PPGMPOOLPAGE pShwPage = pgmPoolGetPageByHCPhys(pVM, PdeDst.u & SHW_PDE_PG_MASK); 969 RTGCPHYS GCPhys = PdeSrc.u & X86_PDE4M_PG_MASK;983 RTGCPHYS GCPhys = PdeSrc.u & GST_PDE4M_PG_MASK; 970 984 # if PGM_SHW_TYPE != PGM_TYPE_32BIT 971 985 GCPhys |= GCPtrPage & (1 << X86_PD_PAE_SHIFT); … … 1166 1180 * @remark Not used for 2/4MB pages! 1167 1181 */ 1168 DECLINLINE(void) PGM_BTH_NAME(SyncPageWorker)(PVM pVM, PSHWPTE pPteDst, VBOXPDE PdeSrc, VBOXPTE PteSrc, PPGMPOOLPAGE pShwPage, unsigned iPTDst)1182 DECLINLINE(void) PGM_BTH_NAME(SyncPageWorker)(PVM pVM, PSHWPTE pPteDst, GSTPDE PdeSrc, VBOXPTE PteSrc, PPGMPOOLPAGE pShwPage, unsigned iPTDst) 1169 1183 { 1170 1184 if (PteSrc.n.u1Present) … … 1174 1188 */ 1175 1189 PPGMPAGE pPage; 1176 int rc = pgmPhysGetPageEx(&pVM->pgm.s, PteSrc.u & X86_PTE_PG_MASK, &pPage);1190 int rc = pgmPhysGetPageEx(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK, &pPage); 1177 1191 if (VBOX_SUCCESS(rc)) 1178 1192 { … … 1298 1312 * @param uErr Fault error (X86_TRAP_PF_*). 1299 1313 */ 1300 PGM_BTH_DECL(int, SyncPage)(PVM pVM, VBOXPDE PdeSrc, RTGCUINTPTR GCPtrPage, unsigned cPages, unsigned uErr)1314 PGM_BTH_DECL(int, SyncPage)(PVM pVM, GSTPDE PdeSrc, RTGCUINTPTR GCPtrPage, unsigned cPages, unsigned uErr) 1301 1315 { 1302 1316 LogFlow(("SyncPage: GCPtrPage=%VGv cPages=%d uErr=%#x\n", GCPtrPage, cPages, uErr)); … … 1314 1328 Assert(GCPtrPage < _4G); //??? 1315 1329 # endif 1316 STAM_COUNTER_INC(&pVM->pgm.s.StatGCSyncPagePD[(GCPtrPage >> X86_PD_SHIFT) & X86_PD_MASK]);1330 STAM_COUNTER_INC(&pVM->pgm.s.StatGCSyncPagePD[(GCPtrPage >> X86_PD_SHIFT) & GST_PD_MASK]); 1317 1331 Assert(PdeSrc.n.u1Present); 1318 1332 Assert(cPages); … … 1371 1385 */ 1372 1386 PVBOXPT pPTSrc; 1373 int rc = PGM_GCPHYS_2_PTR(pVM, PdeSrc.u & X86_PDE_PG_MASK, &pPTSrc);1387 int rc = PGM_GCPHYS_2_PTR(pVM, PdeSrc.u & GST_PDE_PG_MASK, &pPTSrc); 1374 1388 if (VBOX_SUCCESS(rc)) 1375 1389 { … … 1401 1415 { 1402 1416 VBOXPTE PteSrc = pPTSrc->a[offPTSrc + iPTDst]; 1403 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)( X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);1417 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(GST_PT_MASK << GST_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT); 1404 1418 NOREF(GCPtrCurPage); 1405 1419 #ifndef IN_RING0 … … 1430 1444 # endif /* PGM_SYNC_N_PAGES */ 1431 1445 { 1432 const unsigned iPTSrc = (GCPtrPage >> X86_PT_SHIFT) & X86_PT_MASK;1446 const unsigned iPTSrc = (GCPtrPage >> GST_PT_SHIFT) & GST_PT_MASK; 1433 1447 VBOXPTE PteSrc = pPTSrc->a[iPTSrc]; 1434 1448 const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK; … … 1455 1469 */ 1456 1470 /* Calculate the GC physical address of this 4KB shadow page. */ 1457 RTGCPHYS GCPhys = (PdeSrc.u & X86_PDE4M_PAE_PG_MASK) | ((RTGCUINTPTR)GCPtrPage & X86_PAGE_4M_OFFSET_MASK);1471 RTGCPHYS GCPhys = (PdeSrc.u & X86_PDE4M_PAE_PG_MASK) | ((RTGCUINTPTR)GCPtrPage & GST_BIG_PAGE_OFFSET_MASK); 1458 1472 /* Find ram range. */ 1459 1473 PPGMPAGE pPage; … … 1589 1603 VBOXPTE PteSrc; 1590 1604 1591 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)( X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);1605 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(GST_PT_MASK << GST_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT); 1592 1606 1593 1607 /* Fake the page table entry */ … … 1616 1630 VBOXPTE PteSrc; 1617 1631 const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK; 1618 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)( X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);1632 RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(GST_PT_MASK << GST_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT); 1619 1633 1620 1634 /* Fake the page table entry */ … … 1659 1673 * @param GCPtrPage Guest context page address. 1660 1674 */ 1661 PGM_BTH_DECL(int, CheckPageFault)(PVM pVM, uint32_t uErr, PSHWPDE pPdeDst, P VBOXPDE pPdeSrc, RTGCUINTPTR GCPtrPage)1675 PGM_BTH_DECL(int, CheckPageFault)(PVM pVM, uint32_t uErr, PSHWPDE pPdeDst, PGSTPDE pPdeSrc, RTGCUINTPTR GCPtrPage) 1662 1676 { 1663 1677 STAM_PROFILE_START(&pVM->pgm.s.CTXMID(Stat, DirtyBitTracking), a); … … 1669 1683 if ( (uErr & X86_TRAP_PF_RSVD) 1670 1684 || !pPdeSrc->n.u1Present 1685 #if PGM_GST_TYPE == PGM_TYPE_PAE 1686 || ((uErr & X86_TRAP_PF_ID) && !pPdeSrc->n.u1NoExecute) 1687 #endif 1671 1688 || ((uErr & X86_TRAP_PF_RW) && !pPdeSrc->n.u1Write) 1672 1689 || ((uErr & X86_TRAP_PF_US) && !pPdeSrc->n.u1User) ) … … 1692 1709 * Map the guest page table. 1693 1710 */ 1694 P VBOXPT pPTSrc;1695 int rc = PGM_GCPHYS_2_PTR(pVM, pPdeSrc->u & X86_PDE_PG_MASK, &pPTSrc);1711 PGSTPT pPTSrc; 1712 int rc = PGM_GCPHYS_2_PTR(pVM, pPdeSrc->u & GST_PDE_PG_MASK, &pPTSrc); 1696 1713 if (VBOX_SUCCESS(rc)) 1697 1714 { 1698 P VBOXPTE pPteSrc = &pPTSrc->a[(GCPtrPage >> PAGE_SHIFT) & X86_PT_MASK];1699 const VBOXPTEPteSrc = *pPteSrc;1715 PGSTPTE pPteSrc = &pPTSrc->a[(GCPtrPage >> PAGE_SHIFT) & GST_PT_MASK]; 1716 const GSTPTE PteSrc = *pPteSrc; 1700 1717 if (pPteSrc->n.u1Present) 1701 1718 TRPMSetErrorCode(pVM, uErr | X86_TRAP_PF_P); /* page-level protection violation */ … … 1746 1763 * Map the guest page table. 1747 1764 */ 1748 P VBOXPT pPTSrc;1749 int rc = PGM_GCPHYS_2_PTR(pVM, pPdeSrc->u & X86_PDE_PG_MASK, &pPTSrc);1765 PGSTPT pPTSrc; 1766 int rc = PGM_GCPHYS_2_PTR(pVM, pPdeSrc->u & GST_PDE_PG_MASK, &pPTSrc); 1750 1767 if (VBOX_SUCCESS(rc)) 1751 1768 { … … 1753 1770 * Real page fault? 1754 1771 */ 1755 P VBOXPTE pPteSrc = &pPTSrc->a[(GCPtrPage >> PAGE_SHIFT) & X86_PT_MASK];1756 const VBOXPTE PteSrc = *pPteSrc;1772 PGSTPTE pPteSrc = &pPTSrc->a[(GCPtrPage >> PAGE_SHIFT) & GST_PT_MASK]; 1773 const GSTPTE PteSrc = *pPteSrc; 1757 1774 if ( !PteSrc.n.u1Present 1775 #if PGM_GST_TYPE == PGM_TYPE_PAE 1776 || ((uErr & X86_TRAP_PF_ID) && !PteSrc.n.u1NoExecute) 1777 #endif 1758 1778 || ((uErr & X86_TRAP_PF_RW) && !PteSrc.n.u1Write) 1759 1779 || ((uErr & X86_TRAP_PF_US) && !PteSrc.n.u1User) … … 1822 1842 LogFlow(("DIRTY page trap addr=%VGv\n", GCPtrPage)); 1823 1843 # ifdef VBOX_STRICT 1824 PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & X86_PTE_PG_MASK);1844 PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & GST_PTE_PG_MASK); 1825 1845 if (pPage) 1826 1846 AssertMsg(!(pPage->HCPhys & (MM_RAM_FLAGS_PHYSICAL_ALL | MM_RAM_FLAGS_VIRTUAL_ALL | MM_RAM_FLAGS_PHYSICAL_WRITE | MM_RAM_FLAGS_VIRTUAL_WRITE)), /** @todo PAGE FLAGS */ … … 1888 1908 * @param GCPtrPage GC Pointer of the page that caused the fault 1889 1909 */ 1890 PGM_BTH_DECL(int, SyncPT)(PVM pVM, unsigned iPDSrc, P VBOXPD pPDSrc, RTGCUINTPTR GCPtrPage)1910 PGM_BTH_DECL(int, SyncPT)(PVM pVM, unsigned iPDSrc, PGSTPD pPDSrc, RTGCUINTPTR GCPtrPage) 1891 1911 { 1892 1912 STAM_PROFILE_START(&pVM->pgm.s.CTXMID(Stat,SyncPT), a); … … 2262 2282 Assert(!PdeDst.n.u1Present); /* We're only supposed to call SyncPT on PDE!P and conflicts.*/ 2263 2283 2264 VBOXPDE PdeSrc;2284 GSTPDE PdeSrc; 2265 2285 PdeSrc.au32[0] = 0; /* faked so we don't have to #ifdef everything */ 2266 2286 PdeSrc.n.u1Present = 1; … … 2329 2349 int rc = VINF_SUCCESS; 2330 2350 # if PGM_WITH_PAGING(PGM_GST_TYPE) 2331 PVBOXPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 2351 # if PGM_GST_TYPE == PGM_TYPE_32BIT 2332 2352 const unsigned iPDSrc = (RTGCUINTPTR)GCPtrPage >> GST_PD_SHIFT; 2353 PGSTPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 2354 # else /* PAE */ 2355 unsigned iPDSrc 2356 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc); 2357 # endif 2333 2358 # else 2334 P VBOXPDpPDSrc = NULL;2359 PGSTPD pPDSrc = NULL; 2335 2360 const unsigned iPDSrc = 0; 2336 2361 # endif 2337 2362 2338 2363 # if PGM_WITH_PAGING(PGM_GST_TYPE) 2339 const VBOXPDE PdeSrc = pPDSrc->a[iPDSrc];2364 const GSTPDE PdeSrc = pPDSrc->a[iPDSrc]; 2340 2365 # else 2341 VBOXPDE PdeSrc;2366 GSTPDE PdeSrc; 2342 2367 PdeSrc.au32[0] = 0; /* faked so we don't have to #ifdef everything */ 2343 2368 PdeSrc.n.u1Present = 1; … … 2354 2379 { 2355 2380 # if PGM_SHW_TYPE == PGM_TYPE_32BIT 2356 const X86PDE PdeDst = pVM->pgm.s.CTXMID(p,32BitPD)->a[GCPtrPage >> X86_PD_SHIFT];2381 const X86PDE PdeDst = pVM->pgm.s.CTXMID(p,32BitPD)->a[GCPtrPage >> SHW_PD_SHIFT]; 2357 2382 # else 2358 const X86PDEPAE PdeDst = pVM->pgm.s.CTXMID(ap,PaePDs)[0]->a[GCPtrPage >> X86_PD_PAE_SHIFT];2383 const X86PDEPAE PdeDst = pVM->pgm.s.CTXMID(ap,PaePDs)[0]->a[GCPtrPage >> SHW_PD_SHIFT]; 2359 2384 # endif 2360 2385 if (!(PdeDst.u & PGM_PDFLAGS_MAPPING)) … … 2399 2424 LogFlow(("VerifyAccessSyncPage: GCPtrPage=%VGv fPage=%#x uErr=%#x\n", GCPtrPage, fPage, uErr)); 2400 2425 2401 #if (PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_REAL || PGM_GST_TYPE == PGM_TYPE_PROT ) && PGM_SHW_TYPE != PGM_TYPE_AMD642426 #if (PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_REAL || PGM_GST_TYPE == PGM_TYPE_PROT || PGM_GST_TYPE == PGM_TYPE_PAE) && PGM_SHW_TYPE != PGM_TYPE_AMD64 2402 2427 2403 2428 # if PGM_SHW_TYPE != PGM_TYPE_32BIT && PGM_SHW_TYPE != PGM_TYPE_PAE … … 2419 2444 * Get guest PD and index. 2420 2445 */ 2421 unsigned iPDSrc = GCPtrPage >> GST_PD_SHIFT; 2422 PVBOXPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 2446 2447 # if PGM_WITH_PAGING(PGM_GST_TYPE) 2448 # if PGM_GST_TYPE == PGM_TYPE_32BIT 2449 const unsigned iPDSrc = (RTGCUINTPTR)GCPtrPage >> GST_PD_SHIFT; 2450 PGSTPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 2451 # else /* PAE */ 2452 unsigned iPDSrc; 2453 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc); 2454 # endif 2455 # else 2456 PGSTPD pPDSrc = NULL; 2457 const unsigned iPDSrc = 0; 2458 # endif 2423 2459 int rc = VINF_SUCCESS; 2424 2460 … … 2427 2463 */ 2428 2464 # if PGM_SHW_TYPE == PGM_TYPE_32BIT 2429 PX86PDE pPdeDst = &pVM->pgm.s.CTXMID(p,32BitPD)->a[GCPtrPage >> X86_PD_SHIFT];2465 PX86PDE pPdeDst = &pVM->pgm.s.CTXMID(p,32BitPD)->a[GCPtrPage >> SHW_PD_SHIFT]; 2430 2466 # else 2431 PX86PDEPAE pPdeDst = &pVM->pgm.s.CTXMID(ap,PaePDs)[0]->a[GCPtrPage >> X86_PD_PAE_SHIFT];2467 PX86PDEPAE pPdeDst = &pVM->pgm.s.CTXMID(ap,PaePDs)[0]->a[GCPtrPage >> SHW_PD_SHIFT]; 2432 2468 # endif 2433 2469 if (!pPdeDst->n.u1Present) … … 2446 2482 else 2447 2483 { 2448 VBOXPDE PdeSrc = pPDSrc->a[iPDSrc];2484 GSTPDE PdeSrc = pPDSrc->a[iPDSrc]; 2449 2485 #else 2450 2486 { 2451 VBOXPDE PdeSrc;2487 GSTPDE PdeSrc; 2452 2488 PdeSrc.au32[0] = 0; /* faked so we don't have to #ifdef everything */ 2453 2489 PdeSrc.n.u1Present = 1; … … 2495 2531 * @param cr4 The current guest cr4 value. 2496 2532 */ 2497 DECLINLINE(PGMPOOLKIND) PGM_BTH_NAME(CalcPageKind)(const VBOXPDE *pPdeSrc, uint32_t cr4)2533 DECLINLINE(PGMPOOLKIND) PGM_BTH_NAME(CalcPageKind)(const GSTPDE *pPdeSrc, uint32_t cr4) 2498 2534 { 2499 2535 if (!pPdeSrc->n.u1Size || !(cr4 & X86_CR4_PSE)) … … 2595 2631 PX86PDEPAE pPDEDst = &pVM->pgm.s.CTXMID(ap,PaePDs)[0]->a[0]; 2596 2632 # endif 2597 PVBOXPD pPDSrc = pVM->pgm.s.CTXSUFF(pGuestPD); 2633 2634 # if PGM_GST_TYPE == PGM_TYPE_32BIT 2635 PGSTPD pPDSrc = CTXSUFF(pVM->pgm.s.pGuestPD); 2636 # else /* PAE */ 2637 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, 0); 2638 # endif 2598 2639 2599 2640 Assert(pPDSrc); … … 2614 2655 { 2615 2656 pMapping = pVM->pgm.s.CTXALLSUFF(pMappings); 2616 iPdNoMapping = (pMapping) ? pMapping->GCPtr >> X86_PD_SHIFT : ~0U; 2657 iPdNoMapping = (pMapping) ? pMapping->GCPtr >> X86_PD_SHIFT : ~0U; /** PAE todo */ 2617 2658 } 2618 2659 else … … 2629 2670 Assert(&pVM->pgm.s.CTXMID(ap,PaePDs)[iPD * 2 / 512]->a[iPD * 2 % 512] == pPDEDst); 2630 2671 # endif 2631 register VBOXPDE PdeSrc = pPDSrc->a[iPD];2672 register GSTPDE PdeSrc = pPDSrc->a[iPD]; 2632 2673 if ( PdeSrc.n.u1Present 2633 2674 && (PdeSrc.n.u1User || fRawR0Enabled)) -
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r4977 r5662 427 427 pVM->pgm.s.pGstPaePDPTRHC = 0; 428 428 pVM->pgm.s.pGstPaePDPTRGC = 0; 429 /** PAE todo: pVM->pgm.s.apGstPaePDsHC? -> unmap?? */ 430 AssertFailed(); 429 431 430 432 #elif PGM_GST_TYPE == PGM_TYPE_AMD64 … … 495 497 496 498 #if PGM_GST_TYPE == PGM_TYPE_PAE 497 AssertFatalFailed();498 # if 0 /* later */499 499 /* 500 500 * Do the 4 PDs. … … 502 502 for (unsigned i = 0; i < 4; i++) 503 503 { 504 if ( pVM->pgm.s.pGstPaePDPTRHC->a[i].n.u1Present)504 if (CTXSUFF(pVM->pgm.s.pGstPaePDPTR)->a[i].n.u1Present) 505 505 { 506 RTGCPHYS GCPhys = pVM->pgm.s.pGstPaePDPTRHC->a[i].u & X86_PDPE_PG_MASK; 506 RTGCPHYS GCPhys = CTXSUFF(pVM->pgm.s.pGstPaePDPTR)->a[i].u & X86_PDPE_PG_MASK; 507 # ifndef PGMPOOL_WITH_MIXED_PT_CR3 507 508 if (pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] != GCPhys) 508 509 { … … 510 511 rc = PGMHandlerPhysicalModify(pVM, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i], GCPhys, GCPhys + PAGE_SIZE - 1); 511 512 else 512 rc = PGMR3HandlerPhysicalRegister(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_WRITE, GCPhys, GCPhys + PAGE_SIZE - 1, 513 pgmR3GstPaePDWriteHandler, NULL, 514 NULL, "pgmGCGstPaePDWriteHandler", 0, 515 "Guest PD write access handler"); 513 rc = PGMHandlerPhysicalRegisterEx(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_WRITE, GCPhys, GCPhys + PAGE_SIZE - 1, 514 pVM->pgm.s.pfnR3GstPAEWriteHandlerCR3, 0, 515 0, 0, 516 pVM->pgm.s.pfnGCGstPAEWriteHandlerCR3, 0, 517 pVM->pgm.s.pszR3GstPAEWriteHandlerCR3); 516 518 if (VBOX_SUCCESS(rc)) 517 519 pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] = GCPhys; 518 520 } 521 # else /* PGMPOOL_WITH_MIXED_PT_CR3 */ 522 /** PAE todo */ 523 AssertFailed(); 524 rc = pgmPoolMonitorMonitorCR3(pVM->pgm.s.CTXSUFF(pPool), 525 pVM->pgm.s.enmShadowMode == PGMMODE_PAE 526 || pVM->pgm.s.enmShadowMode == PGMMODE_PAE_NX 527 ? PGMPOOL_IDX_PAE_PD 528 : PGMPOOL_IDX_PD, 529 GCPhys); 530 # endif /* PGMPOOL_WITH_MIXED_PT_CR3 */ 531 if (VBOX_FAILURE(rc)) 532 { 533 AssertMsgFailed(("PGMHandlerPhysicalModify/PGMR3HandlerPhysicalRegister failed, rc=%Rrc GCPhysGstCR3Monitored=%RGp GCPhysCR3=%RGp\n", 534 rc, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i], GCPhys)); 535 return rc; 536 } 537 pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] = GCPhys; 519 538 } 520 539 else if (pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] != NIL_RTGCPHYS) … … 525 544 } 526 545 } 527 # endif528 546 #endif /* PGM_GST_TYPE == PGM_TYPE_PAE */ 529 547 … … 576 594 if (pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] != NIL_RTGCPHYS) 577 595 { 596 # ifndef PGMPOOL_WITH_MIXED_PT_CR3 578 597 int rc2 = PGMHandlerPhysicalDeregister(pVM, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i]); 598 # else /* PGMPOOL_WITH_MIXED_PT_CR3 */ 599 /** PAE todo */ 600 AssertFailed(); 601 int rc2 = pgmPoolMonitorUnmonitorCR3(pVM->pgm.s.CTXSUFF(pPool), 602 pVM->pgm.s.enmShadowMode == PGMMODE_PAE 603 || pVM->pgm.s.enmShadowMode == PGMMODE_PAE_NX 604 ? PGMPOOL_IDX_PAE_PD 605 : PGMPOOL_IDX_PD); 606 # endif /* PGMPOOL_WITH_MIXED_PT_CR3 */ 579 607 AssertRC(rc2); 580 608 if (VBOX_FAILURE(rc2))
Note:
See TracChangeset
for help on using the changeset viewer.