Changeset 9778 in vbox
- Timestamp:
- Jun 17, 2008 3:24:11 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 32139
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGMPool.cpp
r9692 r9778 200 200 paUsers[i].iNext = i + 1; 201 201 paUsers[i].iUser = NIL_PGMPOOL_IDX; 202 paUsers[i].iUserTable = 0xfff ffffe;202 paUsers[i].iUserTable = 0xfffe; 203 203 } 204 204 paUsers[cMaxUsers - 1].iNext = NIL_PGMPOOL_USER_INDEX; -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r9758 r9778 870 870 * (Guessing that it is frequent for a shadow PDE to not be present, do this first.) 871 871 */ 872 const unsigned iPDDst = GCPtrPage >> SHW_PD_SHIFT;873 872 # if PGM_SHW_TYPE == PGM_TYPE_32BIT 874 PX86PDE pPdeDst = &pVM->pgm.s.CTXMID(p,32BitPD)->a[iPDDst]; 873 const unsigned iPDDst = GCPtrPage >> SHW_PD_SHIFT; 874 PX86PDE pPdeDst = &pVM->pgm.s.CTXMID(p,32BitPD)->a[iPDDst]; 875 875 # elif PGM_SHW_TYPE == PGM_TYPE_PAE 876 PX86PDEPAE pPdeDst = &pVM->pgm.s.CTXMID(ap,PaePDs[0])->a[iPDDst]; 876 const unsigned iPDDst = GCPtrPage >> SHW_PD_SHIFT; 877 const unsigned iPdPte = (GCPtrPage >> X86_PDPT_SHIFT); /* no mask; flat index into the 2048 entry array. */ 878 PX86PDEPAE pPdeDst = &pVM->pgm.s.CTXMID(ap,PaePDs[0])->a[iPDDst]; 879 PX86PDPT pPdptDst = pVM->pgm.s.CTXMID(p,PaePDPT); 877 880 # else /* AMD64 */ 878 881 /* PML4 */ 879 const unsigned iPml4 = ((RTGCUINTPTR64)GCPtrPage >> X86_PML4_SHIFT) & X86_PML4_MASK; 880 PX86PML4E pPml4eDst = &CTXMID(pVM->pgm.s.p,PaePML4)->a[iPml4]; 881 if (!pPml4eDst->n.u1Present) 882 { 882 const unsigned iPml4e = (GCPtrPage >> X86_PML4_SHIFT) & X86_PML4_MASK; 883 const unsigned iPdPte = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 884 const unsigned iPDDst = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK; 885 PX86PDPAE pPDDst; 886 PX86PDPT pPdptDst; 887 PX86PML4E pPml4eDst = &pVM->pgm.s.pHCPaePML4->a[iPml4e]; 888 rc = PGMShwGetLongModePDPtr(pVM, GCPtrPage, &pPdptDst, &pPDDst); 889 if (rc != VINF_SUCCESS) 890 { 891 AssertMsg(rc == VERR_PAGE_DIRECTORY_PTR_NOT_PRESENT || rc == VERR_PAGE_MAP_LEVEL4_NOT_PRESENT, ("Unexpected rc=%Vrc\n", rc)); 883 892 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePageSkipped)); 884 893 return VINF_SUCCESS; 885 894 } 886 887 /* PDPT */ 888 PX86PDPT pPDPT; 889 rc = PGM_HCPHYS_2_PTR(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, &pPDPT); 890 if (VBOX_FAILURE(rc)) 891 return rc; 892 const unsigned iPDPT = ((RTGCUINTPTR64)GCPtrPage >> SHW_PDPT_SHIFT) & SHW_PDPT_MASK; 893 PX86PDPE pPdpeDst = &pPDPT->a[iPDPT]; 894 if (!pPdpeDst->n.u1Present) 895 { 896 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePageSkipped)); 897 return VINF_SUCCESS; 898 } 899 900 /* PD */ 901 PX86PDPAE pPd; 902 rc = PGM_HCPHYS_2_PTR(pVM, pPdpeDst->u & X86_PDPE_PG_MASK, &pPd); 903 if (VBOX_FAILURE(rc)) 904 return rc; 905 const unsigned iPd = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK; 906 PX86PDEPAE pPdeDst = &pPd->a[iPd]; 895 Assert(pPDDst); 896 897 PX86PDEPAE pPdeDst = &pPDDst->a[iPDDst]; 898 PX86PDPE pPdpeDst = &pPdptDst->a[iPdPte]; 907 899 # endif 908 900 … … 969 961 970 962 963 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 964 /* Fetch the pgm pool shadow descriptor. */ 965 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdPte].u & X86_PDPE_PG_MASK); 966 Assert(pShwPde); 967 # endif 968 971 969 # if PGM_GST_TYPE == PGM_TYPE_AMD64 972 970 Assert(pPml4eDst->n.u1Present && pPml4eDst->u & SHW_PDPT_MASK); … … 981 979 LogFlow(("InvalidatePage: Out-of-sync PML4E at %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 982 980 GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 983 pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4 );981 pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4e); 984 982 pPml4eDst->u = 0; 985 983 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync)); … … 993 991 LogFlow(("InvalidatePage: Out-of-sync PML4E (A) at %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 994 992 GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 995 pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4 );993 pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4e); 996 994 pPml4eDst->u = 0; 997 995 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs)); … … 1003 1001 LogFlow(("InvalidatePage: Out-of-sync PML4E (P) at %VGp Pml4eSrc=%RX64 Pml4eDst=%RX64\n", 1004 1002 GCPtrPage, (uint64_t)pPml4eSrc->u, (uint64_t)pPml4eDst->u)); 1005 pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4 );1003 pgmPoolFree(pVM, pPml4eDst->u & X86_PML4E_PG_MASK, PGMPOOL_IDX_PML4, iPml4e); 1006 1004 pPml4eDst->u = 0; 1007 1005 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNPs)); … … 1021 1019 LogFlow(("InvalidatePage: Out-of-sync PDPE at %VGp PdpeSrc=%RX64 PdpeDst=%RX64\n", 1022 1020 GCPtrPage, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u)); 1023 pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4 );1021 pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4e); 1024 1022 pPdpeDst->u = 0; 1025 1023 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync)); … … 1033 1031 LogFlow(("InvalidatePage: Out-of-sync PDPE (A) at %VGp PdpeSrc=%RX64 PdpeDst=%RX64\n", 1034 1032 GCPtrPage, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u)); 1035 pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4 );1033 pgmPoolFree(pVM, pPdpeDst->u & SHW_PDPT_MASK, PGMPOOL_IDX_PML4, iPml4e); 1036 1034 pPdpeDst->u = 0; 1037 1035 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs)); … … 1074 1072 LogFlow(("InvalidatePage: Out-of-sync at %VGp PdeSrc=%RX64 PdeDst=%RX64\n", 1075 1073 GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u)); 1074 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 1075 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst); 1076 # else 1076 1077 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst); 1078 # endif 1077 1079 pPdeDst->u = 0; 1078 1080 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync)); … … 1086 1088 LogFlow(("InvalidatePage: Out-of-sync (A) at %VGp PdeSrc=%RX64 PdeDst=%RX64\n", 1087 1089 GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u)); 1090 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 1091 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst); 1092 # else 1088 1093 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst); 1094 # endif 1089 1095 pPdeDst->u = 0; 1090 1096 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNAs)); … … 1130 1136 LogFlow(("InvalidatePage: Out-of-sync at %VGp PdeSrc=%RX64 PdeDst=%RX64 ShwGCPhys=%VGp iPDDst=%#x\n", 1131 1137 GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u, pShwPage->GCPhys, iPDDst)); 1138 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 1139 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst); 1140 # else 1132 1141 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst); 1142 # endif 1133 1143 pPdeDst->u = 0; 1134 1144 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDOutOfSync)); … … 1172 1182 LogFlow(("InvalidatePage: Out-of-sync PD at %VGp PdeSrc=%RX64 PdeDst=%RX64\n", 1173 1183 GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u)); 1184 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 1185 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst); 1186 # else 1174 1187 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst); 1188 # endif 1175 1189 pPdeDst->u = 0; 1176 1190 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePage4MBPages)); … … 1185 1199 if (!(PdeDst.u & PGM_PDFLAGS_MAPPING)) 1186 1200 { 1201 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 1202 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst); 1203 # else 1187 1204 pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPDDst); 1205 # endif 1188 1206 pPdeDst->u = 0; 1189 1207 STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePagePDNPs)); -
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r9777 r9778 3214 3214 paUsers[i].iNext = i + 1; 3215 3215 paUsers[i].iUser = NIL_PGMPOOL_IDX; 3216 paUsers[i].iUserTable = 0xfff ffffe;3216 paUsers[i].iUserTable = 0xfffe; 3217 3217 } 3218 3218 paUsers[cMaxUsers - 1].iNext = NIL_PGMPOOL_USER_INDEX;
Note:
See TracChangeset
for help on using the changeset viewer.