VirtualBox

Ignore:
Timestamp:
Mar 28, 2008 3:07:31 PM (17 years ago)
Author:
vboxsync
Message:

Initial cleanup for PAE

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r7577 r7629  
    246246        else
    247247        {
    248             PVBOXPT pPTSrc;
     248            PX86PT pPTSrc;
    249249#  ifdef IN_GC
    250250            rc = PGMGCDynMapGCPage(pVM, PdeSrc.u & GST_PDE_PG_MASK, (void **)&pPTSrc);
    251251#  else
    252             pPTSrc = (PVBOXPT)MMPhysGCPhys2HCVirt(pVM, PdeSrc.u & GST_PDE_PG_MASK, sizeof(*pPTSrc));
     252            pPTSrc = (PX86PT)MMPhysGCPhys2HCVirt(pVM, PdeSrc.u & GST_PDE_PG_MASK, sizeof(*pPTSrc));
    253253            if (pPTSrc == 0)
    254254                rc = VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
     
    611611                    }
    612612                }
    613 #  endif /* PGM_WITH_PAGING(PGM_GST_TYPE) */
     613#  endif /* PGM_WITH_PAGING(PGM_GST_TYPE) && !defined(IN_RING0) */
    614614                rc = PGM_BTH_NAME(SyncPage)(pVM, PdeSrc, (RTGCUINTPTR)pvFault, PGM_SYNC_NR_PAGES, uErr);
    615615                if (VBOX_SUCCESS(rc))
     
    755755PGM_BTH_DECL(int, InvalidatePage)(PVM pVM, RTGCUINTPTR GCPtrPage)
    756756{
    757 #if PGM_GST_TYPE == PGM_TYPE_32BIT
     757#if    PGM_GST_TYPE == PGM_TYPE_32BIT \
     758    || PGM_GST_TYPE == PGM_TYPE_PAE
    758759
    759760    LogFlow(("InvalidatePage %x\n", GCPtrPage));
     
    785786#  else /* PAE */
    786787    unsigned        iPDSrc;
    787     PX86PD          pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc);
     788    PX86PDPAE       pPDSrc = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtrPage, &iPDSrc);
    788789
    789790    GSTPDE          PdeSrc;;
     
    942943            pPdeDst->u = 0;
    943944            STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePage4MBPages));
    944             DUMP_PDE_BIG("PGMInvalidatePage", iPDSrc, PdeSrc);
    945945            PGM_INVL_BIG_PG(GCPtrPage);
    946946        }
     
    971971# endif
    972972    return VINF_SUCCESS;
    973 
    974 #elif PGM_GST_TYPE == PGM_TYPE_PAE
    975 # if PGM_SHW_TYPE == PGM_TYPE_PAE
    976 //# error not implemented
    977     return VERR_INTERNAL_ERROR;
    978 
    979 # else  /* PGM_SHW_TYPE != PGM_TYPE_AMD64 */
    980 #  error "Guest PAE mode, but not the shadow mode ; 32bit - maybe, but amd64 no."
    981 # endif /* PGM_SHW_TYPE != PGM_TYPE_AMD64 */
    982973
    983974#elif PGM_GST_TYPE == PGM_TYPE_AMD64
     
    11071098 * @remark  Not used for 2/4MB pages!
    11081099 */
    1109 DECLINLINE(void) PGM_BTH_NAME(SyncPageWorker)(PVM pVM, PSHWPTE pPteDst, GSTPDE PdeSrc, VBOXPTE PteSrc, PPGMPOOLPAGE pShwPage, unsigned iPTDst)
     1100DECLINLINE(void) PGM_BTH_NAME(SyncPageWorker)(PVM pVM, PSHWPTE pPteDst, GSTPDE PdeSrc, GSTPTE PteSrc, PPGMPOOLPAGE pShwPage, unsigned iPTDst)
    11101101{
    11111102    if (PteSrc.n.u1Present)
     
    12431234    LogFlow(("SyncPage: GCPtrPage=%VGv cPages=%d uErr=%#x\n", GCPtrPage, cPages, uErr));
    12441235
    1245 #if PGM_GST_TYPE == PGM_TYPE_32BIT
     1236#if    PGM_GST_TYPE == PGM_TYPE_32BIT \
     1237    || PGM_GST_TYPE == PGM_TYPE_PAE
    12461238
    12471239# if PGM_SHW_TYPE != PGM_TYPE_32BIT && PGM_SHW_TYPE != PGM_TYPE_PAE
     
    12941286        &&  (PdeSrc.n.u1User == PdeDst.n.u1User)
    12951287        &&  (PdeSrc.n.u1Write == PdeDst.n.u1Write || !PdeDst.n.u1Write)
     1288# if PGM_GST_TYPE == PGM_TYPE_PAE
     1289        &&  (PdeSrc.n.u1NoExecute == PdeDst.n.u1NoExecute)
     1290# endif
    12961291       )
    12971292    {
     
    13111306                 * 4KB Page - Map the guest page table.
    13121307                 */
    1313                 PVBOXPT pPTSrc;
     1308                PGSTPT pPTSrc;
    13141309                int rc = PGM_GCPHYS_2_PTR(pVM, PdeSrc.u & GST_PDE_PG_MASK, &pPTSrc);
    13151310                if (VBOX_SUCCESS(rc))
     
    13411336                            if (!pPTDst->a[iPTDst].n.u1Present)
    13421337                            {
    1343                                 VBOXPTE PteSrc = pPTSrc->a[offPTSrc + iPTDst];
     1338                                GSTPTE PteSrc = pPTSrc->a[offPTSrc + iPTDst];
    13441339                                RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(GST_PT_MASK << GST_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);
    13451340                                NOREF(GCPtrCurPage);
     
    13731368                    {
    13741369                        const unsigned iPTSrc = (GCPtrPage >> GST_PT_SHIFT) & GST_PT_MASK;
    1375                         VBOXPTE PteSrc = pPTSrc->a[iPTSrc];
     1370                        GSTPTE PteSrc = pPTSrc->a[iPTSrc];
    13761371                        const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    13771372                        PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
     
    15291524            if (!pPTDst->a[iPTDst].n.u1Present)
    15301525            {
    1531                 VBOXPTE PteSrc;
     1526                GSTPTE PteSrc;
    15321527
    15331528                RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(GST_PT_MASK << GST_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);
     
    15561551# endif /* PGM_SYNC_N_PAGES */
    15571552    {
    1558         VBOXPTE PteSrc;
     1553        GSTPTE PteSrc;
    15591554        const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    15601555        RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(GST_PT_MASK << GST_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);
     
    16111606    if (    (uErr & X86_TRAP_PF_RSVD)
    16121607        ||  !pPdeSrc->n.u1Present
    1613 #if PGM_GST_TYPE == PGM_TYPE_PAE
     1608#  if PGM_WITH_NX(PGM_GST_TYPE)
    16141609        ||  ((uErr & X86_TRAP_PF_ID) &&  pPdeSrc->n.u1NoExecute)
    1615 #endif
     1610#  endif
    16161611        ||  ((uErr & X86_TRAP_PF_RW) && !pPdeSrc->n.u1Write)
    16171612        ||  ((uErr & X86_TRAP_PF_US) && !pPdeSrc->n.u1User) )
     
    17011696        const GSTPTE   PteSrc = *pPteSrc;
    17021697        if (    !PteSrc.n.u1Present
    1703 #if PGM_GST_TYPE == PGM_TYPE_PAE
     1698#  if PGM_WITH_NX(PGM_GST_TYPE)
    17041699            ||  ((uErr & X86_TRAP_PF_ID) && !PteSrc.n.u1NoExecute)
    1705 #endif
     1700#  endif
    17061701            ||  ((uErr & X86_TRAP_PF_RW) && !PteSrc.n.u1Write)
    17071702            ||  ((uErr & X86_TRAP_PF_US) && !PteSrc.n.u1User)
     
    18421837    LogFlow(("SyncPT: GCPtrPage=%VGv\n", GCPtrPage));
    18431838
    1844 #if PGM_GST_TYPE == PGM_TYPE_32BIT
     1839#if    PGM_GST_TYPE == PGM_TYPE_32BIT \
     1840    || PGM_GST_TYPE == PGM_TYPE_PAE
    18451841
    18461842# if PGM_SHW_TYPE != PGM_TYPE_32BIT && PGM_SHW_TYPE != PGM_TYPE_PAE
     
    18611857    SHWPDE          PdeDst = *pPdeDst;
    18621858
     1859# if PGM_GST_TYPE == PGM_TYPE_32BIT
    18631860    /*
    18641861     * Check for conflicts.
     
    18691866    {
    18701867        Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
    1871 # ifndef IN_RING3
     1868#  ifndef IN_RING3
    18721869        Log(("SyncPT: Conflict at %VGv\n", GCPtrPage));
    18731870        STAM_PROFILE_STOP(&pVM->pgm.s.CTXMID(Stat,SyncPT), a);
    18741871        return VERR_ADDRESS_CONFLICT;
    1875 # else
     1872#  else
    18761873        PPGMMAPPING pMapping = pgmGetMapping(pVM, (RTGCPTR)GCPtrPage);
    18771874        Assert(pMapping);
     
    18831880        }
    18841881        PdeDst = *pPdeDst;
    1885 # endif
     1882#  endif
    18861883    }
     1884# else /* PGM_GST_TYPE == PGM_TYPE_32BIT */
     1885    /* PAE and AMD64 modes are hardware accelerated only, so there are no mappings. */
     1886    Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
     1887# endif /* PGM_GST_TYPE == PGM_TYPE_32BIT */
    18871888    Assert(!PdeDst.n.u1Present); /* We're only supposed to call SyncPT on PDE!P and conflicts.*/
    18881889
     
    26032604            &&  (PdeSrc.n.u1User || fRawR0Enabled))
    26042605        {
     2606#  if PGM_GST_TYPE == PGM_TYPE_32BIT
    26052607            /*
    26062608             * Check for conflicts with GC mappings.
     
    26192621                }
    26202622
    2621 #ifdef IN_RING3
     2623#   ifdef IN_RING3
    26222624                int rc = pgmR3SyncPTResolveConflict(pVM, pMapping, pPDSrc, iPD);
    26232625                if (VBOX_FAILURE(rc))
     
    26312633                    pMapping = pMapping->pNextR3;
    26322634                iPdNoMapping = pMapping ? pMapping->GCPtr >> X86_PD_SHIFT : ~0U;
    2633 #else
     2635#   else
    26342636                LogFlow(("SyncCR3: detected conflict -> VINF_PGM_SYNC_CR3\n"));
    26352637                return VINF_PGM_SYNC_CR3;
    2636 #endif
    2637             }
    2638 
     2638#   endif
     2639            }
     2640#  else /* PGM_GST_TYPE == PGM_TYPE_32BIT */
     2641            /* PAE and AMD64 modes are hardware accelerated only, so there are no mappings. */
     2642            Assert(iPD != iPdNoMapping);
     2643#  endif /* PGM_GST_TYPE == PGM_TYPE_32BIT */
    26392644            /*
    26402645             * Sync page directory entry.
     
    27422747        else
    27432748        {
     2749#  if PGM_GST_TYPE == PGM_TYPE_32BIT
    27442750            Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
    27452751            const unsigned cPTs = pMapping->cPTs;
     
    27632769                        &&  (pPDSrc->a[iPD + iPT].n.u1User || fRawR0Enabled))
    27642770                    {
    2765 ifdef IN_RING3
     2771 ifdef IN_RING3
    27662772                        int rc = pgmR3SyncPTResolveConflict(pVM, pMapping, pPDSrc, iPD);
    27672773                        if (VBOX_FAILURE(rc))
     
    27762782                        iPdNoMapping = pMapping ? pMapping->GCPtr >> X86_PD_SHIFT : ~0U;
    27772783                        break;
    2778 else
     2784 else
    27792785                        LogFlow(("SyncCR3: detected conflict -> VINF_PGM_SYNC_CR3\n"));
    27802786                        return VINF_PGM_SYNC_CR3;
    2781 endif
     2787 endif
    27822788                    }
    27832789                }
     
    27882794                        iPdNoMapping = pMapping->GCPtr >> X86_PD_SHIFT;
    27892795                }
    2790             }
     2796#  else /* PGM_GST_TYPE == PGM_TYPE_32BIT */
     2797                /* PAE and AMD64 modes are hardware accelerated only, so there are no mappings. */
     2798                AssertFailed();
     2799#  endif /* PGM_GST_TYPE == PGM_TYPE_32BIT */
     2800            }
     2801
    27912802            /* advance. */
    27922803            iPD += cPTs - 1;
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