Changeset 8454 in vbox
- Timestamp:
- Apr 29, 2008 11:31:44 AM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 30316
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r8155 r8454 1537 1537 GCPtr += PAGE_SIZE; /* reserved page */ 1538 1538 1539 rc = PGMMap(pVM, GCPtr, pVM->pgm.s.HCPhysPaePML4, PAGE_SIZE, 0);1540 AssertRCReturn(rc, rc);1541 pVM->pgm.s.pGCPaePML4 = GCPtr;1542 GCPtr += PAGE_SIZE;1543 GCPtr += PAGE_SIZE; /* reserved page */1544 1545 1539 1546 1540 /* … … 1600 1594 pVM->pgm.s.pGstPaePDPTGC += offDelta; 1601 1595 pVM->pgm.s.pGCPaePDPT += offDelta; 1602 pVM->pgm.s.pGCPaePML4 += offDelta;1603 1596 1604 1597 pgmR3ModeDataInit(pVM, true /* resolve GC/R0 symbols */); -
trunk/src/VBox/VMM/PGMInternal.h
r8155 r8454 1978 1978 * @{ */ 1979 1979 /** The Page Map Level 4 table - HC Ptr. */ 1980 GCPTRTYPE(PX86PML4) pGCPaePML4;1981 /** The Page Map Level 4 table - GC Ptr. */1982 1980 R3R0PTRTYPE(PX86PML4) pHCPaePML4; 1983 1981 /** The Physical Address (HC) of the Page Map Level 4 table. */ … … 3319 3317 } 3320 3318 3319 #ifndef IN_GC 3320 /** 3321 * Gets the page directory entry for the specified address. 3322 * 3323 * @returns The page directory entry in question. 3324 * @returns A non-present entry if the page directory is not present or on an invalid page. 3325 * @param pPGM Pointer to the PGM instance data. 3326 * @param GCPtr The address. 3327 * @param ppPml4e Page Map Level-4 Entry (out) 3328 * @param pPdpe Page directory pointer table entry (out) 3329 */ 3330 DECLINLINE(uint64_t) pgmGstGetLongModePDE(PPGM pPGM, RTGCUINTPTR64 GCPtr, PX86PML4E *ppPml4e, PX86PDPE pPdpe) 3331 { 3332 const unsigned iPml4e = (GCPtr >> X86_PML4_SHIFT) & X86_PML4_MASK; 3333 3334 *ppPml4e = &pPGM->pHCPaePML4->a[iPml4e]; 3335 if ((*ppPml4e)->n.u1Present) 3336 { 3337 PX86PDPT pPdptTemp; 3338 int rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), (*ppPml4e)->u & X86_PML4E_PG_MASK, &pPdptTemp); 3339 if (VBOX_FAILURE(rc)) 3340 { 3341 AssertFailed(); 3342 return 0ULL; 3343 } 3344 3345 const unsigned iPdPt = (GCPtr >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 3346 *pPdpe = pPdptTemp->a[iPdPt]; 3347 if (pPdpe->n.u1Present) 3348 { 3349 PX86PDPAE pPD; 3350 3351 rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), pPdpe->u & X86_PDPE_PG_MASK, &pPD); 3352 if (VBOX_FAILURE(rc)) 3353 { 3354 AssertFailed(); 3355 return 0ULL; 3356 } 3357 const unsigned iPD = (GCPtr >> X86_PD_PAE_SHIFT) & X86_PD_PAE_MASK; 3358 return pPD->a[iPD].u; 3359 } 3360 } 3361 return 0ULL; 3362 } 3363 3364 /** 3365 * Gets the page directory entry for the specified address. 3366 * 3367 * @returns The page directory entry in question. 3368 * @returns A non-present entry if the page directory is not present or on an invalid page. 3369 * @param pPGM Pointer to the PGM instance data. 3370 * @param GCPtr The address. 3371 */ 3372 DECLINLINE(uint64_t) pgmGstGetLongModePDE(PPGM pPGM, RTGCUINTPTR64 GCPtr) 3373 { 3374 const unsigned iPml4e = (GCPtr >> X86_PML4_SHIFT) & X86_PML4_MASK; 3375 3376 if (pPGM->pHCPaePML4->a[iPml4e].n.u1Present) 3377 { 3378 PX86PDPT pPdptTemp; 3379 int rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), pPGM->pHCPaePML4->a[iPml4e].u & X86_PML4E_PG_MASK, &pPdptTemp); 3380 if (VBOX_FAILURE(rc)) 3381 { 3382 AssertFailed(); 3383 return 0ULL; 3384 } 3385 3386 const unsigned iPdPt = (GCPtr >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64; 3387 if (pPdptTemp->a[iPdPt].n.u1Present) 3388 { 3389 PX86PDPAE pPD; 3390 3391 rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), pPdptTemp->a[iPdPt].u & X86_PDPE_PG_MASK, &pPD); 3392 if (VBOX_FAILURE(rc)) 3393 { 3394 AssertFailed(); 3395 return 0ULL; 3396 } 3397 const unsigned iPD = (GCPtr >> X86_PD_PAE_SHIFT) & X86_PD_PAE_MASK; 3398 return pPD->a[iPD].u; 3399 } 3400 } 3401 return 0ULL; 3402 } 3403 #endif /* !IN_GC */ 3321 3404 3322 3405 /** -
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r8160 r8454 154 154 return VINF_SUCCESS; 155 155 156 #elif PGM_GST_TYPE == PGM_TYPE_AMD64 157 /* later */ 158 /* check level 3 & 4 bits as well (r/w, u/s, nxe) */ 159 AssertFailed(); 160 return VERR_NOT_IMPLEMENTED; 161 162 #elif PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_PAE 156 #elif PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64 163 157 164 158 /* … … 167 161 # if PGM_GST_TYPE == PGM_TYPE_32BIT 168 162 const X86PDE Pde = CTXSUFF(pVM->pgm.s.pGuestPD)->a[GCPtr >> X86_PD_SHIFT]; 169 # else /* PAE */163 #elif PGM_GST_TYPE == PGM_TYPE_PAE 170 164 X86PDEPAE Pde; 171 165 bool fNoExecuteBitValid = !!(CPUMGetGuestEFER(pVM) & MSR_K6_EFER_NXE); … … 175 169 */ 176 170 Pde.u = pgmGstGetPaePDE(&pVM->pgm.s, GCPtr); 171 #elif PGM_GST_TYPE == PGM_TYPE_AMD64 172 PX86PML4E pPml4e; 173 X86PDPE Pdpe; 174 X86PDEPAE Pde; 175 bool fNoExecuteBitValid = !!(CPUMGetGuestEFER(pVM) & MSR_K6_EFER_NXE); 176 177 Pde.u = pgmGstGetLongModePDE(&pVM->pgm.s, GCPtr, &pPml4e, &Pdpe); 178 Assert(pPml4e); 179 if (!(pPml4e->n.u1Present & Pdpe.n.u1Present)) 180 return VERR_PAGE_TABLE_NOT_PRESENT; 181 182 /* Merge accessed, write, user and no-execute bits into the PDE. */ 183 Pde.n.u1Accessed &= pPml4e->n.u1Accessed & Pdpe.n.u1Accessed; 184 Pde.n.u1Write &= pPml4e->n.u1Write & Pdpe.n.u1Write; 185 Pde.n.u1User &= pPml4e->n.u1User & Pdpe.n.u1User; 186 Pde.n.u1NoExecute &= pPml4e->n.u1NoExecute& Pdpe.n.u1NoExecute; 177 187 # endif 178 188 … … 358 368 || PGM_GST_TYPE == PGM_TYPE_AMD64 359 369 360 #if PGM_GST_TYPE == PGM_TYPE_AMD64361 /* later */362 AssertFailed();363 return VERR_NOT_IMPLEMENTED;364 #endif365 366 370 # if PGM_GST_TYPE == PGM_TYPE_32BIT 367 371 X86PDE Pde; 368 372 Pde = CTXSUFF(pVM->pgm.s.pGuestPD)->a[GCPtr >> GST_PD_SHIFT]; 369 # el se373 # elif PGM_GST_TYPE == PGM_TYPE_PAE 370 374 X86PDEPAE Pde; 371 375 Pde.u = pgmGstGetPaePDE(&pVM->pgm.s, GCPtr); 376 # elif PGM_GST_TYPE == PGM_TYPE_AMD64 377 X86PDEPAE Pde; 378 Pde.u = pgmGstGetLongModePDE(&pVM->pgm.s, GCPtr); 372 379 # endif 373 380 … … 720 727 #if PGM_GST_TYPE == PGM_TYPE_32BIT 721 728 X86PDE Pde = pPDSrc->a[GCPtr >> X86_PD_SHIFT]; 722 #el se729 #elif PGM_GST_TYPE == PGM_TYPE_PAE 723 730 X86PDEPAE Pde; 724 731 Pde.u = pgmGstGetPaePDE(&pState->pVM->pgm.s, GCPtr); 732 #elif PGM_GST_TYPE == PGM_TYPE_AMD64 733 X86PDEPAE Pde; 734 Pde.u = pgmGstGetLongModePDE(&pVM->pgm.s, GCPtr); 725 735 #endif 726 736 if (Pde.n.u1Present) -
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r8234 r8454 122 122 case PGMPOOL_IDX_PDPT: 123 123 return pVM->pgm.s.pGCPaePDPT; 124 case PGMPOOL_IDX_PML4:125 return pVM->pgm.s.pGCPaePML4;126 124 default: 127 125 AssertReleaseMsgFailed(("Invalid index %d\n", pPage->idx)); -
trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp
r8155 r8454 394 394 GEN_CHECK_OFF(PGM, HCPhysPaePDPT); 395 395 GEN_CHECK_OFF(PGM, pHCPaePML4); 396 GEN_CHECK_OFF(PGM, pGCPaePML4);397 396 GEN_CHECK_OFF(PGM, HCPhysPaePML4); 398 397 GEN_CHECK_OFF(PGM, pfnR3ShwRelocate);
Note:
See TracChangeset
for help on using the changeset viewer.