Changeset 24077 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Oct 26, 2009 2:08:59 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53951
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r23488 r24077 2999 2999 VMMR3DECL(int) PGMR3ChangeMode(PVM pVM, PVMCPU pVCpu, PGMMODE enmGuestMode) 3000 3000 { 3001 bool fIsOldGuestPagingMode64Bits = (pVCpu->pgm.s.enmGuestMode >= PGMMODE_AMD64); 3002 bool fIsNewGuestPagingMode64Bits = (enmGuestMode >= PGMMODE_AMD64); 3003 3001 3004 Log(("PGMR3ChangeMode: Guest mode: %s -> %s\n", PGMGetModeName(pVCpu->pgm.s.enmGuestMode), PGMGetModeName(enmGuestMode))); 3002 3005 STAM_REL_COUNTER_INC(&pVCpu->pgm.s.cGuestModeChanges); … … 3023 3026 * Exit old mode(s). 3024 3027 */ 3028 #if HC_ARCH_BITS == 32 3029 /* The nested shadow paging mode for AMD-V does change when running 64 bits guests on 32 bits hosts; typically PAE <-> AMD64 */ 3030 const bool fForceShwEnterExit = ( fIsOldGuestPagingMode64Bits != fIsNewGuestPagingMode64Bits 3031 && enmShadowMode == PGMMODE_NESTED); 3032 #else 3033 const bool fForceShwEnterExit = false; 3034 #endif 3025 3035 /* shadow */ 3026 if (enmShadowMode != pVCpu->pgm.s.enmShadowMode) 3036 if ( enmShadowMode != pVCpu->pgm.s.enmShadowMode 3037 || fForceShwEnterExit) 3027 3038 { 3028 3039 LogFlow(("PGMR3ChangeMode: Shadow mode: %s -> %s\n", PGMGetModeName(pVCpu->pgm.s.enmShadowMode), PGMGetModeName(enmShadowMode))); … … 3060 3071 * Enter new shadow mode (if changed). 3061 3072 */ 3062 if (enmShadowMode != pVCpu->pgm.s.enmShadowMode) 3073 if ( enmShadowMode != pVCpu->pgm.s.enmShadowMode 3074 || fForceShwEnterExit) 3063 3075 { 3064 3076 int rc; … … 3067 3079 { 3068 3080 case PGMMODE_32_BIT: 3069 rc = PGM_SHW_NAME_32BIT(Enter)(pVCpu );3081 rc = PGM_SHW_NAME_32BIT(Enter)(pVCpu, false); 3070 3082 break; 3071 3083 case PGMMODE_PAE: 3072 3084 case PGMMODE_PAE_NX: 3073 rc = PGM_SHW_NAME_PAE(Enter)(pVCpu );3085 rc = PGM_SHW_NAME_PAE(Enter)(pVCpu, false); 3074 3086 break; 3075 3087 case PGMMODE_AMD64: 3076 3088 case PGMMODE_AMD64_NX: 3077 rc = PGM_SHW_NAME_AMD64(Enter)(pVCpu );3089 rc = PGM_SHW_NAME_AMD64(Enter)(pVCpu, fIsNewGuestPagingMode64Bits); 3078 3090 break; 3079 3091 case PGMMODE_NESTED: 3080 rc = PGM_SHW_NAME_NESTED(Enter)(pVCpu );3092 rc = PGM_SHW_NAME_NESTED(Enter)(pVCpu, fIsNewGuestPagingMode64Bits); 3081 3093 break; 3082 3094 case PGMMODE_EPT: 3083 rc = PGM_SHW_NAME_EPT(Enter)(pVCpu );3095 rc = PGM_SHW_NAME_EPT(Enter)(pVCpu, fIsNewGuestPagingMode64Bits); 3084 3096 break; 3085 3097 case PGMMODE_REAL: -
trunk/src/VBox/VMM/PGMShw.h
r20810 r24077 121 121 /* r3 */ 122 122 PGM_SHW_DECL(int, InitData)(PVM pVM, PPGMMODEDATA pModeData, bool fResolveGCAndR0); 123 PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu );123 PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu, bool fIs64BitsPagingMode); 124 124 PGM_SHW_DECL(int, Relocate)(PVMCPU pVCpu, RTGCPTR offDelta); 125 125 PGM_SHW_DECL(int, Exit)(PVMCPU pVCpu); … … 175 175 * 176 176 * @returns VBox status code. 177 * @param pVCpu The VMCPU to operate on. 178 */ 179 PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu) 177 * @param pVCpu The VMCPU to operate on. 178 * @param fIs64BitsPagingMode New shadow paging mode is for 64 bits? (only relevant for 64 bits guests on a 32 bits AMD-V nested paging host) 179 */ 180 PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu, bool fIs64BitsPagingMode) 180 181 { 181 182 #if PGM_SHW_TYPE == PGM_TYPE_NESTED || PGM_SHW_TYPE == PGM_TYPE_EPT 183 184 # if PGM_SHW_TYPE == PGM_TYPE_NESTED && HC_ARCH_BITS == 32 185 /* Must distinguish between 32 and 64 bits guest paging modes as we'll use a different shadow paging root/mode in both cases. */ 186 RTGCPHYS GCPhysCR3 = (fIs64BitsPagingMode) ? RT_BIT_64(63) : RT_BIT_64(62); 187 # else 182 188 RTGCPHYS GCPhysCR3 = RT_BIT_64(63); 189 # endif 183 190 PPGMPOOLPAGE pNewShwPageCR3; 184 191 PVM pVM = pVCpu->pVMR3; … … 188 195 Assert(!pVCpu->pgm.s.pShwPageCR3R3); 189 196 197 pgmLock(pVM); 198 190 199 int rc = pgmPoolAlloc(pVM, GCPhysCR3, PGMPOOLKIND_ROOT_NESTED, PGMPOOL_IDX_NESTED_ROOT, GCPhysCR3 >> PAGE_SHIFT, &pNewShwPageCR3, true /* lock page */); 191 200 AssertFatalRC(rc); … … 197 206 pVCpu->pgm.s.pShwPageCR3RC = MMHyperCCToRC(pVM, pVCpu->pgm.s.pShwPageCR3R3); 198 207 pVCpu->pgm.s.pShwPageCR3R0 = MMHyperCCToR0(pVM, pVCpu->pgm.s.pShwPageCR3R3); 208 209 pgmUnlock(pVM); 199 210 200 211 Log(("Enter nested shadow paging mode: root %RHv phys %RHp\n", pVCpu->pgm.s.pShwPageCR3R3, pVCpu->pgm.s.CTX_SUFF(pShwPageCR3)->Core.Key)); … … 235 246 236 247 Assert(pVCpu->pgm.s.iShwUser == PGMPOOL_IDX_NESTED_ROOT); 248 249 pgmLock(pVM); 237 250 238 251 /* Mark the page as unlocked; allow flushing again. */ … … 246 259 pVCpu->pgm.s.iShwUserTable = 0; 247 260 261 pgmUnlock(pVM); 262 248 263 Log(("Leave nested shadow paging mode\n")); 249 264 }
Note:
See TracChangeset
for help on using the changeset viewer.