VirtualBox

Changeset 9606 in vbox


Ignore:
Timestamp:
Jun 11, 2008 12:25:36 PM (17 years ago)
Author:
vboxsync
Message:

X86_CR4_PSE changes for long mode (bit is ignored there)

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

Legend:

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

    r9597 r9606  
    23832383/** @todo fix this! Convert the PGMR3DumpHierarchyHC functions to do guest stuff. */
    23842384    /* Big pages supported? */
    2385     const bool  fPSE = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     2385    bool fPSE;
     2386
     2387    if (CPUMGetGuestMode(pVM) == CPUMMODE_LONG)
     2388        fPSE = true;
     2389    else
     2390        fPSE = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     2391
    23862392    /* Global pages supported? */
    23872393    const bool  fPGE = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PGE);
     
    32563262        return VERR_INVALID_PARAMETER;
    32573263    }
     3264    bool fBigPagesSupported;
     3265
     3266    if (CPUMGetGuestMode(pVM) == CPUMMODE_LONG)
     3267        fBigPagesSupported = true;
     3268    else
     3269        fBigPagesSupported = !!(cr4 & X86_CR4_PSE);
     3270
    32583271    int rc = VINF_SUCCESS;
    32593272    for (unsigned i = 0; i < ELEMENTS(pPD->a); i++)
     
    32623275        if (Pde.n.u1Present)
    32633276        {
    3264             if ((cr4 & X86_CR4_PSE) && Pde.b.u1Size)
     3277            if (fBigPagesSupported && Pde.b.u1Size)
    32653278                pHlp->pfnPrintf(pHlp,
    32663279                                fLongMode       /*P R  S  A  D  G  WT CD AT NX 4M a p ?  */
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r9589 r9606  
    304304
    305305# if PGM_WITH_PAGING(PGM_GST_TYPE)
    306         uint32_t    cr4 = CPUMGetGuestCR4(pVM);
     306#  if PGM_GST_TYPE == PGM_TYPE_AMD64
     307        bool fBigPagesSupported = true;
     308#  else
     309        bool fBigPagesSupported = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     310#  endif
    307311        if (    PdeSrc.b.u1Size
    308             &&  (cr4 & X86_CR4_PSE))
     312            &&  fBigPagesSupported)
    309313            GCPhys = (PdeSrc.u & GST_PDE_BIG_PG_MASK)
    310314                    | ((RTGCPHYS)pvFault & (GST_BIG_PAGE_OFFSET_MASK ^ PAGE_OFFSET_MASK));
     
    925929
    926930    const uint32_t  cr4         = CPUMGetGuestCR4(pVM);
     931# if PGM_GST_TYPE == PGM_TYPE_AMD64
     932    const bool      fIsBigPage  = PdeSrc.b.u1Size;
     933# else
    927934    const bool      fIsBigPage  = PdeSrc.b.u1Size && (cr4 & X86_CR4_PSE);
     935# endif
    928936
    929937# ifdef IN_RING3
     
    14631471     * Check that the page is present and that the shadow PDE isn't out of sync.
    14641472     */
     1473# if PGM_GST_TYPE == PGM_TYPE_AMD64
     1474    const bool      fBigPage = PdeSrc.b.u1Size;
     1475# else
    14651476    const bool      fBigPage = PdeSrc.b.u1Size && (CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     1477# endif
    14661478    RTGCPHYS        GCPhys;
    14671479    if (!fBigPage)
     
    18001812    bool fUserLevelFault    = !!(uErr & X86_TRAP_PF_US);
    18011813    bool fWriteFault        = !!(uErr & X86_TRAP_PF_RW);
     1814# if PGM_GST_TYPE == PGM_TYPE_AMD64
     1815    bool fBigPagesSupported = true;
     1816# else
    18021817    bool fBigPagesSupported = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     1818# endif
    18031819# if PGM_WITH_NX(PGM_GST_TYPE)
    18041820    bool fNoExecuteBitValid = !!(CPUMGetGuestEFER(pVM) & MSR_K6_EFER_NXE);
     
    21892205         */
    21902206        PSHWPT          pPTDst;
     2207# if PGM_GST_TYPE == PGM_TYPE_AMD64
     2208        const bool      fPageTable = !PdeSrc.b.u1Size;
     2209# else
    21912210        const bool      fPageTable = !PdeSrc.b.u1Size || !(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     2211# endif
    21922212        PPGMPOOLPAGE    pShwPage;
    21932213        RTGCPHYS        GCPhys;
     
    27882808DECLINLINE(PGMPOOLKIND) PGM_BTH_NAME(CalcPageKind)(const GSTPDE *pPdeSrc, uint32_t cr4)
    27892809{
     2810#  if PMG_GST_TYPE == PGM_TYPE_AMD64
     2811    if (!pPdeSrc->n.u1Size)
     2812#  else
    27902813    if (!pPdeSrc->n.u1Size || !(cr4 & X86_CR4_PSE))
     2814#  endif
    27912815        return BTH_PGMPOOLKIND_PT_FOR_PT;
    27922816    //switch (pPdeSrc->u & (X86_PDE4M_RW | X86_PDE4M_US /*| X86_PDE4M_PAE_NX*/))
     
    28792903
    28802904# if PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
     2905#  if PGM_GST_TYPE == PGM_TYPE_AMD64
     2906    bool fBigPagesSupported = true;
     2907#  else
     2908    bool fBigPagesSupported = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     2909#  endif
     2910
    28812911    /*
    28822912     * Get page directory addresses.
     
    30993129                            RTGCPHYS     GCPhys;
    31003130                            if (    !PdeSrc.b.u1Size
    3101                                 ||  !(cr4 & X86_CR4_PSE))
     3131                                ||  !fBigPagesSupported)
    31023132                            {
    31033133                                GCPhys = PdeSrc.u & GST_PDE_PG_MASK;
     
    31233153#  ifdef PGM_SKIP_GLOBAL_PAGEDIRS_ON_NONGLOBAL_FLUSH
    31243154                                            || (   (PdeSrc.u & (X86_PDE4M_PS | X86_PDE4M_G)) == (X86_PDE4M_PS | X86_PDE4M_G)
     3155#   if PGM_GST_TYPE == PGM_TYPE_AMD64
     3156                                                && (cr4 & X86_CR4_PGE)) /* global 2/4MB page. */
     3157#   else
    31253158                                                && (cr4 & (X86_CR4_PGE | X86_CR4_PSE)) == (X86_CR4_PGE | X86_CR4_PSE)) /* global 2/4MB page. */
     3159#   endif
    31263160                                            || (  !pShwPage->fSeenNonGlobal
    31273161                                                && (cr4 & X86_CR4_PGE))
     
    31313165                                    )
    31323166                                &&  (   (PdeSrc.u & (X86_PDE_US | X86_PDE_RW)) == (PdeDst.u & (X86_PDE_US | X86_PDE_RW))
    3133                                     || (   (cr4 & X86_CR4_PSE)
     3167                                    || (   fBigPagesSupported
    31343168                                        &&     ((PdeSrc.u & (X86_PDE_US | X86_PDE4M_PS | X86_PDE4M_D)) | PGM_PDFLAGS_TRACK_DIRTY)
    31353169                                            ==  ((PdeDst.u & (X86_PDE_US | X86_PDE_RW | PGM_PDFLAGS_TRACK_DIRTY)) | X86_PDE4M_PS))
     
    31403174                                if (   !fGlobal
    31413175                                    && (PdeSrc.u & (X86_PDE4M_PS | X86_PDE4M_G)) == (X86_PDE4M_PS | X86_PDE4M_G)
     3176#   if PGM_GST_TYPE == PGM_TYPE_AMD64
     3177                                    && (cr4 & X86_CR4_PGE)) /* global 2/4MB page. */
     3178#   else
    31423179                                    && (cr4 & (X86_CR4_PGE | X86_CR4_PSE)) == (X86_CR4_PGE | X86_CR4_PSE))
     3180#   endif
    31433181                                    MY_STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,SyncCR3DstSkippedGlobalPD));
    31443182                                else if (!fGlobal && !pShwPage->fSeenNonGlobal && (cr4 & X86_CR4_PGE))
     
    33203358    || PGM_GST_TYPE == PGM_TYPE_PAE
    33213359
     3360#  if PGM_GST_TYPE == PGM_TYPE_AMD64
     3361    bool        fBigPagesSupported = true;
     3362#  else
     3363    bool        fBigPagesSupported = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
     3364#  endif
    33223365    PPGM        pPGM = &pVM->pgm.s;
    33233366    RTGCPHYS    GCPhysGst;              /* page address derived from the guest page tables. */
     
    34613504
    34623505            if (    !PdeSrc.b.u1Size
    3463                 ||  !(cr4 & X86_CR4_PSE))
     3506                ||  !fBigPagesSupported)
    34643507            {
    34653508                GCPhysGst = PdeSrc.u & GST_PDE_PG_MASK;
     
    34863529
    34873530            if (    pPoolPage->enmKind
    3488                 !=  (!PdeSrc.b.u1Size || !(cr4 & X86_CR4_PSE) ? BTH_PGMPOOLKIND_PT_FOR_PT : BTH_PGMPOOLKIND_PT_FOR_BIG))
     3531                !=  (!PdeSrc.b.u1Size || !fBigPagesSupported ? BTH_PGMPOOLKIND_PT_FOR_PT : BTH_PGMPOOLKIND_PT_FOR_BIG))
    34893532            {
    34903533                AssertMsgFailed(("Invalid shadow page table kind %d at %VGv! PdeSrc=%#RX64\n",
     
    35113554
    35123555            if (    !PdeSrc.b.u1Size
    3513                 ||  !(cr4 & X86_CR4_PSE))
     3556                ||  !fBigPagesSupported)
    35143557            {
    35153558                /*
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r9575 r9606  
    194194
    195195    if (    !Pde.b.u1Size
    196         ||  !(CPUMGetGuestCR4(pVM) & X86_CR4_PSE))
     196# if PGM_GST_TYPE != PGM_TYPE_AMD64
     197        ||  !(CPUMGetGuestCR4(pVM) & X86_CR4_PSE)
     198# endif
     199        )
    197200    {
    198201        PGSTPT pPT;
     
    276279         * Get the PD entry.
    277280         */
    278 #if PGM_GST_TYPE == PGM_TYPE_32BIT
     281# if PGM_GST_TYPE == PGM_TYPE_32BIT
    279282        PX86PDE pPde = &CTXSUFF(pVM->pgm.s.pGuestPD)->a[GCPtr >> X86_PD_SHIFT];
    280 #elif PGM_GST_TYPE == PGM_TYPE_PAE
     283# elif PGM_GST_TYPE == PGM_TYPE_PAE
    281284        /* pgmGstGetPaePDEPtr will return 0 if the PDPTE is marked as not present
    282285         * All the other bits in the PDPTE are only valid in long mode (r/w, u/s, nx)
     
    286289        if (!pPde)
    287290            return VERR_PAGE_TABLE_NOT_PRESENT;
    288 #elif PGM_GST_TYPE == PGM_TYPE_AMD64
     291# elif PGM_GST_TYPE == PGM_TYPE_AMD64
    289292        /** @todo Setting the r/w, u/s & nx bits might have no effect depending on the pdpte & pml4 values */
    290293        PX86PDEPAE pPde = pgmGstGetLongModePDEPtr(&pVM->pgm.s, GCPtr);
     
    292295        if (!pPde)
    293296            return VERR_PAGE_TABLE_NOT_PRESENT;
    294 #endif
     297# endif
    295298        GSTPDE Pde = *pPde;
    296299        Assert(Pde.n.u1Present);
     
    299302
    300303        if (    !Pde.b.u1Size
    301             ||  !(CPUMGetGuestCR4(pVM) & X86_CR4_PSE))
     304# if PGM_GST_TYPE != PGM_TYPE_AMD64
     305            ||  !(CPUMGetGuestCR4(pVM) & X86_CR4_PSE)
     306# endif
     307            )
    302308        {
    303309            /*
     
    728734        if (Pde.n.u1Present)
    729735        {
    730             if (!Pde.b.u1Size || !(pState->cr4 & X86_CR4_PSE))
     736            if (    !Pde.b.u1Size
     737# if PGM_GST_TYPE != PGM_TYPE_AMD64
     738                ||  !(pState->cr4 & X86_CR4_PSE)
     739# endif
     740                )
    731741            {
    732742                /*
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r9341 r9606  
    988988     * PAE or 32-bit?
    989989     */
     990    Assert(CPUMGetGuestMode(pVM) != CPUMMODE_LONG);
     991
    990992    int rc;
    991993    if (!(fFlags & X86_CR4_PAE))
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