Changeset 13933 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Nov 6, 2008 6:55:03 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 38956
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
r13832 r13933 826 826 && !(pPdpe->u & X86_PDPE_PG_MASK)) 827 827 { 828 PX86PDPE pPdptGst = &CTXSUFF(pPGM->pGstPaePDPT)->a[iPdPt];828 PX86PDPE pPdptGst = pgmGstGetPaePDPEPtr(pPGM, GCPtr); 829 829 830 830 Assert(!(pPdpe->u & X86_PDPE_PG_MASK)); … … 1230 1230 { 1231 1231 Assert(iPdpt <= 3); 1232 return p VM->pgm.s.CTXSUFF(pGstPaePDPT)->a[iPdpt & 3];1232 return pgmGstGetPaePDPTPtr(&pVM->pgm.s)->a[iPdpt & 3]; 1233 1233 } 1234 1234 -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r13919 r13933 109 109 # if PGM_GST_TYPE == PGM_TYPE_PAE 110 110 unsigned iPDSrc; 111 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, (RTGCUINTPTR)pvFault, &iPDSrc );111 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, (RTGCUINTPTR)pvFault, &iPDSrc, NULL); 112 112 113 113 # elif PGM_GST_TYPE == PGM_TYPE_AMD64 … … 959 959 unsigned iPDSrc; 960 960 # if PGM_GST_TYPE == PGM_TYPE_PAE 961 PX86PDPAE pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc);962 X86PDPE PdpeSrc = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte];961 X86PDPE PdpeSrc; 962 PX86PDPAE pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc, &PdpeSrc); 963 963 # else /* AMD64 */ 964 964 PX86PML4E pPml4eSrc; … … 1095 1095 1096 1096 # if PGM_GST_TYPE == PGM_TYPE_PAE 1097 /* Note: This shouldn't actually be necessary as we monitor the PDPT page for changes. */ 1097 /* 1098 * Update the shadow PDPE and free all the shadow PD entries if the PDPE is marked not present. 1099 * Note: This shouldn't actually be necessary as we monitor the PDPT page for changes. 1100 */ 1098 1101 if (!pPDSrc) 1099 1102 { … … 1103 1106 PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool); 1104 1107 1105 Assert(! (CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte].n.u1Present));1108 Assert(!PdpeSrc.n.u1Present); 1106 1109 LogFlow(("InvalidatePage: guest PDPE %d not present; clear shw pdpe\n", iPdpte)); 1107 /* for each page directory entry */ 1108 for (unsigned iPD = 0; iPD < X86_PG_PAE_ENTRIES; iPD++) 1110 1111 /* for each page directory entry */ 1112 for (unsigned iPD = 0; iPD < X86_PG_PAE_ENTRIES; iPD++) 1113 { 1114 if ( pPDEDst[iPD].n.u1Present 1115 && !(pPDEDst[iPD].u & PGM_PDFLAGS_MAPPING)) 1109 1116 { 1110 if ( pPDEDst[iPD].n.u1Present 1111 && !(pPDEDst[iPD].u & PGM_PDFLAGS_MAPPING)) 1112 { 1113 pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, pPDEDst[iPD].u & SHW_PDE_PG_MASK), SHW_POOL_ROOT_IDX, iPdpte * X86_PG_PAE_ENTRIES + iPD); 1114 pPDEDst[iPD].u = 0; 1115 } 1116 } 1117 pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, pPDEDst[iPD].u & SHW_PDE_PG_MASK), SHW_POOL_ROOT_IDX, iPdpte * X86_PG_PAE_ENTRIES + iPD); 1118 pPDEDst[iPD].u = 0; 1119 } 1120 } 1117 1121 if (!(pPdptDst->a[iPdpte].u & PGM_PLXFLAGS_MAPPING)) 1118 1122 pPdptDst->a[iPdpte].n.u1Present = 0; … … 2020 2024 Assert(pPdpeSrc); 2021 2025 2022 # else /* PAE */2023 PX86PDPE pPdpeSrc = &pVM->pgm.s.CTXSUFF(pGstPaePDPT)->a[(GCPtrPage >> GST_PDPT_SHIFT) & GST_PDPT_MASK];2024 # endif 2026 # else /* PAE */ 2027 PX86PDPE pPdpeSrc = pgmGstGetPaePDPEPtr(&pVM->pgm.s, GCPtrPage); 2028 # endif /* PAE */ 2025 2029 2026 2030 /* … … 2813 2817 # elif PGM_GST_TYPE == PGM_TYPE_PAE 2814 2818 unsigned iPDSrc; 2815 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc );2819 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc, NULL); 2816 2820 if (!pPDSrc) 2817 2821 return VINF_SUCCESS; /* not present */ … … 2932 2936 # elif PGM_GST_TYPE == PGM_TYPE_PAE 2933 2937 unsigned iPDSrc; 2934 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc );2938 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc, NULL); 2935 2939 2936 2940 if (pPDSrc) … … 3225 3229 unsigned iPDSrc; 3226 3230 # if PGM_GST_TYPE == PGM_TYPE_PAE 3231 X86PDPE PdpeSrc; 3232 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, iPdpte << X86_PDPT_SHIFT, &iPDSrc, &PdpeSrc); 3227 3233 PX86PDPAE pPDPAE = pVM->pgm.s.CTXMID(ap,PaePDs)[0]; 3228 3234 PX86PDEPAE pPDEDst = &pPDPAE->a[iPdpte * X86_PG_PAE_ENTRIES]; 3229 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, iPdpte << X86_PDPT_SHIFT, &iPDSrc);3230 3235 PX86PDPT pPdptDst = pVM->pgm.s.CTXMID(p,PaePDPT); NOREF(pPdptDst); 3231 X86PDPE PdpeSrc = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte];3232 3236 3233 3237 if (pPDSrc == NULL) … … 3655 3659 rc = PGMShwGetPage(pVM, (RTGCPTR)pPGM->pGuestPDRC, NULL, &HCPhysShw); 3656 3660 # else 3657 rc = PGMShwGetPage(pVM, (RTGCPTR)pPGM->pGstPaePDPT GC, NULL, &HCPhysShw);3661 rc = PGMShwGetPage(pVM, (RTGCPTR)pPGM->pGstPaePDPTRC, NULL, &HCPhysShw); 3658 3662 # endif 3659 3663 AssertRCReturn(rc, 1); … … 3764 3768 RTGCPHYS GCPhysPdeSrc; 3765 3769 # if PGM_GST_TYPE == PGM_TYPE_PAE 3770 X86PDPE PdpeSrc; 3771 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtr, &iPDSrc, &PdpeSrc); 3766 3772 PX86PDPAE pPDDst = pVM->pgm.s.CTXMID(ap,PaePDs)[0]; 3767 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtr, &iPDSrc);3768 3773 PX86PDPT pPdptDst = pVM->pgm.s.CTXMID(p,PaePDPT); 3769 X86PDPE PdpeSrc = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[iPdpte];3770 3774 # else 3771 3775 PX86PML4E pPml4eSrc; -
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r13923 r13933 459 459 460 460 # elif PGM_GST_TYPE == PGM_TYPE_PAE 461 unsigned offset = GCPhysCR3 & GST_CR3_PAGE_MASK & PAGE_OFFSET_MASK; 462 pVM->pgm.s.pGstPaePDPTHC = (R3R0PTRTYPE(PX86PDPT)) HCPtrGuestCR3; 463 pVM->pgm.s.pGstPaePDPTGC = (RCPTRTYPE(PX86PDPT)) ((RCPTRTYPE(uint8_t *))pVM->pgm.s.GCPtrCR3Mapping + offset); 464 Log(("Cached mapping %RGv\n", pVM->pgm.s.pGstPaePDPTGC)); 461 unsigned off = GCPhysCR3 & GST_CR3_PAGE_MASK & PAGE_OFFSET_MASK; 462 pVM->pgm.s.pGstPaePDPTR3 = (R3PTRTYPE(PX86PDPT))HCPtrGuestCR3; 463 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 464 pVM->pgm.s.pGstPaePDPTR0 = (R0PTRTYPE(PX86PDPT))HCPtrGuestCR3; 465 # endif 466 pVM->pgm.s.pGstPaePDPTRC = (RCPTRTYPE(PX86PDPT))((RCPTRTYPE(uint8_t *))pVM->pgm.s.GCPtrCR3Mapping + off); 467 Log(("Cached mapping %RGv\n", pVM->pgm.s.pGstPaePDPTRC)); 465 468 466 469 /* 467 470 * Map the 4 PDs too. 468 471 */ 472 PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s); 469 473 RTGCUINTPTR GCPtr = (RTGCUINTPTR)pVM->pgm.s.GCPtrCR3Mapping + PAGE_SIZE; 470 474 for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++, GCPtr += PAGE_SIZE) 471 475 { 472 if (p VM->pgm.s.CTXSUFF(pGstPaePDPT)->a[i].n.u1Present)476 if (pGuestPDPT->a[i].n.u1Present) 473 477 { 474 478 RTHCPTR HCPtr; 475 479 RTHCPHYS HCPhys; 476 RTGCPHYS GCPhys = p VM->pgm.s.CTXSUFF(pGstPaePDPT)->a[i].u & X86_PDPE_PG_MASK;480 RTGCPHYS GCPhys = pGuestPDPT->a[i].u & X86_PDPE_PG_MASK; 477 481 int rc2 = pgmRamGCPhys2HCPtrAndHCPhysWithFlags(&pVM->pgm.s, GCPhys, &HCPtr, &HCPhys); 478 482 if (RT_SUCCESS(rc2)) … … 480 484 rc = PGMMap(pVM, GCPtr, HCPhys & X86_PTE_PAE_PG_MASK, PAGE_SIZE, 0); 481 485 AssertRCReturn(rc, rc); 482 pVM->pgm.s.apGstPaePDsHC[i] = (R3R0PTRTYPE(PX86PDPAE))HCPtr; 483 pVM->pgm.s.apGstPaePDsGC[i] = (RCPTRTYPE(PX86PDPAE))GCPtr; 486 487 pVM->pgm.s.apGstPaePDsR3[i] = (R3PTRTYPE(PX86PDPAE))HCPtr; 488 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 489 pVM->pgm.s.apGstPaePDsR0[i] = (R0PTRTYPE(PX86PDPAE))HCPtr; 490 # endif 491 pVM->pgm.s.apGstPaePDsRC[i] = (RCPTRTYPE(PX86PDPAE))GCPtr; 484 492 pVM->pgm.s.aGCPhysGstPaePDs[i] = GCPhys; 485 PGM_INVL_PG(GCPtr); 493 PGM_INVL_PG(GCPtr); /** @todo This ends up calling HWACCMInvalidatePage, is that correct? */ 486 494 continue; 487 495 } … … 489 497 } 490 498 491 pVM->pgm.s.apGstPaePDsHC[i] = 0; 492 pVM->pgm.s.apGstPaePDsGC[i] = 0; 499 pVM->pgm.s.apGstPaePDsR3[i] = 0; 500 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 501 pVM->pgm.s.apGstPaePDsR0[i] = 0; 502 # endif 503 pVM->pgm.s.apGstPaePDsRC[i] = 0; 493 504 pVM->pgm.s.aGCPhysGstPaePDs[i] = NIL_RTGCPHYS; 494 PGM_INVL_PG(GCPtr); 505 PGM_INVL_PG(GCPtr); /** @todo this shouldn't be necessary? */ 495 506 } 496 507 # elif PGM_GST_TYPE == PGM_TYPE_AMD64 … … 560 571 561 572 #elif PGM_GST_TYPE == PGM_TYPE_PAE 562 pVM->pgm.s.pGstPaePDPTHC = 0; 563 pVM->pgm.s.pGstPaePDPTGC = 0; 564 for (unsigned i=0; i < X86_PG_PAE_PDPE_ENTRIES; i++) 565 { 566 pVM->pgm.s.apGstPaePDsHC[i] = 0; 567 pVM->pgm.s.apGstPaePDsGC[i] = 0; 573 pVM->pgm.s.pGstPaePDPTR3 = 0; 574 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 575 pVM->pgm.s.pGstPaePDPTR0 = 0; 576 # endif 577 pVM->pgm.s.pGstPaePDPTRC = 0; 578 for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++) 579 { 580 pVM->pgm.s.apGstPaePDsR3[i] = 0; 581 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE 582 pVM->pgm.s.apGstPaePDsR0[i] = 0; 583 # endif 584 pVM->pgm.s.apGstPaePDsRC[i] = 0; 568 585 pVM->pgm.s.aGCPhysGstPaePDs[i] = NIL_RTGCPHYS; 569 586 } … … 666 683 * Do the 4 PDs. 667 684 */ 685 PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s); 668 686 for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++) 669 687 { 670 if ( CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].n.u1Present)671 { 672 RTGCPHYS GCPhys = CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u & X86_PDPE_PG_MASK;688 if (pGuestPDPT->a[i].n.u1Present) 689 { 690 RTGCPHYS GCPhys = pGuestPDPT->a[i].u & X86_PDPE_PG_MASK; 673 691 if (pVM->pgm.s.aGCPhysGstPaePDsMonitored[i] != GCPhys) 674 692 { … … 1089 1107 * We'll simply check all of them instead of figuring out which one/two to check. 1090 1108 */ 1109 PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s); 1091 1110 for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++) 1092 1111 { 1093 if ( CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].n.u1Present1094 && ( CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u & X86_PDPE_PG_MASK)1095 !=pVM->pgm.s.aGCPhysGstPaePDsMonitored[i])1112 if ( pGuestPDPT->a[i].n.u1Present 1113 && (pGuestPDPT->a[i].u & X86_PDPE_PG_MASK) 1114 != pVM->pgm.s.aGCPhysGstPaePDsMonitored[i]) 1096 1115 { 1097 1116 /* … … 1107 1126 pVM->pgm.s.fSyncFlags |= PGM_SYNC_MONITOR_CR3; 1108 1127 Log(("pgmXXGstPaeWriteHandlerCR3: detected updated PDPE; [%d] = %#llx, Old GCPhys=%RGp\n", 1109 i, CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i]));1128 i, pGuestPDPT->a[i].u, pVM->pgm.s.aGCPhysGstPaePDsMonitored[i])); 1110 1129 } 1111 1130 } … … 1155 1174 */ 1156 1175 RTGCUINTPTR i; 1176 PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(&pVM->pgm.s); 1157 1177 for (i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++) 1158 if ( CTXSUFF(pVM->pgm.s.pGstPaePDPT)->a[i].u == (GCPhysFault & X86_PTE_PAE_PG_MASK))1178 if (pGuestPDPT->a[i].u == (GCPhysFault & X86_PTE_PAE_PG_MASK)) 1159 1179 { 1160 1180 PX86PDPAE pPDSrc = pgmGstGetPaePD(&pVM->pgm.s, i << X86_PDPT_SHIFT); 1161 const RTGCUINTPTR offPD = GCPhysFault & PAGE_OFFSET_MASK;1181 const RTGCUINTPTR offPD = GCPhysFault & PAGE_OFFSET_MASK; 1162 1182 const unsigned iPD1 = offPD / sizeof(X86PDEPAE); 1163 1183 const unsigned iPD2 = (offPD + cb - 1) / sizeof(X86PDEPAE); … … 1167 1187 Assert(iPD2 < X86_PG_PAE_ENTRIES); 1168 1188 1169 # ifdef DEBUG1189 # ifdef LOG_ENABLED 1170 1190 Log(("pgmXXGstPaeWriteHandlerPD: emulated change to i=%d iPD1=%#05x (%x)\n", 1171 1191 i, iPD1, (i << X86_PDPT_SHIFT) | (iPD1 << X86_PD_PAE_SHIFT))); … … 1173 1193 Log(("pgmXXGstPaeWriteHandlerPD: emulated change to i=%d iPD2=%#05x (%x)\n", 1174 1194 i, iPD2, (i << X86_PDPT_SHIFT) | (iPD2 << X86_PD_PAE_SHIFT))); 1175 # endif1195 # endif 1176 1196 1177 1197 if (!pVM->pgm.s.fMappingsFixed)
Note:
See TracChangeset
for help on using the changeset viewer.