Changeset 15227 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Dec 10, 2008 4:41:37 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 40641
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r14868 r15227 3054 3054 DECLINLINE(PGMPOOLKIND) PGM_BTH_NAME(CalcPageKind)(const GSTPDE *pPdeSrc, uint32_t cr4) 3055 3055 { 3056 # if P MG_GST_TYPE == PGM_TYPE_AMD643056 # if PGM_GST_TYPE == PGM_TYPE_AMD64 3057 3057 if (!pPdeSrc->n.u1Size) 3058 3058 # else … … 3122 3122 #ifdef PGMPOOL_WITH_MONITORING 3123 3123 int rc = pgmPoolSyncCR3(pVM); 3124 if ( rc != VINF_SUCCESS)3124 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 3125 3125 return rc; 3126 3126 #endif … … 3159 3159 # else /* PGM_SHW_TYPE == PGM_TYPE_PAE */ 3160 3160 # if PGM_GST_TYPE == PGM_TYPE_32BIT 3161 PX86PDEPAE paPDEDst[4]; 3162 paPDEDst[0] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0x00000000)); 3163 paPDEDst[1] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0x40000000)); 3164 paPDEDst[2] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0x80000000)); 3165 paPDEDst[3] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0xc0000000)); 3161 3166 PX86PDEPAE pPDEDst = NULL; 3162 3167 # endif … … 3174 3179 * Iterate the the CR3 page. 3175 3180 */ 3181 const bool fRawR0Enabled = EMIsRawRing0Enabled(pVM); 3182 PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool); 3183 3184 /* Only check mappings if they are supposed to be put into the shadow page table. */ 3185 # ifndef PGM_WITHOUT_MAPPINGS 3176 3186 PPGMMAPPING pMapping; 3177 3187 unsigned iPdNoMapping; 3178 const bool fRawR0Enabled = EMIsRawRing0Enabled(pVM);3179 PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);3180 3181 /* Only check mappings if they are supposed to be put into the shadow page table. */3182 3188 if (pgmMapAreMappingsEnabled(&pVM->pgm.s)) 3183 3189 { … … 3190 3196 iPdNoMapping = ~0U; 3191 3197 } 3198 # else /* PGM_WITHOUT_MAPPINGS */ 3199 Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s)); 3200 # endif /* PGM_WITHOUT_MAPPINGS */ 3192 3201 3193 3202 # if PGM_GST_TYPE == PGM_TYPE_PAE 3194 3203 for (uint64_t iPdpt = 0; iPdpt < GST_PDPE_ENTRIES; iPdpt++) 3195 { 3204 # endif /* PGM_GST_TYPE == PGM_TYPE_PAE */ 3205 { 3206 # if PGM_GST_TYPE == PGM_TYPE_PAE 3196 3207 unsigned iPDSrc; 3197 3208 X86PDPE PdpeSrc; … … 3221 3232 continue; 3222 3233 } 3223 # else /* PGM_GST_TYPE != PGM_TYPE_PAE */ 3224 { 3225 # endif /* PGM_GST_TYPE != PGM_TYPE_PAE */ 3234 # endif /* PGM_GST_TYPE == PGM_TYPE_PAE */ 3235 3226 3236 for (unsigned iPD = 0; iPD < RT_ELEMENTS(pPDSrc->a); iPD++) 3227 3237 { 3228 3238 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 3229 if ( (iPD & 255) == 0) /* Start of new PD. */3230 pPDEDst = p gmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)iPD << GST_PD_SHIFT);3239 if (RT_UNLIKELY((iPD & 255) == 0)) /* Start of new PD. */ 3240 pPDEDst = paPDEDst[iPD >> 8]; 3231 3241 # endif 3232 3242 # if PGM_SHW_TYPE == PGM_TYPE_32BIT 3233 3243 Assert(pgmShwGet32BitPDEPtr(&pVM->pgm.s, (uint32_t)iPD << SHW_PD_SHIFT) == pPDEDst); 3234 3244 # elif PGM_SHW_TYPE == PGM_TYPE_PAE 3235 # if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortu antely not reliable with PGMR0DynMap and multiple VMs. */3245 # if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortunately not reliable with PGMR0DynMap and multiple VMs. */ 3236 3246 RTGCPTR GCPtrStrict = (uint32_t)iPD << GST_PD_SHIFT; 3237 3247 # if PGM_GST_TYPE == PGM_TYPE_PAE … … 3245 3255 && (PdeSrc.n.u1User || fRawR0Enabled)) 3246 3256 { 3247 # if ( PGM_GST_TYPE == PGM_TYPE_32BIT \ 3248 || PGM_GST_TYPE == PGM_TYPE_PAE) \ 3249 && !defined(PGM_WITHOUT_MAPPINGS) 3250 3257 # ifndef PGM_WITHOUT_MAPPINGS 3251 3258 /* 3252 3259 * Check for conflicts with GC mappings. … … 3255 3262 if (iPD + iPdpt * X86_PG_PAE_ENTRIES == iPdNoMapping) 3256 3263 # else 3257 if ( iPD == iPdNoMapping)3264 if (RT_UNLIKELY(iPD == iPdNoMapping)) 3258 3265 # endif 3259 3266 { … … 3265 3272 iPD += cPTs - 1; 3266 3273 # if PGM_SHW_TYPE != PGM_GST_TYPE /* SHW==PAE && GST==32BIT */ 3267 pPDEDst = p gmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)(iPD + 1) << GST_PD_SHIFT);3274 pPDEDst = paPDEDst[(iPD + 1) >> 8]; 3268 3275 # else 3269 3276 pPDEDst += cPTs; … … 3294 3301 # endif /* !IN_RING3 */ 3295 3302 } 3296 # else /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */ 3297 Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s)); 3298 # endif /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */ 3303 # endif /* !PGM_WITHOUT_MAPPINGS */ 3299 3304 3300 3305 /* … … 3387 3392 } /* foreach 2MB PAE PDE in 4MB guest PDE */ 3388 3393 } 3389 # if PGM_GST_TYPE == PGM_TYPE_PAE 3394 # ifdef PGM_WITHOUT_MAPPINGS 3395 else 3396 # elif PGM_GST_TYPE == PGM_TYPE_PAE 3390 3397 else if (iPD + iPdpt * X86_PG_PAE_ENTRIES != iPdNoMapping) 3391 3398 # else … … 3397 3404 */ 3398 3405 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 3399 for (unsigned i = 0, iPdShw = iPD * 2; i < 2; i++, iPdShw++) /* pray that the compiler unrolls this */ 3400 # elif PGM_GST_TYPE == PGM_TYPE_PAE 3401 const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; 3402 # else 3403 const unsigned iPdShw = iPD; 3404 # endif 3406 /* first half */ 3407 if (pPDEDst->n.u1Present) 3405 3408 { 3406 if (pPDEDst->n.u1Present) 3407 { 3408 pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPdShw); 3409 pPDEDst->u = 0; 3410 MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP)); 3411 } 3412 pPDEDst++; 3409 pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPD * 2); 3410 pPDEDst->u = 0; 3411 MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP)); 3413 3412 } 3413 pPDEDst++; 3414 /* second half */ 3415 if (pPDEDst->n.u1Present) 3416 { 3417 pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPD * 2 + 1); 3418 pPDEDst->u = 0; 3419 MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP)); 3420 } 3421 pPDEDst++; 3422 # else /* 1:1 */ 3423 if (pPDEDst->n.u1Present) 3424 { 3425 # if PGM_GST_TYPE == PGM_TYPE_PAE 3426 const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; 3427 # else 3428 const unsigned iPdShw = iPD; 3429 # endif 3430 pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPdShw); 3431 pPDEDst->u = 0; 3432 MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP)); 3433 } 3434 pPDEDst++; 3435 # endif /* 1:1 */ 3414 3436 } 3437 # ifndef PGM_WITHOUT_MAPPINGS 3415 3438 else 3416 3439 { 3417 # if ( PGM_GST_TYPE == PGM_TYPE_32BIT \3418 || PGM_GST_TYPE == PGM_TYPE_PAE) \3419 && !defined(PGM_WITHOUT_MAPPINGS)3420 3421 3440 const unsigned cPTs = pMapping->cb >> GST_PD_SHIFT; 3422 3441 … … 3458 3477 iPdNoMapping = pMapping ? pMapping->GCPtr >> GST_PD_SHIFT : ~0U; 3459 3478 break; 3460 # else 3479 # else /* !IN_RING3 */ 3461 3480 LogFlow(("SyncCR3: detected conflict -> VINF_PGM_SYNC_CR3\n")); 3462 3481 return VINF_PGM_SYNC_CR3; 3463 # endif 3482 # endif /* !IN_RING3 */ 3464 3483 } 3465 3484 } … … 3476 3495 iPD += cPTs - 1; 3477 3496 # if PGM_SHW_TYPE != PGM_GST_TYPE /* SHW==PAE && GST==32BIT */ 3478 pPDEDst = p gmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)(iPD + 1) << GST_PD_SHIFT);3497 pPDEDst = paPDEDst[(iPD + 1) >> 8]; 3479 3498 # else 3480 3499 pPDEDst += cPTs; … … 3483 3502 AssertCompile(PGM_GST_TYPE == PGM_TYPE_32BIT && PGM_SHW_TYPE == PGM_TYPE_PAE); 3484 3503 # endif 3485 # else /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */3486 Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));3487 # endif /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */3488 3504 } 3505 # endif /* !PGM_WITHOUT_MAPPINGS */ 3489 3506 3490 3507 } /* for iPD */
Note:
See TracChangeset
for help on using the changeset viewer.