Changeset 9890 in vbox
- Timestamp:
- Jun 24, 2008 8:26:36 AM (17 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r9669 r9890 1264 1264 AssertRelease((uintptr_t)pVM->pgm.s.apHCPaePDs[2] + PAGE_SIZE == (uintptr_t)pVM->pgm.s.apHCPaePDs[3]); 1265 1265 pVM->pgm.s.pHCPaePDPT = (PX86PDPT)MMR3PageAllocLow(pVM); 1266 pVM->pgm.s.pHCPaePML4 = (PX86PML4)MMR3PageAllocLow(pVM);1267 1266 if ( !pVM->pgm.s.pHC32BitPD 1268 1267 || !pVM->pgm.s.apHCPaePDs[0] … … 1270 1269 || !pVM->pgm.s.apHCPaePDs[2] 1271 1270 || !pVM->pgm.s.apHCPaePDs[3] 1272 || !pVM->pgm.s.pHCPaePDPT 1273 || !pVM->pgm.s.pHCPaePML4) 1271 || !pVM->pgm.s.pHCPaePDPT) 1274 1272 { 1275 1273 AssertMsgFailed(("Failed to allocate pages for the intermediate context!\n")); … … 1285 1283 pVM->pgm.s.aHCPhysPaePDs[3] = MMPage2Phys(pVM, pVM->pgm.s.apHCPaePDs[3]); 1286 1284 pVM->pgm.s.HCPhysPaePDPT = MMPage2Phys(pVM, pVM->pgm.s.pHCPaePDPT); 1287 pVM->pgm.s.HCPhysPaePML4 = MMPage2Phys(pVM, pVM->pgm.s.pHCPaePML4);1288 1285 1289 1286 /* … … 1299 1296 /* The flags will be corrected when entering and leaving long mode. */ 1300 1297 } 1301 1302 ASMMemZero32(pVM->pgm.s.pHCPaePML4, PAGE_SIZE);1303 1298 1304 1299 CPUMSetHyperCR3(pVM, (uint32_t)pVM->pgm.s.HCPhys32BitPD); -
trunk/src/VBox/VMM/PGMInternal.h
r9888 r9890 1289 1289 /** Page Directory Pointer Table (PAE root, not currently used). */ 1290 1290 #define PGMPOOL_IDX_PDPT 7 1291 /** Page Map Level-4 (64-bit root). */ 1292 #define PGMPOOL_IDX_PML4 8 1293 /** AMD64 cr3 level. */ 1294 #define PGMPOOL_IDX_AMD64_CR3 9 1291 /** AMD64 CR3 level index.*/ 1292 #define PGMPOOL_IDX_AMD64_CR3 8 1295 1293 /** The first normal index. */ 1296 #define PGMPOOL_IDX_FIRST 101294 #define PGMPOOL_IDX_FIRST 9 1297 1295 /** The last valid index. (inclusive, 14 bits) */ 1298 1296 #define PGMPOOL_IDX_LAST 0x3fff … … 1374 1372 PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD, 1375 1373 1374 /** Shw: 64-bit PML4; Gst: 64-bit PML4. */ 1375 PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4, 1376 1376 1377 /** Shw: Root 32-bit page directory. */ 1377 1378 PGMPOOLKIND_ROOT_32BIT_PD, … … 1380 1381 /** Shw: Root PAE page directory pointer table (legacy, 4 entries). */ 1381 1382 PGMPOOLKIND_ROOT_PDPT, 1382 /** Shw: Root page map level-4 table. */1383 PGMPOOLKIND_ROOT_PML4,1384 1383 1385 1384 /** The last valid entry. */ 1386 PGMPOOLKIND_LAST = PGMPOOLKIND_ROOT_P ML41385 PGMPOOLKIND_LAST = PGMPOOLKIND_ROOT_PDPT 1387 1386 } PGMPOOLKIND; 1388 1387 -
trunk/src/VBox/VMM/PGMPool.cpp
r9881 r9890 267 267 pPool->aPages[PGMPOOL_IDX_PDPT].idx = PGMPOOL_IDX_PDPT; 268 268 269 /* The Shadow Page Map Level-4. */270 pPool->aPages[PGMPOOL_IDX_ PML4].Core.Key = NIL_RTHCPHYS;271 pPool->aPages[PGMPOOL_IDX_ PML4].GCPhys = NIL_RTGCPHYS;272 pPool->aPages[PGMPOOL_IDX_ PML4].pvPageHC = pVM->pgm.s.pHCPaePML4;273 pPool->aPages[PGMPOOL_IDX_ PML4].enmKind = PGMPOOLKIND_ROOT_PML4;274 pPool->aPages[PGMPOOL_IDX_ PML4].idx = PGMPOOL_IDX_PML4;269 /* The Shadow AMD64 CR3. */ 270 pPool->aPages[PGMPOOL_IDX_AMD64_CR3].Core.Key = NIL_RTHCPHYS; 271 pPool->aPages[PGMPOOL_IDX_AMD64_CR3].GCPhys = NIL_RTGCPHYS; 272 pPool->aPages[PGMPOOL_IDX_AMD64_CR3].pvPageHC = 0; 273 pPool->aPages[PGMPOOL_IDX_AMD64_CR3].enmKind = PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4; 274 pPool->aPages[PGMPOOL_IDX_AMD64_CR3].idx = PGMPOOL_IDX_AMD64_CR3; 275 275 276 276 /* -
trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
r9888 r9890 825 825 826 826 Assert(!HWACCMIsNestedPagingActive(pVM)); 827 Assert(pVM->pgm.s.pShwAmd64CR3); 828 827 AssertReturn(pVM->pgm.s.pHCPaePML4, VERR_INTERNAL_ERROR); 828 829 Assert(pVM->pgm.s.pHCPaePML4); 829 830 /* Allocate page directory pointer table if not present. */ 830 831 pPml4e = &pPGM->pHCPaePML4->a[iPml4e]; … … 902 903 903 904 Assert(!HWACCMIsNestedPagingActive(pVM)); 905 AssertReturn(pVM->pgm.s.pHCPaePML4, VERR_INTERNAL_ERROR); 904 906 905 907 pPml4e = &pPGM->pHCPaePML4->a[iPml4e]; -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r9881 r9890 880 880 # else /* AMD64 */ 881 881 /* PML4 */ 882 AssertReturn(pVM->pgm.s.pHCPaePML4, VERR_INTERNAL_ERROR); 883 882 884 const unsigned iPml4e = (GCPtrPage >> X86_PML4_SHIFT) & X86_PML4_MASK; 883 885 const unsigned iPdPte = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; … … 986 988 LogFlow(("InvalidatePage: Out-of-sync PML4E at %VGv Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 987 989 GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 988 pgmPoolFreeByPage(pPool, pShwPdpt, PGMPOOL_IDX_PML4, iPml4e);990 pgmPoolFreeByPage(pPool, pShwPdpt, pVM->pgm.s.pShwAmd64CR3->idx, iPml4e); 989 991 pPml4eDst->u = 0; 990 992 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync)); … … 998 1000 LogFlow(("InvalidatePage: Out-of-sync PML4E (A) at %VGv Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 999 1001 GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 1000 pgmPoolFreeByPage(pPool, pShwPdpt, PGMPOOL_IDX_PML4, iPml4e);1002 pgmPoolFreeByPage(pPool, pShwPdpt, pVM->pgm.s.pShwAmd64CR3->idx, iPml4e); 1001 1003 pPml4eDst->u = 0; 1002 1004 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs)); … … 1008 1010 LogFlow(("InvalidatePage: Out-of-sync PML4E (P) at %VGv Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 1009 1011 GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 1010 pgmPoolFreeByPage(pPool, pShwPdpt, PGMPOOL_IDX_PML4, iPml4e);1012 pgmPoolFreeByPage(pPool, pShwPdpt, pVM->pgm.s.pShwAmd64CR3->idx, iPml4e); 1011 1013 pPml4eDst->u = 0; 1012 1014 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNPs)); … … 1021 1023 LogFlow(("InvalidatePage: Out-of-sync PML4E (GCPhys) at %VGv %VGp vs %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 1022 1024 GCPtrPage, pShwPdpt->GCPhys, GCPhysPdpt, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 1023 pgmPoolFreeByPage(pPool, pShwPdpt, PGMPOOL_IDX_PML4, iPml4e);1025 pgmPoolFreeByPage(pPool, pShwPdpt, pVM->pgm.s.pShwAmd64CR3->idx, iPml4e); 1024 1026 pPml4eDst->u = 0; 1025 1027 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNPs)); … … 3099 3101 LogFlow(("SyncCR3: Out-of-sync PML4E (GCPhys) GCPtr=%VGv %VGp vs %VGp PdpeSrc=%RX64 PdpeDst=%RX64\n", 3100 3102 (uint64_t)iPml4e << X86_PML4_SHIFT, pShwPdpt->GCPhys, GCPhysPdptSrc, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 3101 pgmPoolFreeByPage(pPool, pShwPdpt, PGMPOOL_IDX_PML4, iPml4e);3103 pgmPoolFreeByPage(pPool, pShwPdpt, pVM->pgm.s.pShwAmd64CR3->idx, iPml4e); 3102 3104 pPml4eDst->u = 0; 3103 3105 continue; -
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r9888 r9890 475 475 476 476 Assert(!(GCPhysCR3 >> (PAGE_SHIFT + 32))); 477 rc = pgmPoolAlloc(pVM, GCPhysCR3, PGMPOOLKIND_ ROOT_PML4, PGMPOOL_IDX_AMD64_CR3, GCPhysCR3 >> PAGE_SHIFT, &pVM->pgm.s.pShwAmd64CR3);477 rc = pgmPoolAlloc(pVM, GCPhysCR3, PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4, PGMPOOL_IDX_AMD64_CR3, GCPhysCR3 >> PAGE_SHIFT, &pVM->pgm.s.pShwAmd64CR3); 478 478 if (rc == VERR_PGM_POOL_FLUSHED) 479 479 { … … 481 481 return VINF_PGM_SYNC_CR3; 482 482 } 483 pVM->pgm.s.pHCPaePML4 = (PX86PML4)PGMPOOL_PAGE_2_PTR(pPool->CTXSUFF(pVM), pVM->pgm.s.pShwAmd64CR3); 483 484 # endif 484 485 } … … 524 525 #elif PGM_GST_TYPE == PGM_TYPE_AMD64 525 526 pVM->pgm.s.pGstPaePML4HC = 0; 527 pVM->pgm.s.pHCPaePML4 = 0; 526 528 if (pVM->pgm.s.pShwAmd64CR3) 527 529 { -
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r9881 r9890 262 262 PX86PDPAE pPDPae; 263 263 PX86PDPT pPDPT; 264 PX86PML4 pPML4; 264 265 } uShw; 265 266 uShw.pv = PGMPOOL_PAGE_2_PTR(pPool->CTXSUFF(pVM), pPage); … … 507 508 } 508 509 510 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 511 { 512 /* Hopefully this doesn't happen very often: 513 * - messing with the bits of pd pointers without changing the physical address 514 */ 515 if (!VM_FF_ISSET(pPool->CTXSUFF(pVM), VM_FF_PGM_SYNC_CR3)) 516 { 517 const unsigned iShw = off / sizeof(X86PDPE); 518 if (uShw.pPML4->a[iShw].n.u1Present) 519 { 520 LogFlow(("pgmPoolMonitorChainChanging: pml4 iShw=%#x: %RX64 -> freeing it!\n", iShw, uShw.pPML4->a[iShw].u)); 521 pgmPoolFree(pPool->CTXSUFF(pVM), uShw.pPML4->a[iShw].u & X86_PML4E_PG_MASK, pPage->idx, iShw); 522 uShw.pPML4->a[iShw].u = 0; 523 } 524 /* paranoia / a bit assumptive. */ 525 if ( pCpu 526 && (off & 7) 527 && (off & 7) + pgmPoolDisasWriteSize(pCpu) > sizeof(X86PDPE)) 528 { 529 const unsigned iShw2 = (off + pgmPoolDisasWriteSize(pCpu) - 1) / sizeof(X86PML4E); 530 if (uShw.pPML4->a[iShw2].n.u1Present) 531 { 532 LogFlow(("pgmPoolMonitorChainChanging: pml4 iShw2=%#x: %RX64 -> freeing it!\n", iShw2, uShw.pPML4->a[iShw2].u)); 533 pgmPoolFree(pPool->CTXSUFF(pVM), uShw.pPML4->a[iShw2].u & X86_PML4E_PG_MASK, pPage->idx, iShw2); 534 uShw.pPML4->a[iShw2].u = 0; 535 } 536 } 537 } 538 break; 539 } 540 509 541 default: 510 542 AssertFatalMsgFailed(("enmKind=%d\n", pPage->enmKind)); … … 1007 1039 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 1008 1040 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 1041 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 1009 1042 case PGMPOOLKIND_PAE_PT_FOR_PAE_2MB: 1010 1043 case PGMPOOLKIND_32BIT_PT_FOR_PHYS: … … 1022 1055 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 1023 1056 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 1057 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 1024 1058 case PGMPOOLKIND_PAE_PT_FOR_PAE_2MB: 1025 1059 switch (enmKind2) … … 1043 1077 case PGMPOOLKIND_ROOT_PAE_PD: 1044 1078 case PGMPOOLKIND_ROOT_PDPT: 1045 case PGMPOOLKIND_ROOT_PML4:1046 1079 return false; 1047 1080 … … 1234 1267 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 1235 1268 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 1269 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 1236 1270 case PGMPOOLKIND_ROOT_32BIT_PD: 1237 1271 case PGMPOOLKIND_ROOT_PAE_PD: 1238 1272 case PGMPOOLKIND_ROOT_PDPT: 1239 case PGMPOOLKIND_ROOT_PML4:1240 1273 { 1241 1274 /* find the head */ … … 1291 1324 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 1292 1325 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 1326 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 1293 1327 case PGMPOOLKIND_ROOT_PDPT: 1294 1328 break; … … 1304 1338 case PGMPOOLKIND_ROOT_32BIT_PD: 1305 1339 case PGMPOOLKIND_ROOT_PAE_PD: 1306 case PGMPOOLKIND_ROOT_PML4:1307 1340 #ifdef PGMPOOL_WITH_MIXED_PT_CR3 1308 1341 break; … … 1373 1406 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 1374 1407 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 1408 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 1375 1409 case PGMPOOLKIND_ROOT_PDPT: 1376 1410 break; … … 1386 1420 case PGMPOOLKIND_ROOT_32BIT_PD: 1387 1421 case PGMPOOLKIND_ROOT_PAE_PD: 1388 case PGMPOOLKIND_ROOT_PML4:1389 1422 #ifdef PGMPOOL_WITH_MIXED_PT_CR3 1390 1423 break; … … 2067 2100 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 2068 2101 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 2102 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 2069 2103 case PGMPOOLKIND_ROOT_PAE_PD: 2070 2104 case PGMPOOLKIND_ROOT_PDPT: 2071 case PGMPOOLKIND_ROOT_PML4:2072 2105 return 8; 2073 2106 … … 2104 2137 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 2105 2138 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 2139 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 2106 2140 case PGMPOOLKIND_ROOT_PAE_PD: 2107 2141 case PGMPOOLKIND_ROOT_PDPT: 2108 case PGMPOOLKIND_ROOT_PML4:2109 2142 return 8; 2110 2143 … … 2424 2457 Assert(pUser->iUserTable < X86_PG_PAE_ENTRIES); 2425 2458 break; 2426 case PGMPOOLKIND_ ROOT_PML4:2459 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 2427 2460 Assert(!(u.pau64[pUser->iUserTable] & PGM_PLXFLAGS_PERMANENT)); 2428 Assert(pUser->iUserTable < X86_PG_PAE_ENTRIES);2461 /* GCPhys >> PAGE_SHIFT is the index here */ 2429 2462 break; 2430 2463 default: … … 2451 2484 case PGMPOOLKIND_64BIT_PD_FOR_64BIT_PD: 2452 2485 case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT: 2453 case PGMPOOLKIND_ ROOT_PML4:2486 case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4: 2454 2487 u.pau64[pUser->iUserTable] = 0; 2455 2488 break; … … 3135 3168 break; 3136 3169 3137 case PGMPOOLKIND_ROOT_PML4:3138 for (unsigned iPage = 0; iPage < X86_PG_PAE_ENTRIES; iPage++)3139 if ((u.pau64[iPage] & (PGM_PLXFLAGS_PERMANENT | X86_PML4E_P)) == X86_PML4E_P)3140 u.pau64[iPage] = 0;3141 break;3142 3143 3170 case PGMPOOLKIND_ROOT_PDPT: 3144 3171 /* Not root of shadowed pages currently, ignore it. */
Note:
See TracChangeset
for help on using the changeset viewer.