Changeset 31849 in vbox for trunk/src/VBox
- Timestamp:
- Aug 22, 2010 4:15:03 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 65051
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r31807 r31849 2098 2098 * address width is relevant. See table 5-9 in the intel 2099 2099 * manual vs the PDE4M descriptions. Write testcase (NP). */ 2100 pVCpu->pgm.s.fGst32BitMbzBigPdeMask = ((uint32_t)(fMbzPageFrameMask >> (32 - 13)) & X86_PDE4M_PG_HIGH_MASK) 2101 | X86_PDE4M_MBZ_MASK; 2102 2103 pVCpu->pgm.s.fGstPaeMbzPteMask = fMbzPageFrameMask | X86_PTE_PAE_MBZ_MASK_NO_NX; 2104 pVCpu->pgm.s.fGstPaeMbzPdeMask = fMbzPageFrameMask | X86_PDE_PAE_MBZ_MASK_NO_NX; 2105 pVCpu->pgm.s.fGstPaeMbzBigPdeMask = fMbzPageFrameMask | X86_PDE2M_PAE_MBZ_MASK_NO_NX; 2106 pVCpu->pgm.s.fGstPaeMbzPdpeMask = fMbzPageFrameMask | X86_PDPE_PAE_MBZ_MASK; 2107 2108 pVCpu->pgm.s.fGstAmd64MbzPteMask = fMbzPageFrameMask | X86_PTE_LM_MBZ_MASK_NO_NX; 2109 pVCpu->pgm.s.fGstAmd64MbzPdeMask = fMbzPageFrameMask | X86_PDE_LM_MBZ_MASK_NX; 2110 pVCpu->pgm.s.fGstAmd64MbzBigPdeMask = fMbzPageFrameMask | X86_PDE2M_LM_MBZ_MASK_NX; 2111 pVCpu->pgm.s.fGstAmd64MbzPdpeMask = fMbzPageFrameMask | X86_PDPE_LM_MBZ_MASK_NO_NX; 2112 pVCpu->pgm.s.fGstAmd64MbzBigPdpeMask = fMbzPageFrameMask | X86_PDPE1G_LM_MBZ_MASK_NO_NX; 2113 pVCpu->pgm.s.fGstAmd64MbzPml4eMask = fMbzPageFrameMask | X86_PML4E_MBZ_MASK_NO_NX; 2100 pVCpu->pgm.s.fGst32BitMbzBigPdeMask = ((uint32_t)(fMbzPageFrameMask >> (32 - 13)) & X86_PDE4M_PG_HIGH_MASK) 2101 | X86_PDE4M_MBZ_MASK; 2102 2103 pVCpu->pgm.s.fGstPaeMbzPteMask = fMbzPageFrameMask | X86_PTE_PAE_MBZ_MASK_NO_NX; 2104 pVCpu->pgm.s.fGstPaeMbzPdeMask = fMbzPageFrameMask | X86_PDE_PAE_MBZ_MASK_NO_NX; 2105 pVCpu->pgm.s.fGstPaeMbzBigPdeMask = fMbzPageFrameMask | X86_PDE2M_PAE_MBZ_MASK_NO_NX; 2106 pVCpu->pgm.s.fGstPaeMbzPdpeMask = fMbzPageFrameMask | X86_PDPE_PAE_MBZ_MASK; 2107 2108 pVCpu->pgm.s.fGstAmd64MbzPteMask = fMbzPageFrameMask | X86_PTE_LM_MBZ_MASK_NO_NX; 2109 pVCpu->pgm.s.fGstAmd64MbzPdeMask = fMbzPageFrameMask | X86_PDE_LM_MBZ_MASK_NX; 2110 pVCpu->pgm.s.fGstAmd64MbzBigPdeMask = fMbzPageFrameMask | X86_PDE2M_LM_MBZ_MASK_NX; 2111 pVCpu->pgm.s.fGstAmd64MbzPdpeMask = fMbzPageFrameMask | X86_PDPE_LM_MBZ_MASK_NO_NX; 2112 pVCpu->pgm.s.fGstAmd64MbzBigPdpeMask = fMbzPageFrameMask | X86_PDPE1G_LM_MBZ_MASK_NO_NX; 2113 pVCpu->pgm.s.fGstAmd64MbzPml4eMask = fMbzPageFrameMask | X86_PML4E_MBZ_MASK_NO_NX; 2114 2115 pVCpu->pgm.s.fGst64ShadowedPteMask = X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_G | X86_PTE_A | X86_PTE_D; 2116 pVCpu->pgm.s.fGst64ShadowedPdeMask = X86_PDE_P | X86_PDE_RW | X86_PDE_US | X86_PDE_A; 2117 pVCpu->pgm.s.fGst64ShadowedBigPdeMask = X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_A; 2118 pVCpu->pgm.s.fGst64ShadowedBigPde4PteMask = 2119 X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_G | X86_PDE4M_A | X86_PDE4M_D; 2114 2120 } 2115 2121 -
trunk/src/VBox/VMM/PGMGstDefs.h
r31775 r31849 38 38 #undef GST_PD_MASK 39 39 #undef GST_PTE_PG_MASK 40 #undef GST_GET_PTE_SHW_FLAGS 40 41 #undef GST_PT_SHIFT 41 42 #undef GST_PT_MASK … … 46 47 #undef GST_PDPT_MASK 47 48 #undef GST_PDPE_PG_MASK 48 #undef GST_GET_PDE_BIG_PG_GCPHYS 49 #undef GST_GET_PDE_GCPHYS 50 #undef GST_GET_BIG_PDE_GCPHYS 51 #undef GST_GET_PDE_SHW_FLAGS 52 #undef GST_GET_BIG_PDE_SHW_FLAGS 53 #undef GST_GET_BIG_PDE_SHW_FLAGS_4_PTE 49 54 #undef GST_IS_PTE_VALID 50 55 #undef GST_IS_PDE_VALID … … 101 106 # endif 102 107 # endif 108 # define GST_GET_PTE_SHW_FLAGS(pVCpu, Pte) (true && This_should_perhaps_not_be_used_in_this_context) //?? 109 # define GST_GET_PDE_SHW_FLAGS(pVCpu, Pde) (true && This_should_perhaps_not_be_used_in_this_context) //?? 110 # define GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, Pde) (true && This_should_perhaps_not_be_used_in_this_context) //?? 111 # define GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, Pde) (true && This_should_perhaps_not_be_used_in_this_context) //?? 103 112 # define GST_IS_PTE_VALID(pVCpu, Pte) (true) 104 113 # define GST_IS_PDE_VALID(pVCpu, Pde) (true) … … 125 134 # define GST_PDE_PG_MASK X86_PDE_PG_MASK 126 135 # define GST_PDE_BIG_PG_MASK X86_PDE4M_PG_MASK 127 # define GST_GET_PDE_BIG_PG_GCPHYS(pVM, PdeGst) pgmGstGet4MBPhysPage(&(pVM)->pgm.s, PdeGst) 136 # define GST_GET_PDE_GCPHYS(Pde) ((Pde).u & GST_PDE_PG_MASK) 137 # define GST_GET_BIG_PDE_GCPHYS(pVM, Pde) pgmGstGet4MBPhysPage(&(pVM)->pgm.s, Pde) 138 # define GST_GET_PDE_SHW_FLAGS(pVCpu, Pde) ((Pde).u & (X86_PDE_P | X86_PDE_RW | X86_PDE_US | X86_PDE_A)) 139 # define GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, Pde) \ 140 ((Pde).u & (X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_A)) 141 # define GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, Pde) \ 142 ((Pde).u & (X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_A | X86_PDE4M_D | X86_PDE4M_G)) 128 143 # define GST_PD_SHIFT X86_PD_SHIFT 129 144 # define GST_PD_MASK X86_PD_MASK 130 145 # define GST_TOTAL_PD_ENTRIES X86_PG_ENTRIES 131 146 # define GST_PTE_PG_MASK X86_PTE_PG_MASK 147 # define GST_GET_PTE_SHW_FLAGS(pVCpu, Pte) ((Pte).u & (X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D | X86_PTE_G)) 132 148 # define GST_PT_SHIFT X86_PT_SHIFT 133 149 # define GST_PT_MASK X86_PT_MASK … … 157 173 # define GST_PDE_PG_MASK X86_PDE_PAE_PG_MASK_FULL 158 174 # define GST_PDE_BIG_PG_MASK X86_PDE2M_PAE_PG_MASK 159 # define GST_GET_PDE_BIG_PG_GCPHYS(pVM, PdeGst) ((PdeGst).u & GST_PDE_BIG_PG_MASK) 175 # define GST_GET_PDE_GCPHYS(Pde) ((Pde).u & X86_PDE_PAE_PG_MASK_FULL) 176 # define GST_GET_BIG_PDE_GCPHYS(pVM, Pde) ((Pde).u & GST_PDE_BIG_PG_MASK) 177 # define GST_GET_PTE_SHW_FLAGS(pVCpu, Pte) ((Pte).u & (pVCpu)->pgm.s.fGst64ShadowedPteMask ) 178 # define GST_GET_PDE_SHW_FLAGS(pVCpu, Pde) ((Pde).u & (pVCpu)->pgm.s.fGst64ShadowedPdeMask ) 179 # define GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, Pde) ((Pde).u & (pVCpu)->pgm.s.fGst64ShadowedBigPdeMask ) 180 # define GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, Pde) ((Pde).u & (pVCpu)->pgm.s.fGst64ShadowedBigPde4PteMask ) 181 160 182 # define GST_PD_SHIFT X86_PD_PAE_SHIFT 161 183 # define GST_PD_MASK X86_PD_PAE_MASK -
trunk/src/VBox/VMM/PGMInternal.h
r31834 r31849 3512 3512 /** @} */ 3513 3513 3514 /** @name PAE and AMD64 Guest Paging. 3515 * @{ */ 3516 /** Mask containing the PTE bits that we shadow. */ 3517 uint64_t fGst64ShadowedPteMask; 3518 /** Mask containing the PDE bits that we shadow. */ 3519 uint64_t fGst64ShadowedPdeMask; 3520 /** Mask containing the big page PDE bits that we shadow in the PDE. */ 3521 uint64_t fGst64ShadowedBigPdeMask; 3522 /** Mask containing the big page PDE bits that we shadow in the PTE. */ 3523 uint64_t fGst64ShadowedBigPde4PteMask; 3524 /** @} */ 3525 3514 3526 /** @name PAE Guest Paging. 3515 3527 * @{ */ -
trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
r31780 r31849 2236 2236 pVCpu->pgm.s.fGstAmd64MbzBigPdpeMask &= ~X86_PDPE_LM_NX; 2237 2237 pVCpu->pgm.s.fGstAmd64MbzPml4eMask &= ~X86_PML4E_NX; 2238 2239 pVCpu->pgm.s.fGst64ShadowedPteMask |= X86_PTE_PAE_NX; 2240 pVCpu->pgm.s.fGst64ShadowedPdeMask |= X86_PDE_PAE_NX; 2241 pVCpu->pgm.s.fGst64ShadowedBigPdeMask |= X86_PDE2M_PAE_NX; 2242 pVCpu->pgm.s.fGst64ShadowedBigPde4PteMask |= X86_PDE2M_PAE_NX; 2238 2243 } 2239 2244 else … … 2243 2248 pVCpu->pgm.s.fGstPaeMbzPdeMask |= X86_PDE_PAE_NX; 2244 2249 pVCpu->pgm.s.fGstPaeMbzBigPdeMask |= X86_PDE2M_PAE_NX; 2245 /*pVCpu->pgm.s.fGstPaeMbzPdpeMask - 2250 /*pVCpu->pgm.s.fGstPaeMbzPdpeMask -N/A */ 2246 2251 pVCpu->pgm.s.fGstAmd64MbzPteMask |= X86_PTE_PAE_NX; 2247 2252 pVCpu->pgm.s.fGstAmd64MbzPdeMask |= X86_PDE_PAE_NX; … … 2250 2255 pVCpu->pgm.s.fGstAmd64MbzBigPdpeMask |= X86_PDPE_LM_NX; 2251 2256 pVCpu->pgm.s.fGstAmd64MbzPml4eMask |= X86_PML4E_NX; 2257 2258 pVCpu->pgm.s.fGst64ShadowedPteMask &= ~X86_PTE_PAE_NX; 2259 pVCpu->pgm.s.fGst64ShadowedPdeMask &= ~X86_PDE_PAE_NX; 2260 pVCpu->pgm.s.fGst64ShadowedBigPdeMask &= ~X86_PDE2M_PAE_NX; 2261 pVCpu->pgm.s.fGst64ShadowedBigPde4PteMask &= ~X86_PDE2M_PAE_NX; 2252 2262 } 2253 2263 } -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r31835 r31849 1270 1270 */ 1271 1271 PPGMPOOLPAGE pShwPage = pgmPoolGetPage(pPool, PdeDst.u & SHW_PDE_PG_MASK); 1272 RTGCPHYS GCPhys = PdeSrc.u & GST_PDE_PG_MASK;1272 RTGCPHYS GCPhys = GST_GET_PDE_GCPHYS(PdeSrc); 1273 1273 1274 1274 # ifdef PGMPOOL_WITH_OPTIMIZED_DIRTY_PT … … 1321 1321 /* Before freeing the page, check if anything really changed. */ 1322 1322 PPGMPOOLPAGE pShwPage = pgmPoolGetPage(pPool, PdeDst.u & SHW_PDE_PG_MASK); 1323 RTGCPHYS GCPhys = GST_GET_ PDE_BIG_PG_GCPHYS(pVM, PdeSrc);1323 RTGCPHYS GCPhys = GST_GET_BIG_PDE_GCPHYS(pVM, PdeSrc); 1324 1324 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 1325 1325 /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/ … … 1330 1330 { 1331 1331 /* ASSUMES a the given bits are identical for 4M and normal PDEs */ 1332 /** @todo PAT */ 1333 if ( (PdeSrc.u & (X86_PDE_P | X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD)) 1334 == (PdeDst.u & (X86_PDE_P | X86_PDE_RW | X86_PDE_US | X86_PDE_PWT | X86_PDE_PCD)) 1332 /** @todo This test is wrong as it cannot check the G bit! 1333 * FIXME */ 1334 if ( (PdeSrc.u & (X86_PDE_P | X86_PDE_RW | X86_PDE_US)) 1335 == (PdeDst.u & (X86_PDE_P | X86_PDE_RW | X86_PDE_US)) 1335 1336 && ( PdeSrc.b.u1Dirty /** @todo rainy day: What about read-only 4M pages? not very common, but still... */ 1336 1337 || (PdeDst.u & PGM_PDFLAGS_TRACK_DIRTY))) … … 1832 1833 if (!fBigPage) 1833 1834 { 1834 GCPhys = PdeSrc.u & GST_PDE_PG_MASK;1835 GCPhys = GST_GET_PDE_GCPHYS(PdeSrc); 1835 1836 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 1836 1837 /* Select the right PDE as we're emulating a 4kb page table with 2 shadow page tables. */ … … 1840 1841 else 1841 1842 { 1842 GCPhys = GST_GET_ PDE_BIG_PG_GCPHYS(pVM, PdeSrc);1843 GCPhys = GST_GET_BIG_PDE_GCPHYS(pVM, PdeSrc); 1843 1844 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 1844 1845 /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/ … … 1846 1847 # endif 1847 1848 } 1849 /** @todo This doesn't check the G bit of 2/4MB pages. FIXME */ 1848 1850 if ( fPdeValid 1849 1851 && pShwPage->GCPhys == GCPhys … … 1870 1872 */ 1871 1873 PGSTPT pPTSrc; 1872 int rc = PGM_GCPHYS_2_PTR_V2(pVM, pVCpu, PdeSrc.u & GST_PDE_PG_MASK, &pPTSrc);1874 int rc = PGM_GCPHYS_2_PTR_V2(pVM, pVCpu, GST_GET_PDE_GCPHYS(PdeSrc), &pPTSrc); 1873 1875 if (RT_SUCCESS(rc)) 1874 1876 { … … 1959 1961 */ 1960 1962 /* Calculate the GC physical address of this 4KB shadow page. */ 1961 GCPhys = GST_GET_ PDE_BIG_PG_GCPHYS(pVM, PdeSrc) | (GCPtrPage & GST_BIG_PAGE_OFFSET_MASK);1963 GCPhys = GST_GET_BIG_PDE_GCPHYS(pVM, PdeSrc) | (GCPtrPage & GST_BIG_PAGE_OFFSET_MASK); 1962 1964 /* Find ram range. */ 1963 1965 PPGMPAGE pPage; … … 1993 1995 SHWPTE PteDst; 1994 1996 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage)) 1995 PGM_BTH_NAME(SyncHandlerPte)(pVM, pPage, 1996 PdeSrc.u & ~( X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK 1997 | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT), 1998 &PteDst); 1997 PGM_BTH_NAME(SyncHandlerPte)(pVM, pPage, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc), &PteDst); 1999 1998 else 2000 SHW_PTE_SET(PteDst, 2001 (PdeSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT)) 2002 | PGM_PAGE_GET_HCPHYS(pPage)); 1999 SHW_PTE_SET(PteDst, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc) | PGM_PAGE_GET_HCPHYS(pPage)); 2003 2000 2004 2001 const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK; … … 2050 2047 { 2051 2048 LogFlow(("PGM_GCPHYS_2_PTR %RGp (big) failed with %Rrc\n", GCPhys, rc)); 2052 /** @todo must wipe the shadow page table in this case. */ 2049 /** @todo must wipe the shadow page table entry in this 2050 * case. */ 2053 2051 } 2054 2052 } … … 2067 2065 else 2068 2066 { 2069 /// @todo STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_MID_Z(Stat,SyncPagePDOutOfSync ));2067 /// @todo STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_MID_Z(Stat,SyncPagePDOutOfSyncAndInvalid)); 2070 2068 Log2(("SyncPage: Bad PDE at %RGp PdeSrc=%RX64 PdeDst=%RX64 (GCPhys %RGp vs %RGp)\n", 2071 2069 GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u, pShwPage->GCPhys, GCPhys)); … … 2367 2365 */ 2368 2366 PGSTPT pPTSrc; 2369 int rc = PGM_GCPHYS_2_PTR_V2(pVM, pVCpu, pPdeSrc->u & GST_PDE_PG_MASK, &pPTSrc);2367 int rc = PGM_GCPHYS_2_PTR_V2(pVM, pVCpu, GST_GET_PDE_GCPHYS(*pPdeSrc), &pPTSrc); 2370 2368 if (RT_FAILURE(rc)) 2371 2369 { … … 2476 2474 * Sync a shadow page table. 2477 2475 * 2478 * The shadow page table is not present. This includes the case where 2479 * there is a conflict with a mapping. 2476 * The shadow page table is not present in the shadow PDE. 2477 * 2478 * Handles mapping conflicts. 2479 * 2480 * This is called by VerifyAccessSyncPage, PrefetchPage, InvalidatePage (on 2481 * conflict), and Trap0eHandler. 2482 * 2483 * A precodition for this method is that the shadow PDE is not present. The 2484 * caller must take the PGM lock before checking this and continue to hold it 2485 * when calling this method. 2480 2486 * 2481 2487 * @returns VBox status code. … … 2508 2514 2509 2515 /* 2510 * Validate input a little bit.2516 * Some input validation first. 2511 2517 */ 2512 2518 AssertMsg(iPDSrc == ((GCPtrPage >> GST_PD_SHIFT) & GST_PD_MASK), ("iPDSrc=%x GCPtrPage=%RGv\n", iPDSrc, GCPtrPage)); 2519 2520 /* 2521 * Get the relevant shadow PDE entry. 2522 */ 2513 2523 # if PGM_SHW_TYPE == PGM_TYPE_32BIT 2514 2524 const unsigned iPDDst = GCPtrPage >> SHW_PD_SHIFT; … … 2587 2597 2588 2598 /* 2589 * Sync page directory entry. 2590 */ 2591 GSTPDE PdeSrc = pPDSrc->a[iPDSrc]; 2592 if (PdeSrc.n.u1Present) 2599 * Sync the page directory entry. 2600 */ 2601 GSTPDE PdeSrc = pPDSrc->a[iPDSrc]; 2602 const bool fPageTable = !PdeSrc.b.u1Size || !GST_IS_PSE_ACTIVE(pVCpu); 2603 if ( PdeSrc.n.u1Present 2604 && (fPageTable ? GST_IS_PDE_VALID(pVCpu, PdeSrc) : GST_IS_BIG_PDE_VALID(pVCpu, PdeSrc)) ) 2593 2605 { 2594 2606 /* … … 2596 2608 */ 2597 2609 PSHWPT pPTDst; 2598 const bool fPageTable = !PdeSrc.b.u1Size || !GST_IS_PSE_ACTIVE(pVCpu);2599 2610 PPGMPOOLPAGE pShwPage; 2600 2611 RTGCPHYS GCPhys; 2601 2612 if (fPageTable) 2602 2613 { 2603 GCPhys = PdeSrc.u & GST_PDE_PG_MASK;2614 GCPhys = GST_GET_PDE_GCPHYS(PdeSrc); 2604 2615 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 2605 2616 /* Select the right PDE as we're emulating a 4kb page table with 2 shadow page tables. */ … … 2612 2623 PGMPOOLACCESS enmAccess; 2613 2624 # if PGM_WITH_NX(PGM_GST_TYPE, PGM_SHW_TYPE) 2614 const bool fNoExecute = PdeSrc.n.u1NoExecute && GST_IS_NX_ACTIVE(pVCpu);2625 const bool fNoExecute = PdeSrc.n.u1NoExecute && GST_IS_NX_ACTIVE(pVCpu); 2615 2626 # else 2616 const bool fNoExecute = false;2617 # endif 2618 2619 GCPhys = GST_GET_ PDE_BIG_PG_GCPHYS(pVM, PdeSrc);2627 const bool fNoExecute = false; 2628 # endif 2629 2630 GCPhys = GST_GET_BIG_PDE_GCPHYS(pVM, PdeSrc); 2620 2631 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 2621 2632 /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/ … … 2647 2658 */ 2648 2659 if (fPageTable) 2649 PdeDst.u = pShwPage->Core.Key 2650 | (PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PDE_AVL_MASK | X86_PDE_PCD | X86_PDE_PWT | X86_PDE_PS | X86_PDE4M_G | X86_PDE4M_D)); 2660 PdeDst.u = pShwPage->Core.Key | GST_GET_PDE_SHW_FLAGS(pVCpu, PdeSrc); 2651 2661 else 2652 2662 { 2653 PdeDst.u = pShwPage->Core.Key 2654 | (PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PDE_AVL_MASK | X86_PDE_PCD | X86_PDE_PWT | X86_PDE_PS | X86_PDE4M_G | X86_PDE4M_D)); 2663 PdeDst.u = pShwPage->Core.Key | GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, PdeSrc); 2655 2664 /* (see explanation and assumptions further down.) */ 2656 2665 if ( !PdeSrc.b.u1Dirty … … 2674 2683 else 2675 2684 AssertMsgFailedReturn(("rc=%Rrc\n", rc), VERR_INTERNAL_ERROR); 2685 /** @todo Why do we bother preserving X86_PDE_AVL_MASK here? 2686 * Both PGM_PDFLAGS_MAPPING and PGM_PDFLAGS_TRACK_DIRTY should be 2687 * irrelevant at this point. */ 2676 2688 PdeDst.u &= X86_PDE_AVL_MASK; 2677 2689 PdeDst.u |= pShwPage->Core.Key; … … 2680 2692 * Page directory has been accessed (this is a fault situation, remember). 2681 2693 */ 2694 /** @todo 2695 * Well, when the caller is PrefetchPage or InvalidatePage is isn't a 2696 * fault situation. What's more, the Trap0eHandler has already set the 2697 * accessed bit. So, it's actually just VerifyAccessSyncPage which 2698 * might need setting the accessed flag. 2699 * 2700 * The best idea is to leave this change to the caller and add an 2701 * assertion that it's set already. */ 2682 2702 pPDSrc->a[iPDSrc].n.u1Accessed = 1; 2683 2703 if (fPageTable) … … 2691 2711 GCPtrPage, PdeSrc.b.u1Present, PdeSrc.b.u1Write, PdeSrc.b.u1User, (uint64_t)PdeSrc.u)); 2692 2712 PGSTPT pPTSrc; 2693 rc = PGM_GCPHYS_2_PTR(pVM, PdeSrc.u & GST_PDE_PG_MASK, &pPTSrc);2713 rc = PGM_GCPHYS_2_PTR(pVM, GST_GET_PDE_GCPHYS(PdeSrc), &pPTSrc); 2694 2714 if (RT_SUCCESS(rc)) 2695 2715 { … … 2698 2718 */ 2699 2719 PdeDst.u = (PdeDst.u & (SHW_PDE_PG_MASK | X86_PDE_AVL_MASK)) 2700 | (PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PDE_AVL_MASK | X86_PDE_PCD | X86_PDE_PWT | X86_PDE_PS | X86_PDE4M_G | X86_PDE4M_D));2720 | GST_GET_PDE_SHW_FLAGS(pVCpu, PdeSrc); 2701 2721 ASMAtomicWriteSize(pPdeDst, PdeDst.u); 2702 2722 PGM_DYNMAP_UNUSED_HINT(pVCpu, pPdeDst); … … 2762 2782 (uint64_t)PteSrc.u, 2763 2783 SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : "", SHW_PTE_LOG64(pPTDst->a[iPTDst]), iPTSrc, PdeSrc.au32[0], 2764 (RTGCPHYS)( (PdeSrc.u & GST_PDE_PG_MASK) + iPTSrc*sizeof(PteSrc)) ));2784 (RTGCPHYS)(GST_GET_PDE_GCPHYS(PdeSrc) + iPTSrc*sizeof(PteSrc)) )); 2765 2785 } 2766 2786 /* else: the page table was cleared by the pool */ … … 2787 2807 */ 2788 2808 PdeDst.u = (PdeDst.u & (SHW_PDE_PG_MASK | (X86_PDE_AVL_MASK & ~PGM_PDFLAGS_TRACK_DIRTY))) 2789 | (PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PDE_AVL_MASK | X86_PDE_PCD | X86_PDE_PWT | X86_PDE_PS | X86_PDE4M_G | X86_PDE4M_D));2809 | GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, PdeSrc); 2790 2810 2791 2811 /* … … 2813 2833 */ 2814 2834 /* Get address and flags from the source PDE. */ 2815 Assert(GST_IS_BIG_PDE_VALID(pVCpu, PdeSrc));2816 2835 SHWPTE PteDstBase; 2817 SHW_PTE_SET(PteDstBase, PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT));2836 SHW_PTE_SET(PteDstBase, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc)); 2818 2837 2819 2838 /* Loop thru the entries in the shadow PT. */ … … 3848 3867 || !fBigPagesSupported) 3849 3868 { 3850 GCPhysGst = PdeSrc.u & GST_PDE_PG_MASK;3869 GCPhysGst = GST_GET_PDE_GCPHYS(PdeSrc); 3851 3870 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 3852 3871 GCPhysGst |= (iPDDst & 1) * (PAGE_SIZE / 2); … … 3864 3883 } 3865 3884 # endif 3866 GCPhysGst = GST_GET_ PDE_BIG_PG_GCPHYS(pVM, PdeSrc);3885 GCPhysGst = GST_GET_BIG_PDE_GCPHYS(pVM, PdeSrc); 3867 3886 # if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT 3868 3887 GCPhysGst |= GCPtr & RT_BIT(X86_PAGE_2M_SHIFT); … … 3951 3970 # ifdef IN_RING3 3952 3971 PGMAssertHandlerAndFlagsInSync(pVM); 3953 PGMR3DumpHierarchyGC(pVM, cr3, cr4, (PdeSrc.u & GST_PDE_PG_MASK));3972 PGMR3DumpHierarchyGC(pVM, cr3, cr4, GST_GET_PDE_GCPHYS(PdeSrc)); 3954 3973 # endif 3955 3974 AssertMsgFailed(("Out of sync (!P) PTE at %RGv! PteSrc=%#RX64 PteDst=%#RX64 pPTSrc=%RGv iPTSrc=%x PdeSrc=%x physpte=%RGp\n", 3956 3975 GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst), pPTSrc, iPT + offPTSrc, PdeSrc.au32[0], 3957 ( PdeSrc.u & GST_PDE_PG_MASK) + (iPT + offPTSrc)*sizeof(PteSrc)));3976 (uint64_t)GST_GET_PDE_GCPHYS(PdeSrc) + (iPT + offPTSrc)*sizeof(PteSrc))); 3958 3977 cErrors++; 3959 3978 continue; -
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r31528 r31849 164 164 return PGM_GST_NAME(WalkReturnRsvdError)(pVCpu, pWalk, 2); 165 165 166 pWalk->Core.GCPhys = GST_GET_ PDE_BIG_PG_GCPHYS(pVCpu->CTX_SUFF(pVM), Pde)166 pWalk->Core.GCPhys = GST_GET_BIG_PDE_GCPHYS(pVCpu->CTX_SUFF(pVM), Pde) 167 167 | (GCPtr & GST_BIG_PAGE_OFFSET_MASK); 168 168 uint8_t fEffectiveXX = (uint8_t)pWalk->Pde.u … … 195 195 * The PTE. 196 196 */ 197 rc = PGM_GCPHYS_2_PTR_BY_VMCPU(pVCpu, Pde.u & GST_PDE_PG_MASK, &pWalk->pPt);197 rc = PGM_GCPHYS_2_PTR_BY_VMCPU(pVCpu, GST_GET_PDE_GCPHYS(Pde), &pWalk->pPt); 198 198 if (RT_FAILURE(rc)) 199 199 return PGM_GST_NAME(WalkReturnBadPhysAddr)(pVCpu, pWalk, 1, rc); … … 214 214 * We're done. 215 215 */ 216 pWalk->Core.GCPhys = (Pte.u & GST_PDE_PG_MASK)216 pWalk->Core.GCPhys = GST_GET_PDE_GCPHYS(Pte) 217 217 | (GCPtr & PAGE_OFFSET_MASK); 218 218 uint8_t fEffectiveXX = (uint8_t)pWalk->Pte.u … … 368 368 { 369 369 /* 370 * 4MB Page table370 * 2/4MB Page table 371 371 */ 372 372 GSTPDE PdeNew; … … 501 501 */ 502 502 PGSTPT pPT; 503 int rc = PGM_GCPHYS_2_PTR_V2(pVM, pVCpu, Pde.u & GST_PDE_PG_MASK, &pPT);503 int rc = PGM_GCPHYS_2_PTR_V2(pVM, pVCpu, GST_GET_PDE_GCPHYS(Pde), &pPT); 504 504 if (RT_SUCCESS(rc)) 505 505 { … … 558 558 * 2/4MB page. 559 559 */ 560 RTGCPHYS GCPhys = (RTGCPHYS) (Pde.u & GST_PDE_PG_MASK);560 RTGCPHYS GCPhys = (RTGCPHYS)GST_GET_PDE_GCPHYS(Pde); 561 561 for (unsigned i4KB = (GCPtr >> GST_PT_SHIFT) & GST_PT_MASK; 562 562 i4KB < PAGE_SIZE / sizeof(GSTPDE) && iPage < pCur->cPages; -
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r31836 r31849 1652 1652 return false; 1653 1653 1654 GCPhys = GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1);1654 GCPhys = GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK; 1655 1655 1656 1656 for (unsigned i = 0; i < RT_ELEMENTS(pPool->aIdxDirtyPages); i++) … … 1723 1723 return; 1724 1724 1725 GCPhysPT = GCPhysPT & ~(RTGCPHYS) (PAGE_SIZE - 1);1725 GCPhysPT = GCPhysPT & ~(RTGCPHYS)PAGE_OFFSET_MASK; 1726 1726 1727 1727 for (unsigned i = 0; i < RT_ELEMENTS(pPool->aIdxDirtyPages); i++) … … 2155 2155 * Look up the GCPhys in the hash. 2156 2156 */ 2157 RTGCPHYS GCPhys = pNewPage->GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1);2157 RTGCPHYS GCPhys = pNewPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK; 2158 2158 unsigned i = pPool->aiHash[PGMPOOL_HASH(GCPhys)]; 2159 2159 if (i == NIL_PGMPOOL_IDX) … … 2229 2229 static int pgmPoolMonitorInsert(PPGMPOOL pPool, PPGMPOOLPAGE pPage) 2230 2230 { 2231 LogFlow(("pgmPoolMonitorInsert %RGp\n", pPage->GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1)));2231 LogFlow(("pgmPoolMonitorInsert %RGp\n", pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK)); 2232 2232 2233 2233 /* … … 2301 2301 Assert(pPage->iMonitoredNext == NIL_PGMPOOL_IDX); Assert(pPage->iMonitoredPrev == NIL_PGMPOOL_IDX); 2302 2302 PVM pVM = pPool->CTX_SUFF(pVM); 2303 const RTGCPHYS GCPhysPage = pPage->GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1);2303 const RTGCPHYS GCPhysPage = pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK; 2304 2304 rc = PGMHandlerPhysicalRegisterEx(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_WRITE, 2305 GCPhysPage, GCPhysPage + (PAGE_SIZE - 1),2305 GCPhysPage, GCPhysPage + PAGE_OFFSET_MASK, 2306 2306 pPool->pfnAccessHandlerR3, MMHyperCCToR3(pVM, pPage), 2307 2307 pPool->pfnAccessHandlerR0, MMHyperCCToR0(pVM, pPage), … … 2384 2384 PPGMPOOLPAGE pNewHead = &pPool->aPages[pPage->iMonitoredNext]; 2385 2385 pNewHead->iMonitoredPrev = NIL_PGMPOOL_IDX; 2386 rc = PGMHandlerPhysicalChangeCallbacks(pVM, pPage->GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1),2386 rc = PGMHandlerPhysicalChangeCallbacks(pVM, pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK, 2387 2387 pPool->pfnAccessHandlerR3, MMHyperCCToR3(pVM, pNewHead), 2388 2388 pPool->pfnAccessHandlerR0, MMHyperCCToR0(pVM, pNewHead), … … 2406 2406 else 2407 2407 { 2408 rc = PGMHandlerPhysicalDeregister(pVM, pPage->GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1));2408 rc = PGMHandlerPhysicalDeregister(pVM, pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK); 2409 2409 AssertFatalRC(rc); 2410 2410 PVMCPU pVCpu = VMMGetCpu(pVM); … … 3048 3048 case PGM_PAGE_HNDL_PHYS_STATE_WRITE: /* Write access is monitored. */ 3049 3049 u64OrMask = 0; 3050 u64AndMask = ~( (uint64_t)X86_PTE_RW);3050 u64AndMask = ~(uint64_t)X86_PTE_RW; 3051 3051 fRet = true; 3052 3052 STAM_COUNTER_INC(&pPool->StatTrackFlushEntryKeep); … … 4930 4930 * Look up the GCPhys in the hash. 4931 4931 */ 4932 GCPhys = GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1);4932 GCPhys = GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK; 4933 4933 unsigned i = pPool->aiHash[PGMPOOL_HASH(GCPhys)]; 4934 4934 if (i == NIL_PGMPOOL_IDX) … … 5168 5168 if (pPage->fMonitored) 5169 5169 { 5170 int rc = PGMHandlerPhysicalChangeCallbacks(pVM, pPage->GCPhys & ~(RTGCPHYS) (PAGE_SIZE - 1),5170 int rc = PGMHandlerPhysicalChangeCallbacks(pVM, pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK, 5171 5171 pPool->pfnAccessHandlerR3, MMHyperCCToR3(pVM, pPage), 5172 5172 pPool->pfnAccessHandlerR0, MMHyperCCToR0(pVM, pPage),
Note:
See TracChangeset
for help on using the changeset viewer.