VirtualBox

Changeset 8454 in vbox


Ignore:
Timestamp:
Apr 29, 2008 11:31:44 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
30316
Message:

Long mode changes

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

Legend:

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

    r8155 r8454  
    15371537    GCPtr += PAGE_SIZE; /* reserved page */
    15381538
    1539     rc = PGMMap(pVM, GCPtr, pVM->pgm.s.HCPhysPaePML4, PAGE_SIZE, 0);
    1540     AssertRCReturn(rc, rc);
    1541     pVM->pgm.s.pGCPaePML4 = GCPtr;
    1542     GCPtr += PAGE_SIZE;
    1543     GCPtr += PAGE_SIZE; /* reserved page */
    1544 
    15451539
    15461540    /*
     
    16001594    pVM->pgm.s.pGstPaePDPTGC += offDelta;
    16011595    pVM->pgm.s.pGCPaePDPT    += offDelta;
    1602     pVM->pgm.s.pGCPaePML4    += offDelta;
    16031596
    16041597    pgmR3ModeDataInit(pVM, true /* resolve GC/R0 symbols */);
  • trunk/src/VBox/VMM/PGMInternal.h

    r8155 r8454  
    19781978     * @{ */
    19791979    /** The Page Map Level 4 table - HC Ptr. */
    1980     GCPTRTYPE(PX86PML4)         pGCPaePML4;
    1981     /** The Page Map Level 4 table - GC Ptr. */
    19821980    R3R0PTRTYPE(PX86PML4)       pHCPaePML4;
    19831981    /** The Physical Address (HC) of the Page Map Level 4 table. */
     
    33193317}
    33203318
     3319#ifndef IN_GC
     3320/**
     3321 * Gets the page directory entry for the specified address.
     3322 *
     3323 * @returns The page directory entry in question.
     3324 * @returns A non-present entry if the page directory is not present or on an invalid page.
     3325 * @param   pPGM        Pointer to the PGM instance data.
     3326 * @param   GCPtr       The address.
     3327 * @param   ppPml4e     Page Map Level-4 Entry (out)
     3328 * @param   pPdpe       Page directory pointer table entry (out)
     3329 */
     3330DECLINLINE(uint64_t) pgmGstGetLongModePDE(PPGM pPGM, RTGCUINTPTR64 GCPtr, PX86PML4E *ppPml4e, PX86PDPE pPdpe)
     3331{
     3332    const unsigned iPml4e = (GCPtr >> X86_PML4_SHIFT) & X86_PML4_MASK;
     3333
     3334    *ppPml4e = &pPGM->pHCPaePML4->a[iPml4e];
     3335    if ((*ppPml4e)->n.u1Present)
     3336    {
     3337        PX86PDPT pPdptTemp;
     3338        int rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), (*ppPml4e)->u & X86_PML4E_PG_MASK, &pPdptTemp);
     3339        if (VBOX_FAILURE(rc))
     3340        {
     3341            AssertFailed();
     3342            return 0ULL;
     3343        }
     3344
     3345        const unsigned iPdPt  = (GCPtr >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;
     3346        *pPdpe = pPdptTemp->a[iPdPt];
     3347        if (pPdpe->n.u1Present)
     3348        {
     3349            PX86PDPAE pPD;
     3350
     3351            rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), pPdpe->u & X86_PDPE_PG_MASK, &pPD);
     3352            if (VBOX_FAILURE(rc))
     3353            {
     3354                AssertFailed();
     3355                return 0ULL;
     3356            }
     3357            const unsigned iPD = (GCPtr >> X86_PD_PAE_SHIFT) & X86_PD_PAE_MASK;
     3358            return pPD->a[iPD].u;
     3359        }
     3360    }
     3361    return 0ULL;
     3362}
     3363
     3364/**
     3365 * Gets the page directory entry for the specified address.
     3366 *
     3367 * @returns The page directory entry in question.
     3368 * @returns A non-present entry if the page directory is not present or on an invalid page.
     3369 * @param   pPGM        Pointer to the PGM instance data.
     3370 * @param   GCPtr       The address.
     3371 */
     3372DECLINLINE(uint64_t) pgmGstGetLongModePDE(PPGM pPGM, RTGCUINTPTR64 GCPtr)
     3373{
     3374    const unsigned iPml4e = (GCPtr >> X86_PML4_SHIFT) & X86_PML4_MASK;
     3375
     3376    if (pPGM->pHCPaePML4->a[iPml4e].n.u1Present)
     3377    {
     3378        PX86PDPT pPdptTemp;
     3379        int rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), pPGM->pHCPaePML4->a[iPml4e].u & X86_PML4E_PG_MASK, &pPdptTemp);
     3380        if (VBOX_FAILURE(rc))
     3381        {
     3382            AssertFailed();
     3383            return 0ULL;
     3384        }
     3385
     3386        const unsigned iPdPt  = (GCPtr >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;
     3387        if (pPdptTemp->a[iPdPt].n.u1Present)
     3388        {
     3389            PX86PDPAE pPD;
     3390
     3391            rc = PGM_GCPHYS_2_PTR(PGM2VM(pPGM), pPdptTemp->a[iPdPt].u & X86_PDPE_PG_MASK, &pPD);
     3392            if (VBOX_FAILURE(rc))
     3393            {
     3394                AssertFailed();
     3395                return 0ULL;
     3396            }
     3397            const unsigned iPD = (GCPtr >> X86_PD_PAE_SHIFT) & X86_PD_PAE_MASK;
     3398            return pPD->a[iPD].u;
     3399        }
     3400    }
     3401    return 0ULL;
     3402}
     3403#endif /* !IN_GC */
    33213404
    33223405/**
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r8160 r8454  
    154154    return VINF_SUCCESS;
    155155
    156 #elif PGM_GST_TYPE == PGM_TYPE_AMD64
    157     /* later */
    158     /* check level 3 & 4 bits as well (r/w, u/s, nxe) */
    159     AssertFailed();
    160     return VERR_NOT_IMPLEMENTED;
    161 
    162 #elif PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_PAE
     156#elif PGM_GST_TYPE == PGM_TYPE_32BIT || PGM_GST_TYPE == PGM_TYPE_PAE || PGM_GST_TYPE == PGM_TYPE_AMD64
    163157
    164158    /*
     
    167161# if PGM_GST_TYPE == PGM_TYPE_32BIT
    168162    const X86PDE Pde = CTXSUFF(pVM->pgm.s.pGuestPD)->a[GCPtr >> X86_PD_SHIFT];
    169 # else /* PAE */
     163#elif PGM_GST_TYPE == PGM_TYPE_PAE
    170164    X86PDEPAE    Pde;
    171165    bool         fNoExecuteBitValid = !!(CPUMGetGuestEFER(pVM) & MSR_K6_EFER_NXE);
     
    175169     */
    176170    Pde.u = pgmGstGetPaePDE(&pVM->pgm.s, GCPtr);
     171#elif PGM_GST_TYPE == PGM_TYPE_AMD64
     172    PX86PML4E    pPml4e;
     173    X86PDPE      Pdpe;
     174    X86PDEPAE    Pde;
     175    bool         fNoExecuteBitValid = !!(CPUMGetGuestEFER(pVM) & MSR_K6_EFER_NXE);
     176
     177    Pde.u = pgmGstGetLongModePDE(&pVM->pgm.s, GCPtr, &pPml4e, &Pdpe);
     178    Assert(pPml4e);
     179    if (!(pPml4e->n.u1Present & Pdpe.n.u1Present))
     180        return VERR_PAGE_TABLE_NOT_PRESENT;
     181
     182    /* Merge accessed, write, user and no-execute bits into the PDE. */
     183    Pde.n.u1Accessed  &= pPml4e->n.u1Accessed & Pdpe.n.u1Accessed;
     184    Pde.n.u1Write     &= pPml4e->n.u1Write & Pdpe.n.u1Write;
     185    Pde.n.u1User      &= pPml4e->n.u1User & Pdpe.n.u1User;
     186    Pde.n.u1NoExecute &= pPml4e->n.u1NoExecute& Pdpe.n.u1NoExecute;
    177187# endif
    178188
     
    358368 || PGM_GST_TYPE == PGM_TYPE_AMD64
    359369
    360 #if PGM_GST_TYPE == PGM_TYPE_AMD64
    361     /* later */
    362     AssertFailed();
    363     return VERR_NOT_IMPLEMENTED;
    364 #endif
    365 
    366370# if PGM_GST_TYPE == PGM_TYPE_32BIT
    367371    X86PDE    Pde;
    368372    Pde   = CTXSUFF(pVM->pgm.s.pGuestPD)->a[GCPtr >> GST_PD_SHIFT];
    369 # else
     373# elif PGM_GST_TYPE == PGM_TYPE_PAE
    370374    X86PDEPAE Pde;
    371375    Pde.u = pgmGstGetPaePDE(&pVM->pgm.s, GCPtr);
     376# elif PGM_GST_TYPE == PGM_TYPE_AMD64
     377    X86PDEPAE    Pde;
     378    Pde.u = pgmGstGetLongModePDE(&pVM->pgm.s, GCPtr);
    372379# endif
    373380
     
    720727#if PGM_GST_TYPE == PGM_TYPE_32BIT
    721728        X86PDE      Pde = pPDSrc->a[GCPtr >> X86_PD_SHIFT];
    722 #else
     729#elif PGM_GST_TYPE == PGM_TYPE_PAE
    723730        X86PDEPAE   Pde;
    724731        Pde.u = pgmGstGetPaePDE(&pState->pVM->pgm.s, GCPtr);
     732#elif PGM_GST_TYPE == PGM_TYPE_AMD64
     733        X86PDEPAE    Pde;
     734        Pde.u = pgmGstGetLongModePDE(&pVM->pgm.s, GCPtr);
    725735#endif
    726736        if (Pde.n.u1Present)
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r8234 r8454  
    122122        case PGMPOOL_IDX_PDPT:
    123123            return pVM->pgm.s.pGCPaePDPT;
    124         case PGMPOOL_IDX_PML4:
    125             return pVM->pgm.s.pGCPaePML4;
    126124        default:
    127125            AssertReleaseMsgFailed(("Invalid index %d\n", pPage->idx));
  • trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp

    r8155 r8454  
    394394    GEN_CHECK_OFF(PGM, HCPhysPaePDPT);
    395395    GEN_CHECK_OFF(PGM, pHCPaePML4);
    396     GEN_CHECK_OFF(PGM, pGCPaePML4);
    397396    GEN_CHECK_OFF(PGM, HCPhysPaePML4);
    398397    GEN_CHECK_OFF(PGM, pfnR3ShwRelocate);
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