- Timestamp:
- Jan 30, 2009 1:43:50 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllMap.cpp
r16409 r16414 235 235 switch(enmShadowMode) 236 236 { 237 case PGMMODE_32_BIT: 238 { 239 PX86PD pShw32BitPd = pgmShwGet32BitPDPtr(&pVM->pgm.s); 240 AssertFatal(pShw32BitPd); 241 242 if (pShw32BitPd->a[iNewPDE].n.u1Present) 243 { 244 Assert(!(pShw32BitPd->a[iNewPDE].u & PGM_PDFLAGS_MAPPING)); 245 pgmPoolFree(pVM, pShw32BitPd->a[iNewPDE].u & X86_PDE_PG_MASK, pVM->pgm.s.CTX_SUFF(pShwPageCR3)->idx, iNewPDE); 246 } 247 248 X86PDE Pde; 249 /* Default mapping page directory flags are read/write and supervisor; individual page attributes determine the final flags */ 250 Pde.u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | (uint32_t)pMap->aPTs[i].HCPhysPT; 251 pShw32BitPd->a[iNewPDE] = Pde; 252 break; 253 } 254 255 case PGMMODE_PAE: 256 case PGMMODE_PAE_NX: 257 { 258 PX86PDPT pShwPdpt; 259 PX86PDPAE pShwPaePd; 260 const unsigned iPdPt = iNewPDE / 256; 261 unsigned iPDE = iNewPDE * 2 % 512; 262 263 pShwPdpt = pgmShwGetPaePDPTPtr(&pVM->pgm.s); 264 Assert(pShwPdpt); 265 pShwPaePd = pgmShwGetPaePDPtr(&pVM->pgm.s, (iPdPt << X86_PDPT_SHIFT)); 266 AssertFatal(pShwPaePd); 267 268 PPGMPOOLPAGE pPoolPagePde = pgmPoolGetPageByHCPhys(pVM, pShwPdpt->a[iPdPt].u & X86_PDPE_PG_MASK); 269 AssertFatal(pPoolPagePde); 270 271 if (pShwPaePd->a[iPDE].n.u1Present) 272 { 273 Assert(!(pShwPaePd->a[iPDE].u & PGM_PDFLAGS_MAPPING)); 274 pgmPoolFree(pVM, pShwPaePd->a[iPDE].u & X86_PDE_PG_MASK, pPoolPagePde->idx, iNewPDE); 275 } 276 277 X86PDEPAE PdePae0; 278 PdePae0.u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT0; 279 pShwPaePd->a[iPDE] = PdePae0; 280 281 /* 2nd 2 MB PDE of the 4 MB region */ 282 iPDE++; 283 AssertFatal(iPDE < 512); 284 285 if (pShwPaePd->a[iPDE].n.u1Present) 286 { 287 Assert(!(pShwPaePd->a[iPDE].u & PGM_PDFLAGS_MAPPING)); 288 pgmPoolFree(pVM, pShwPaePd->a[iPDE].u & X86_PDE_PG_MASK, pPoolPagePde->idx, iNewPDE); 289 } 290 291 X86PDEPAE PdePae1; 292 PdePae1.u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT1; 293 pShwPaePd->a[iPDE] = PdePae1; 294 295 /* Set the PGM_PDFLAGS_MAPPING flag in the page directory pointer entry. (legacy PAE guest mode) */ 296 pShwPdpt->a[iPdPt].u |= PGM_PLXFLAGS_MAPPING; 297 } 237 case PGMMODE_32_BIT: 238 { 239 PX86PD pShw32BitPd = pgmShwGet32BitPDPtr(&pVM->pgm.s); 240 AssertFatal(pShw32BitPd); 241 242 if (pShw32BitPd->a[iNewPDE].n.u1Present) 243 { 244 Assert(!(pShw32BitPd->a[iNewPDE].u & PGM_PDFLAGS_MAPPING)); 245 pgmPoolFree(pVM, pShw32BitPd->a[iNewPDE].u & X86_PDE_PG_MASK, pVM->pgm.s.CTX_SUFF(pShwPageCR3)->idx, iNewPDE); 246 } 247 248 X86PDE Pde; 249 /* Default mapping page directory flags are read/write and supervisor; individual page attributes determine the final flags */ 250 Pde.u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | (uint32_t)pMap->aPTs[i].HCPhysPT; 251 pShw32BitPd->a[iNewPDE] = Pde; 252 break; 253 } 254 255 case PGMMODE_PAE: 256 case PGMMODE_PAE_NX: 257 { 258 PX86PDPT pShwPdpt; 259 PX86PDPAE pShwPaePd; 260 const unsigned iPdPt = iNewPDE / 256; 261 unsigned iPDE = iNewPDE * 2 % 512; 262 263 pShwPdpt = pgmShwGetPaePDPTPtr(&pVM->pgm.s); 264 Assert(pShwPdpt); 265 pShwPaePd = pgmShwGetPaePDPtr(&pVM->pgm.s, (iPdPt << X86_PDPT_SHIFT)); 266 AssertFatal(pShwPaePd); 267 268 PPGMPOOLPAGE pPoolPagePde = pgmPoolGetPageByHCPhys(pVM, pShwPdpt->a[iPdPt].u & X86_PDPE_PG_MASK); 269 AssertFatal(pPoolPagePde); 270 271 if (pShwPaePd->a[iPDE].n.u1Present) 272 { 273 Assert(!(pShwPaePd->a[iPDE].u & PGM_PDFLAGS_MAPPING)); 274 pgmPoolFree(pVM, pShwPaePd->a[iPDE].u & X86_PDE_PG_MASK, pPoolPagePde->idx, iNewPDE); 275 } 276 277 X86PDEPAE PdePae0; 278 PdePae0.u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT0; 279 pShwPaePd->a[iPDE] = PdePae0; 280 281 /* 2nd 2 MB PDE of the 4 MB region */ 282 iPDE++; 283 AssertFatal(iPDE < 512); 284 285 if (pShwPaePd->a[iPDE].n.u1Present) 286 { 287 Assert(!(pShwPaePd->a[iPDE].u & PGM_PDFLAGS_MAPPING)); 288 pgmPoolFree(pVM, pShwPaePd->a[iPDE].u & X86_PDE_PG_MASK, pPoolPagePde->idx, iNewPDE); 289 } 290 291 X86PDEPAE PdePae1; 292 PdePae1.u = PGM_PDFLAGS_MAPPING | X86_PDE_P | X86_PDE_A | X86_PDE_RW | X86_PDE_US | pMap->aPTs[i].HCPhysPaePT1; 293 pShwPaePd->a[iPDE] = PdePae1; 294 295 /* Set the PGM_PDFLAGS_MAPPING flag in the page directory pointer entry. (legacy PAE guest mode) */ 296 pShwPdpt->a[iPdPt].u |= PGM_PLXFLAGS_MAPPING; 297 } 298 299 default: 300 ; 298 301 } 299 302 } … … 322 325 switch(enmShadowMode) 323 326 { 324 case PGMMODE_32_BIT: 325 { 326 PX86PD pShw32BitPd = pgmShwGet32BitPDPtr(&pVM->pgm.s); 327 AssertFatal(pShw32BitPd); 328 329 pShw32BitPd->a[iOldPDE].u = 0; 330 break; 331 } 332 333 case PGMMODE_PAE: 334 case PGMMODE_PAE_NX: 335 { 336 PX86PDPT pPdpt = NULL; 337 PX86PDPAE pShwPaePd = NULL; 338 339 const unsigned iPD = iOldPDE / 256; /* iOldPDE * 2 / 512; iOldPDE is in 4 MB pages */ 340 unsigned iPDE = iOldPDE * 2 % 512; 341 pPdpt = pgmShwGetPaePDPTPtr(&pVM->pgm.s); 342 pShwPaePd = pgmShwGetPaePDPtr(&pVM->pgm.s, (iPD << X86_PDPT_SHIFT)); 343 AssertFatal(pShwPaePd); 344 345 pShwPaePd->a[iPDE].u = 0; 346 347 iPDE++; 348 AssertFatal(iPDE < 512); 349 350 pShwPaePd->a[iPDE].u = 0; 351 /* Clear the PGM_PDFLAGS_MAPPING flag for the page directory pointer entry. (legacy PAE guest mode) */ 352 pPdpt->a[iPD].u &= ~PGM_PLXFLAGS_MAPPING; 353 break; 354 } 327 case PGMMODE_32_BIT: 328 { 329 PX86PD pShw32BitPd = pgmShwGet32BitPDPtr(&pVM->pgm.s); 330 AssertFatal(pShw32BitPd); 331 332 pShw32BitPd->a[iOldPDE].u = 0; 333 break; 334 } 335 336 case PGMMODE_PAE: 337 case PGMMODE_PAE_NX: 338 { 339 PX86PDPT pPdpt = NULL; 340 PX86PDPAE pShwPaePd = NULL; 341 342 const unsigned iPD = iOldPDE / 256; /* iOldPDE * 2 / 512; iOldPDE is in 4 MB pages */ 343 unsigned iPDE = iOldPDE * 2 % 512; 344 pPdpt = pgmShwGetPaePDPTPtr(&pVM->pgm.s); 345 pShwPaePd = pgmShwGetPaePDPtr(&pVM->pgm.s, (iPD << X86_PDPT_SHIFT)); 346 AssertFatal(pShwPaePd); 347 348 pShwPaePd->a[iPDE].u = 0; 349 350 iPDE++; 351 AssertFatal(iPDE < 512); 352 353 pShwPaePd->a[iPDE].u = 0; 354 /* Clear the PGM_PDFLAGS_MAPPING flag for the page directory pointer entry. (legacy PAE guest mode) */ 355 pPdpt->a[iPD].u &= ~PGM_PLXFLAGS_MAPPING; 356 break; 357 } 358 359 default: 360 ; 355 361 } 356 362 }
Note:
See TracChangeset
for help on using the changeset viewer.