VirtualBox

Changeset 11525 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Aug 21, 2008 9:07:51 AM (16 years ago)
Author:
vboxsync
Message:

Added support for PSE-36.

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

Legend:

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

    r11495 r11525  
    264264                                       | X86_CPUID_FEATURE_EDX_CMOV
    265265                                       | X86_CPUID_FEATURE_EDX_PAT
    266                                        //| X86_CPUID_FEATURE_EDX_PSE36 - not virtualized.
     266                                       | X86_CPUID_FEATURE_EDX_PSE36
    267267                                       //| X86_CPUID_FEATURE_EDX_PSN   - no serial number.
    268268                                       | X86_CPUID_FEATURE_EDX_CLFSH
     
    311311                                       | X86_CPUID_AMD_FEATURE_EDX_CMOV
    312312                                       | X86_CPUID_AMD_FEATURE_EDX_PAT
    313                                        //| X86_CPUID_AMD_FEATURE_EDX_PSE36  - not virtualized.
     313                                       | X86_CPUID_AMD_FEATURE_EDX_PSE36
    314314                                       //| X86_CPUID_AMD_FEATURE_EDX_NX     - not virtualized, requires PAE.
    315315                                       //| X86_CPUID_AMD_FEATURE_EDX_AXMMX
  • trunk/src/VBox/VMM/PGM.cpp

    r11311 r11525  
    18211821    LogFlow(("PGMR3Relocate\n"));
    18221822
     1823    /* Note that AMD uses all the 8 reserved bits for the address (so 40 bits in total); Intel only goes up to 36 bits, so
     1824     * we stick to 36 as well.
     1825     *
     1826     * @todo How to test for the 40 bits support? Long mode seems to be the test criterium.
     1827     */
     1828    uint32_t u32Dummy, u32Features;
     1829    CPUMGetGuestCpuId(pVM, 1, &u32Dummy, &u32Dummy, &u32Dummy, &u32Features);
     1830
     1831    if (u32Features & X86_CPUID_FEATURE_EDX_PSE36)
     1832        pVM->pgm.s.GCPhys4MBPSEMask = RT_BIT_64(36) - 1;
     1833    else
     1834        pVM->pgm.s.GCPhys4MBPSEMask = RT_BIT_64(32) - 1;
     1835
     1836    LogRel(("PGMR3Relocate: 4 MB PSE mask %VGp\n", pVM->pgm.s.GCPhys4MBPSEMask));
     1837
     1838
    18231839    /*
    18241840     * Paging stuff.
     
    25492565                                "%04X - %VGp P=%d U=%d RW=%d G=%d - BIG\n",
    25502566                                iPD,
    2551                                 PdeSrc.u & X86_PDE_PG_MASK,
     2567                                pgmGstGet4MBPhysPage(&pVM->pgm.s, PdeSrc),
    25522568                                PdeSrc.b.u1Present, PdeSrc.b.u1User, PdeSrc.b.u1Write, PdeSrc.b.u1Global && fPGE);
    25532569            }
     
    25572573                                "%04X - %VGp P=%d U=%d RW=%d [G=%d]\n",
    25582574                                iPD,
    2559                                 PdeSrc.u & X86_PDE4M_PG_MASK,
     2575                                PdeSrc.u & X86_PDE_PG_MASK,
    25602576                                PdeSrc.n.u1Present, PdeSrc.n.u1User, PdeSrc.n.u1Write, PdeSrc.b.u1Global && fPGE);
    25612577            }
     
    39273943                     Pde.u & RT_BIT(10)     ? '1' : '0',
    39283944                     Pde.u & RT_BIT(11)     ? '1' : '0',
    3929                      Pde.u & X86_PDE4M_PG_MASK));
     3945                     pgmGstGet4MBPhysPage(&pVM->pgm.s, Pde)));
    39303946            /** @todo PhysSearch */
    39313947            else
  • trunk/src/VBox/VMM/PGMGst.h

    r10035 r11525  
    4343#undef GST_CR3_PAGE_MASK
    4444#undef GST_PDPE_ENTRIES
     45#undef GST_GET_PDE_BIG_PG_GCPHYS
    4546
    4647#if PGM_GST_TYPE == PGM_TYPE_32BIT \
     
    5960# define GST_PDE_PG_MASK            X86_PDE_PG_MASK
    6061# define GST_PDE_BIG_PG_MASK        X86_PDE4M_PG_MASK
     62# define GST_GET_PDE_BIG_PG_GCPHYS(PdeGst)  pgmGstGet4MBPhysPage(&pVM->pgm.s, PdeGst)
    6163# define GST_PD_SHIFT               X86_PD_SHIFT
    6264# define GST_PD_MASK                X86_PD_MASK
     
    8082# define GST_PDE_PG_MASK            X86_PDE_PAE_PG_MASK
    8183# define GST_PDE_BIG_PG_MASK        X86_PDE2M_PAE_PG_MASK
     84# define GST_GET_PDE_BIG_PG_GCPHYS(PdeGst)  (PdeGst.u & GST_PDE_BIG_PG_MASK)
    8285# define GST_PD_SHIFT               X86_PD_PAE_SHIFT
    8386# define GST_PD_MASK                X86_PD_PAE_MASK
  • trunk/src/VBox/VMM/PGMInternal.h

    r11309 r11525  
    22242224    RTHCPHYS                        aHCPhysDynPageMapCache[MM_HYPER_DYNAMIC_SIZE >> (PAGE_SHIFT + 1)];
    22252225
     2226    /** 4 MB page mask; 32 or 36 bits depending on PSE-36 */
     2227    RTGCPHYS                        GCPhys4MBPSEMask;
     2228
    22262229    /** A20 gate mask.
    22272230     * Our current approach to A20 emulation is to let REM do it and don't bother
     
    32423245}
    32433246
     3247/**
     3248 * Calculated the guest physical address of the large (4 MB) page in 32 bits paging mode.
     3249 * Takes PSE-36 into account.
     3250 *
     3251 * @returns guest physical address
     3252 * @param   pPGM        Pointer to the PGM instance data.
     3253 * @param   Pde         Guest Pde
     3254 */
     3255DECLINLINE(RTGCPHYS) pgmGstGet4MBPhysPage(PPGM pPGM, X86PDE Pde)
     3256{
     3257    RTGCPHYS GCPhys = Pde.u & X86_PDE4M_PG_MASK;
     3258    GCPhys |= (RTGCPHYS)Pde.b.u8PageNoHigh << 32;
     3259
     3260    return GCPhys & pPGM->GCPhys4MBPSEMask;
     3261}
    32443262
    32453263/**
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r11449 r11525  
    326326        if (    PdeSrc.b.u1Size
    327327            &&  fBigPagesSupported)
    328             GCPhys = (PdeSrc.u & GST_PDE_BIG_PG_MASK)
     328            GCPhys = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc)
    329329                    | ((RTGCPHYS)pvFault & (GST_BIG_PAGE_OFFSET_MASK ^ PAGE_OFFSET_MASK));
    330330        else
     
    12111211            /* Before freeing the page, check if anything really changed. */
    12121212            PPGMPOOLPAGE    pShwPage = pgmPoolGetPageByHCPhys(pVM, PdeDst.u & SHW_PDE_PG_MASK);
    1213             RTGCPHYS        GCPhys   = PdeSrc.u & GST_PDE_BIG_PG_MASK;
     1213            RTGCPHYS        GCPhys   = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc);
    12141214# if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    12151215            /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/
     
    15911591    else
    15921592    {
    1593         GCPhys = PdeSrc.u & GST_PDE_BIG_PG_MASK;
     1593        GCPhys = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc);
    15941594# if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    15951595        /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/
     
    17061706                 */
    17071707                /* Calculate the GC physical address of this 4KB shadow page. */
    1708                 RTGCPHYS GCPhys = (PdeSrc.u & GST_PDE_BIG_PG_MASK) | ((RTGCUINTPTR)GCPtrPage & GST_BIG_PAGE_OFFSET_MASK);
     1708                RTGCPHYS GCPhys = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc) | ((RTGCUINTPTR)GCPtrPage & GST_BIG_PAGE_OFFSET_MASK);
    17091709                /* Find ram range. */
    17101710                PPGMPAGE pPage;
     
    23552355        else
    23562356        {
    2357             GCPhys = PdeSrc.u & GST_PDE_BIG_PG_MASK;
     2357            GCPhys = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc);
    23582358# if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    23592359            /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/
     
    33353335                            else
    33363336                            {
    3337                                 GCPhys = PdeSrc.u & GST_PDE_BIG_PG_MASK;
     3337                                GCPhys = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc);
    33383338#  if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    33393339                                /* Select the right PDE as we're emulating a 4MB page directory with two 2 MB shadow PDEs.*/
     
    38533853                        }
    38543854# endif
    3855                         GCPhysGst = PdeSrc.u & GST_PDE_BIG_PG_MASK;
     3855                        GCPhysGst = GST_GET_PDE_BIG_PG_GCPHYS(PdeSrc);
    38563856# if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    38573857                        GCPhysGst |= GCPtr & RT_BIT(X86_PAGE_2M_SHIFT);
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r10674 r11525  
    4747#undef GST_PDPT_MASK
    4848#undef GST_PDPE_PG_MASK
     49#undef GST_GET_PDE_BIG_PG_GCPHYS
    4950
    5051#if PGM_GST_TYPE == PGM_TYPE_REAL \
     
    7273# define GST_PDE_PG_MASK            X86_PDE_PG_MASK
    7374# define GST_PDE_BIG_PG_MASK        X86_PDE4M_PG_MASK
     75# define GST_GET_PDE_BIG_PG_GCPHYS(PdeGst)  pgmGstGet4MBPhysPage(&pVM->pgm.s, PdeGst)
    7476# define GST_PD_SHIFT               X86_PD_SHIFT
    7577# define GST_PD_MASK                X86_PD_MASK
     
    9395# define GST_PDE_PG_MASK            X86_PDE_PAE_PG_MASK_FULL
    9496# define GST_PDE_BIG_PG_MASK        X86_PDE2M_PAE_PG_MASK
     97# define GST_GET_PDE_BIG_PG_GCPHYS(PdeGst)  (PdeGst.u & GST_PDE_BIG_PG_MASK)
    9598# define GST_PD_SHIFT               X86_PD_PAE_SHIFT
    9699# define GST_PD_MASK                X86_PD_PAE_MASK
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r9836 r11525  
    10021002                if ((fFlags & X86_CR4_PSE) && Pde.b.u1Size)
    10031003                {   /* (big page) */
    1004                     rc = PGMPhysGCPhys2HCPtr(pVM, (Pde.u & X86_PDE4M_PG_MASK) | ((RTGCUINTPTR)GCPtr & X86_PAGE_4M_OFFSET_MASK), 1 /* we always stay within one page */, pHCPtr);
     1004                    rc = PGMPhysGCPhys2HCPtr(pVM, pgmGstGet4MBPhysPage(&pVM->pgm.s, Pde) | ((RTGCUINTPTR)GCPtr & X86_PAGE_4M_OFFSET_MASK), 1 /* we always stay within one page */, pHCPtr);
    10051005                }
    10061006                else
Note: See TracChangeset for help on using the changeset viewer.

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