Changeset 14094 in vbox
- Timestamp:
- Nov 11, 2008 4:47:38 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 39164
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r14093 r14094 150 150 # if PGM_GST_TYPE == PGM_TYPE_PAE 151 151 /* Did we mark the PDPT as not present in SyncCR3? */ 152 unsigned iPdpt e= (pvFault >> SHW_PDPT_SHIFT) & SHW_PDPT_MASK;152 unsigned iPdpt = (pvFault >> SHW_PDPT_SHIFT) & SHW_PDPT_MASK; 153 153 PX86PDPT pPdptDst = pgmShwGetPaePDPTPtr(&pVM->pgm.s); 154 if (!pPdptDst->a[iPdpte].n.u1Present) 155 pPdptDst->a[iPdpte].n.u1Present = 1; 156 157 # endif 154 if (!pPdptDst->a[iPdpt].n.u1Present) 155 pPdptDst->a[iPdpt].n.u1Present = 1; 156 # endif /* GST PAE */ 158 157 159 158 # elif PGM_SHW_TYPE == PGM_TYPE_AMD64 … … 915 914 916 915 const unsigned iPml4 = (GCPtrPage >> X86_PML4_SHIFT) & X86_PML4_MASK; 917 const unsigned iPdpt e= (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;916 const unsigned iPdpt = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 918 917 const unsigned iPDDst = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK; 919 918 PX86PDPAE pPDDst; … … 932 931 933 932 PX86PDEPAE pPdeDst = &pPDDst->a[iPDDst]; 934 PX86PDPE pPdpeDst = &pPdptDst->a[iPdpt e];933 PX86PDPE pPdpeDst = &pPdptDst->a[iPdpt]; 935 934 936 935 if (!pPdpeDst->n.u1Present) … … 1012 1011 1013 1012 /* Fetch the pgm pool shadow descriptor. */ 1014 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt e].u & SHW_PDPE_PG_MASK);1013 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt].u & SHW_PDPE_PG_MASK); 1015 1014 Assert(pShwPde); 1016 1015 … … 1063 1062 LogFlow(("InvalidatePage: Out-of-sync PDPE (P/GCPhys) at %RGv GCPhys=%RGp vs %RGp PdpeSrc=%RX64 PdpeDst=%RX64\n", 1064 1063 GCPtrPage, pShwPde->GCPhys, GCPhysPd, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u)); 1065 pgmPoolFreeByPage(pPool, pShwPde, pShwPdpt->idx, iPdpt e);1064 pgmPoolFreeByPage(pPool, pShwPde, pShwPdpt->idx, iPdpt); 1066 1065 pPdpeDst->u = 0; 1067 1066 STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,InvalidatePagePDNPs)); … … 1077 1076 LogFlow(("InvalidatePage: Out-of-sync PDPE at %RGv PdpeSrc=%RX64 PdpeDst=%RX64\n", 1078 1077 GCPtrPage, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u)); 1079 pgmPoolFreeByPage(pPool, pShwPde, pShwPdpt->idx, iPdpt e);1078 pgmPoolFreeByPage(pPool, pShwPde, pShwPdpt->idx, iPdpt); 1080 1079 pPdpeDst->u = 0; 1081 1080 STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,InvalidatePagePDOutOfSync)); … … 1089 1088 LogFlow(("InvalidatePage: Out-of-sync PDPE (A) at %RGv PdpeSrc=%RX64 PdpeDst=%RX64\n", 1090 1089 GCPtrPage, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u)); 1091 pgmPoolFreeByPage(pPool, pShwPde, pShwPdpt->idx, iPdpt e);1090 pgmPoolFreeByPage(pPool, pShwPde, pShwPdpt->idx, iPdpt); 1092 1091 pPdpeDst->u = 0; 1093 1092 STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,InvalidatePagePDNAs)); … … 1601 1600 1602 1601 # elif PGM_SHW_TYPE == PGM_TYPE_AMD64 1603 const unsigned iPDDst = ( (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK);1604 const unsigned iPdpt e= (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;1602 const unsigned iPDDst = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK; 1603 const unsigned iPdpt = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 1605 1604 PX86PDPAE pPDDst; 1606 1605 X86PDEPAE PdeDst; … … 1613 1612 # endif 1614 1613 Assert(PdeDst.n.u1Present); 1615 PPGMPOOLPAGE pShwPage = pgmPoolGetPageByHCPhys(pVM, PdeDst.u & SHW_PDE_PG_MASK);1614 PPGMPOOLPAGE pShwPage = pgmPoolGetPageByHCPhys(pVM, PdeDst.u & SHW_PDE_PG_MASK); 1616 1615 1617 1616 # if PGM_GST_TYPE == PGM_TYPE_AMD64 1618 1617 /* Fetch the pgm pool shadow descriptor. */ 1619 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpte].u & X86_PDPE_PG_MASK);1618 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt].u & X86_PDPE_PG_MASK); 1620 1619 Assert(pShwPde); 1621 1620 # endif … … 1868 1867 # elif PGM_SHW_TYPE == PGM_TYPE_AMD64 1869 1868 const unsigned iPDDst = ((GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK); 1870 const unsigned iPdpt e = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; NOREF(iPdpte);1869 const unsigned iPdpt = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; NOREF(iPdpt); 1871 1870 PX86PDPAE pPDDst; 1872 1871 X86PDEPAE PdeDst; … … 2328 2327 2329 2328 # elif PGM_SHW_TYPE == PGM_TYPE_AMD64 2330 const unsigned iPdpt e= (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;2329 const unsigned iPdpt = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 2331 2330 const unsigned iPDDst = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK; 2332 2331 PX86PDPAE pPDDst; … … 2341 2340 # if PGM_GST_TYPE == PGM_TYPE_AMD64 2342 2341 /* Fetch the pgm pool shadow descriptor. */ 2343 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt e].u & X86_PDPE_PG_MASK);2342 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt].u & X86_PDPE_PG_MASK); 2344 2343 Assert(pShwPde); 2345 2344 # endif … … 2700 2699 && (PGM_SHW_TYPE != PGM_TYPE_EPT || PGM_GST_TYPE == PGM_TYPE_PROT) 2701 2700 2702 int rc = VINF_SUCCESS;2703 2701 2704 2702 /* 2705 2703 * Validate input a little bit. 2706 2704 */ 2705 int rc = VINF_SUCCESS; 2707 2706 # if PGM_SHW_TYPE == PGM_TYPE_32BIT 2708 2707 const unsigned iPDDst = GCPtrPage >> SHW_PD_SHIFT; … … 2715 2714 2716 2715 # elif PGM_SHW_TYPE == PGM_TYPE_AMD64 2717 const unsigned iPdpt e= (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;2716 const unsigned iPdpt = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 2718 2717 const unsigned iPDDst = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK; 2719 2718 PX86PDPAE pPDDst; … … 2725 2724 2726 2725 /* Fetch the pgm pool shadow descriptor. */ 2727 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt e].u & X86_PDPE_PG_MASK);2726 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt].u & X86_PDPE_PG_MASK); 2728 2727 Assert(pShwPde); 2729 2728 2730 2729 # elif PGM_SHW_TYPE == PGM_TYPE_EPT 2731 const unsigned iPdpt e= (GCPtrPage >> EPT_PDPT_SHIFT) & EPT_PDPT_MASK;2730 const unsigned iPdpt = (GCPtrPage >> EPT_PDPT_SHIFT) & EPT_PDPT_MASK; 2732 2731 const unsigned iPDDst = ((GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK); 2733 2732 PEPTPD pPDDst; … … 2744 2743 2745 2744 /* Fetch the pgm pool shadow descriptor. */ 2746 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt e].u & EPT_PDPTE_PG_MASK);2745 PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(pVM, pPdptDst->a[iPdpt].u & EPT_PDPTE_PG_MASK); 2747 2746 Assert(pShwPde); 2748 2747 # endif … … 2769 2768 GCPhys = GCPtrPage & X86_PAGE_4K_BASE_MASK; 2770 2769 # if PGM_SHW_TYPE == PGM_TYPE_AMD64 || PGM_SHW_TYPE == PGM_TYPE_EPT 2771 rc = pgmPoolAlloc(pVM, GCPhys & ~(RT_BIT_64(SHW_PD_SHIFT) - 1), BTH_PGMPOOLKIND_PT_FOR_PT, pShwPde->idx, 2770 rc = pgmPoolAlloc(pVM, GCPhys & ~(RT_BIT_64(SHW_PD_SHIFT) - 1), BTH_PGMPOOLKIND_PT_FOR_PT, pShwPde->idx, iPDDst, &pShwPage); 2772 2771 # else 2773 2772 rc = pgmPoolAlloc(pVM, GCPhys & ~(RT_BIT_64(SHW_PD_SHIFT) - 1), BTH_PGMPOOLKIND_PT_FOR_PT, SHW_POOL_ROOT_IDX, iPDDst, &pShwPage); … … 3152 3151 /* No need to check all paging levels; we zero out the shadow parts when the guest modifies its tables. */ 3153 3152 return VINF_SUCCESS; 3154 #else 3153 #else /* PGM_SHW_TYPE != PGM_TYPE_AMD64 */ 3155 3154 3156 3155 Assert(fGlobal || (cr4 & X86_CR4_PGE)); … … 3235 3234 pPml4eDst->n.u1NoExecute = pPml4eSrc->n.u1NoExecute; 3236 3235 3237 # else 3238 { 3239 # endif 3236 # else /* PGM_GST_TYPE != PGM_TYPE_AMD64 */ 3237 { 3238 # endif /* PGM_GST_TYPE != PGM_TYPE_AMD64 */ 3240 3239 # if PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 3241 for (uint64_t iPdpt e = 0; iPdpte < GST_PDPE_ENTRIES; iPdpte++)3240 for (uint64_t iPdpt = 0; iPdpt < GST_PDPE_ENTRIES; iPdpt++) 3242 3241 { 3243 3242 unsigned iPDSrc; 3244 3243 # if PGM_GST_TYPE == PGM_TYPE_PAE 3245 3244 X86PDPE PdpeSrc; 3246 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, iPdpt e<< X86_PDPT_SHIFT, &iPDSrc, &PdpeSrc);3245 PGSTPD pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, iPdpt << X86_PDPT_SHIFT, &iPDSrc, &PdpeSrc); 3247 3246 PX86PDPAE pPDPAE = pVM->pgm.s.CTXMID(ap,PaePDs)[0]; 3248 PX86PDEPAE pPDEDst = &pPDPAE->a[iPdpt e* X86_PG_PAE_ENTRIES];3247 PX86PDEPAE pPDEDst = &pPDPAE->a[iPdpt * X86_PG_PAE_ENTRIES]; 3249 3248 PX86PDPT pPdptDst = pgmShwGetPaePDPTPtr(&pVM->pgm.s); 3250 3249 … … 3252 3251 { 3253 3252 /* PDPE not present */ 3254 if (pPdptDst->a[iPdpt e].n.u1Present)3253 if (pPdptDst->a[iPdpt].n.u1Present) 3255 3254 { 3256 LogFlow(("SyncCR3: guest PDPE % d not present; clear shw pdpe\n", iPdpte));3257 3258 3259 3260 3261 3262 3263 pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, pPDEDst[iPD].u & SHW_PDE_PG_MASK), SHW_POOL_ROOT_IDX, iPdpt e* X86_PG_PAE_ENTRIES + iPD);3255 LogFlow(("SyncCR3: guest PDPE %lld not present; clear shw pdpe\n", iPdpt)); 3256 /* for each page directory entry */ 3257 for (unsigned iPD = 0; iPD < RT_ELEMENTS(pPDSrc->a); iPD++) 3258 { 3259 if ( pPDEDst[iPD].n.u1Present 3260 && !(pPDEDst[iPD].u & PGM_PDFLAGS_MAPPING)) 3261 { 3262 pgmPoolFreeByPage(pPool, pgmPoolGetPage(pPool, pPDEDst[iPD].u & SHW_PDE_PG_MASK), SHW_POOL_ROOT_IDX, iPdpt * X86_PG_PAE_ENTRIES + iPD); 3264 3263 pPDEDst[iPD].u = 0; 3265 3266 3264 } 3265 } 3267 3266 } 3268 if (!(pPdptDst->a[iPdpt e].u & PGM_PLXFLAGS_MAPPING))3269 pPdptDst->a[iPdpt e].n.u1Present = 0;3267 if (!(pPdptDst->a[iPdpt].u & PGM_PLXFLAGS_MAPPING)) 3268 pPdptDst->a[iPdpt].n.u1Present = 0; 3270 3269 continue; 3271 3270 } … … 3279 3278 PX86PDPAE pPDDst; 3280 3279 PX86PDEPAE pPDEDst; 3281 RTGCPTR GCPtr = (iPml4 << X86_PML4_SHIFT) || (iPdpt e<< X86_PDPT_SHIFT);3280 RTGCPTR GCPtr = (iPml4 << X86_PML4_SHIFT) || (iPdpt << X86_PDPT_SHIFT); 3282 3281 PGSTPD pPDSrc = pgmGstGetLongModePDPtr(&pVM->pgm.s, GCPtr, &pPml4eSrc, &PdpeSrc, &iPDSrc); 3283 3282 … … 3295 3294 Assert(iPDSrc == 0); 3296 3295 3297 pPdpeDst = &pPdptDst->a[iPdpt e];3296 pPdpeDst = &pPdptDst->a[iPdpt]; 3298 3297 3299 3298 /* Fetch the pgm pool shadow descriptor if the shadow pdpte is present. */ … … 3310 3309 /* Free it. */ 3311 3310 LogFlow(("SyncCR3: Out-of-sync PDPE (GCPhys) GCPtr=%RX64 %RGp vs %RGp PdpeSrc=%RX64 PdpeDst=%RX64\n", 3312 ((uint64_t)iPml4 << X86_PML4_SHIFT) + ((uint64_t)iPdpt e<< X86_PDPT_SHIFT), pShwPde->GCPhys, GCPhysPdeSrc, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u));3311 ((uint64_t)iPml4 << X86_PML4_SHIFT) + ((uint64_t)iPdpt << X86_PDPT_SHIFT), pShwPde->GCPhys, GCPhysPdeSrc, (uint64_t)PdpeSrc.u, (uint64_t)pPdpeDst->u)); 3313 3312 3314 3313 /* Mark it as not present if there's no hypervisor mapping present. (bit flipped at the top of Trap0eHandler) */ 3315 3314 Assert(!(pPdpeDst->u & PGM_PLXFLAGS_MAPPING)); 3316 pgmPoolFreeByPage(pPool, pShwPde, pShwPde->idx, iPdpt e);3315 pgmPoolFreeByPage(pPool, pShwPde, pShwPde->idx, iPdpt); 3317 3316 pPdpeDst->u = 0; 3318 3317 continue; /* next guest PDPTE */ … … 3343 3342 3344 3343 /* 3345 * Check for conflicts with GC mappings.3346 */3344 * Check for conflicts with GC mappings. 3345 */ 3347 3346 # if PGM_GST_TYPE == PGM_TYPE_PAE 3348 if (iPD + iPdpt e* X86_PG_PAE_ENTRIES == iPdNoMapping)3347 if (iPD + iPdpt * X86_PG_PAE_ENTRIES == iPdNoMapping) 3349 3348 # else 3350 3349 if (iPD == iPdNoMapping) … … 3365 3364 int rc = pgmR3SyncPTResolveConflict(pVM, pMapping, pPDSrc, iPD << GST_PD_SHIFT); 3366 3365 # elif PGM_GST_TYPE == PGM_TYPE_PAE 3367 int rc = pgmR3SyncPTResolveConflictPAE(pVM, pMapping, (iPdpt e<< GST_PDPT_SHIFT) + (iPD << GST_PD_SHIFT));3366 int rc = pgmR3SyncPTResolveConflictPAE(pVM, pMapping, (iPdpt << GST_PDPT_SHIFT) + (iPD << GST_PD_SHIFT)); 3368 3367 # endif 3369 3368 if (RT_FAILURE(rc)) … … 3371 3370 3372 3371 /* 3373 * Update iPdNoMapping and pMapping.3374 */3372 * Update iPdNoMapping and pMapping. 3373 */ 3375 3374 pMapping = pVM->pgm.s.pMappingsR3; 3376 3375 while (pMapping && pMapping->GCPtr < (iPD << GST_PD_SHIFT)) … … 3396 3395 for (unsigned i = 0, iPdShw = iPD * 2; i < 2; i++, iPdShw++) /* pray that the compiler unrolls this */ 3397 3396 # elif PGM_GST_TYPE == PGM_TYPE_PAE 3398 const unsigned iPdShw = iPD + iPdpt e* X86_PG_PAE_ENTRIES; NOREF(iPdShw);3397 const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; NOREF(iPdShw); 3399 3398 # else 3400 3399 const unsigned iPdShw = iPD; NOREF(iPdShw); … … 3486 3485 } 3487 3486 # if PGM_GST_TYPE == PGM_TYPE_PAE 3488 else if (iPD + iPdpt e* X86_PG_PAE_ENTRIES != iPdNoMapping)3487 else if (iPD + iPdpt * X86_PG_PAE_ENTRIES != iPdNoMapping) 3489 3488 # else 3490 3489 else if (iPD != iPdNoMapping) … … 3497 3496 for (unsigned i = 0, iPdShw = iPD * 2; i < 2; i++, iPdShw++) /* pray that the compiler unrolls this */ 3498 3497 # elif PGM_GST_TYPE == PGM_TYPE_PAE 3499 const unsigned iPdShw = iPD + iPdpt e* X86_PG_PAE_ENTRIES; NOREF(iPdShw);3498 const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; NOREF(iPdShw); 3500 3499 # else 3501 3500 const unsigned iPdShw = iPD; NOREF(iPdShw); … … 3547 3546 int rc = pgmR3SyncPTResolveConflict(pVM, pMapping, pPDSrc, iPD << GST_PD_SHIFT); 3548 3547 # elif PGM_GST_TYPE == PGM_TYPE_PAE 3549 int rc = pgmR3SyncPTResolveConflictPAE(pVM, pMapping, (iPdpt e<< GST_PDPT_SHIFT) + (iPD << GST_PD_SHIFT));3548 int rc = pgmR3SyncPTResolveConflictPAE(pVM, pMapping, (iPdpt << GST_PDPT_SHIFT) + (iPD << GST_PD_SHIFT)); 3550 3549 # endif 3551 3550 if (RT_FAILURE(rc)) … … 3773 3772 * Check the PDPTEs too. 3774 3773 */ 3775 unsigned iPdpt e= (GCPtr >> SHW_PDPT_SHIFT) & SHW_PDPT_MASK;3776 3777 for (;iPdpt e <= SHW_PDPT_MASK; iPdpte++)3774 unsigned iPdpt = (GCPtr >> SHW_PDPT_SHIFT) & SHW_PDPT_MASK; 3775 3776 for (;iPdpt <= SHW_PDPT_MASK; iPdpt++) 3778 3777 { 3779 3778 unsigned iPDSrc; … … 3804 3803 Assert(iPDSrc == 0); 3805 3804 3806 pPdpeDst = &pPdptDst->a[iPdpt e];3805 pPdpeDst = &pPdptDst->a[iPdpt]; 3807 3806 3808 3807 if (!pPdpeDst->n.u1Present) … … 3826 3825 { 3827 3826 # if PGM_GST_TYPE == PGM_TYPE_AMD64 3828 AssertMsgFailed(("Physical address doesn't match! iPml4 %d iPdpt e %d pPdpeDst.u=%#RX64 pPdpeSrc.u=%RX64 Phys %RX64 vs %RX64\n", iPml4, iPdpte, pPdpeDst->u, PdpeSrc.u, pShwPde->GCPhys, GCPhysPdeSrc));3827 AssertMsgFailed(("Physical address doesn't match! iPml4 %d iPdpt %d pPdpeDst.u=%#RX64 pPdpeSrc.u=%RX64 Phys %RX64 vs %RX64\n", iPml4, iPdpt, pPdpeDst->u, PdpeSrc.u, pShwPde->GCPhys, GCPhysPdeSrc)); 3829 3828 # else 3830 AssertMsgFailed(("Physical address doesn't match! iPdpt e %d pPdpeDst.u=%#RX64 pPdpeSrc.u=%RX64 Phys %RX64 vs %RX64\n", iPdpte, pPdpeDst->u, PdpeSrc.u, pShwPde->GCPhys, GCPhysPdeSrc));3829 AssertMsgFailed(("Physical address doesn't match! iPdpt %d pPdpeDst.u=%#RX64 pPdpeSrc.u=%RX64 Phys %RX64 vs %RX64\n", iPdpt, pPdpeDst->u, PdpeSrc.u, pShwPde->GCPhys, GCPhysPdeSrc)); 3831 3830 # endif 3832 3831 GCPtr += 512 * _2M;
Note:
See TracChangeset
for help on using the changeset viewer.