VirtualBox

Changeset 24077 in vbox for trunk


Ignore:
Timestamp:
Oct 26, 2009 2:08:59 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53951
Message:

Fixed nested paging for 64 bits guests on 32 bits hosts (AMD-V only).

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGM.cpp

    r23488 r24077  
    29992999VMMR3DECL(int) PGMR3ChangeMode(PVM pVM, PVMCPU pVCpu, PGMMODE enmGuestMode)
    30003000{
     3001    bool fIsOldGuestPagingMode64Bits = (pVCpu->pgm.s.enmGuestMode >= PGMMODE_AMD64);
     3002    bool fIsNewGuestPagingMode64Bits = (enmGuestMode >= PGMMODE_AMD64);
     3003
    30013004    Log(("PGMR3ChangeMode: Guest mode: %s -> %s\n", PGMGetModeName(pVCpu->pgm.s.enmGuestMode), PGMGetModeName(enmGuestMode)));
    30023005    STAM_REL_COUNTER_INC(&pVCpu->pgm.s.cGuestModeChanges);
     
    30233026     * Exit old mode(s).
    30243027     */
     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
    30253035    /* shadow */
    3026     if (enmShadowMode != pVCpu->pgm.s.enmShadowMode)
     3036    if (    enmShadowMode != pVCpu->pgm.s.enmShadowMode
     3037        ||  fForceShwEnterExit)
    30273038    {
    30283039        LogFlow(("PGMR3ChangeMode: Shadow mode: %s -> %s\n",  PGMGetModeName(pVCpu->pgm.s.enmShadowMode), PGMGetModeName(enmShadowMode)));
     
    30603071     * Enter new shadow mode (if changed).
    30613072     */
    3062     if (enmShadowMode != pVCpu->pgm.s.enmShadowMode)
     3073    if (    enmShadowMode != pVCpu->pgm.s.enmShadowMode
     3074        ||  fForceShwEnterExit)
    30633075    {
    30643076        int rc;
     
    30673079        {
    30683080            case PGMMODE_32_BIT:
    3069                 rc = PGM_SHW_NAME_32BIT(Enter)(pVCpu);
     3081                rc = PGM_SHW_NAME_32BIT(Enter)(pVCpu, false);
    30703082                break;
    30713083            case PGMMODE_PAE:
    30723084            case PGMMODE_PAE_NX:
    3073                 rc = PGM_SHW_NAME_PAE(Enter)(pVCpu);
     3085                rc = PGM_SHW_NAME_PAE(Enter)(pVCpu, false);
    30743086                break;
    30753087            case PGMMODE_AMD64:
    30763088            case PGMMODE_AMD64_NX:
    3077                 rc = PGM_SHW_NAME_AMD64(Enter)(pVCpu);
     3089                rc = PGM_SHW_NAME_AMD64(Enter)(pVCpu, fIsNewGuestPagingMode64Bits);
    30783090                break;
    30793091            case PGMMODE_NESTED:
    3080                 rc = PGM_SHW_NAME_NESTED(Enter)(pVCpu);
     3092                rc = PGM_SHW_NAME_NESTED(Enter)(pVCpu, fIsNewGuestPagingMode64Bits);
    30813093                break;
    30823094            case PGMMODE_EPT:
    3083                 rc = PGM_SHW_NAME_EPT(Enter)(pVCpu);
     3095                rc = PGM_SHW_NAME_EPT(Enter)(pVCpu, fIsNewGuestPagingMode64Bits);
    30843096                break;
    30853097            case PGMMODE_REAL:
  • trunk/src/VBox/VMM/PGMShw.h

    r20810 r24077  
    121121/* r3 */
    122122PGM_SHW_DECL(int, InitData)(PVM pVM, PPGMMODEDATA pModeData, bool fResolveGCAndR0);
    123 PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu);
     123PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu, bool fIs64BitsPagingMode);
    124124PGM_SHW_DECL(int, Relocate)(PVMCPU pVCpu, RTGCPTR offDelta);
    125125PGM_SHW_DECL(int, Exit)(PVMCPU pVCpu);
     
    175175 *
    176176 * @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 */
     180PGM_SHW_DECL(int, Enter)(PVMCPU pVCpu, bool fIs64BitsPagingMode)
    180181{
    181182#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
    182188    RTGCPHYS     GCPhysCR3 = RT_BIT_64(63);
     189# endif
    183190    PPGMPOOLPAGE pNewShwPageCR3;
    184191    PVM          pVM       = pVCpu->pVMR3;
     
    188195    Assert(!pVCpu->pgm.s.pShwPageCR3R3);
    189196
     197    pgmLock(pVM);
     198
    190199    int rc = pgmPoolAlloc(pVM, GCPhysCR3, PGMPOOLKIND_ROOT_NESTED, PGMPOOL_IDX_NESTED_ROOT, GCPhysCR3 >> PAGE_SHIFT, &pNewShwPageCR3, true /* lock page */);
    191200    AssertFatalRC(rc);
     
    197206    pVCpu->pgm.s.pShwPageCR3RC = MMHyperCCToRC(pVM, pVCpu->pgm.s.pShwPageCR3R3);
    198207    pVCpu->pgm.s.pShwPageCR3R0 = MMHyperCCToR0(pVM, pVCpu->pgm.s.pShwPageCR3R3);
     208
     209    pgmUnlock(pVM);
    199210
    200211    Log(("Enter nested shadow paging mode: root %RHv phys %RHp\n", pVCpu->pgm.s.pShwPageCR3R3, pVCpu->pgm.s.CTX_SUFF(pShwPageCR3)->Core.Key));
     
    235246
    236247        Assert(pVCpu->pgm.s.iShwUser == PGMPOOL_IDX_NESTED_ROOT);
     248
     249        pgmLock(pVM);
    237250
    238251        /* Mark the page as unlocked; allow flushing again. */
     
    246259        pVCpu->pgm.s.iShwUserTable = 0;
    247260
     261        pgmUnlock(pVM);
     262
    248263        Log(("Leave nested shadow paging mode\n"));
    249264    }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette