VirtualBox

Changeset 14102 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 11, 2008 5:49:53 PM (16 years ago)
Author:
vboxsync
Message:

#1865: shadow pae, the sixth bit.

File:
1 edited

Legend:

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

    r14101 r14102  
    31863186    Assert(PGMPhysGCPhys2HCPtrAssert(pVM, (RTGCPHYS)(cr3 & GST_CR3_PAGE_MASK), sizeof(*pPDSrc)) == pPDSrc);
    31873187#   endif
    3188 #  endif
     3188#  endif /* PGM_GST_TYPE == PGM_TYPE_32BIT */
    31893189
    31903190    /*
    3191      * Iterate the page directory.
     3191     * Iterate the the CR3 page.
    31923192     */
    31933193    PPGMMAPPING pMapping;
     
    32073207        iPdNoMapping  = ~0U;
    32083208    }
     3209
    32093210#  if PGM_GST_TYPE == PGM_TYPE_PAE
    32103211    for (uint64_t iPdpt = 0; iPdpt < GST_PDPE_ENTRIES; iPdpt++)
     
    32453246#  if PGM_SHW_TYPE == PGM_TYPE_32BIT
    32463247            Assert(&pVM->pgm.s.CTXMID(p,32BitPD)->a[iPD] == pPDEDst);
    3247 #  elif PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    3248             AssertMsg(&pVM->pgm.s.CTXMID(ap,PaePDs)[iPD * 2 / 512]->a[iPD * 2 % 512] == pPDEDst, ("%p vs %p\n", &pVM->pgm.s.CTXMID(ap,PaePDs)[iPD * 2 / 512]->a[iPD * 2 % 512], pPDEDst));
     3248#  elif PGM_SHW_TYPE == PGM_TYPE_PAE
     3249#   ifdef VBOX_STRICT
     3250            RTGCPTR GCPtrStrict = (uint32_t)iPD << GST_PD_SHIFT;
     3251#    if PGM_GST_TYPE == PGM_TYPE_PAE
     3252            GCPtrStrict |= iPdpt << X86_PDPT_SHIFT;
     3253#    endif
     3254            AssertMsg(pgmShwGetPaePDEPtr(&pVM->pgm.s, GCPtrStrict) == pPDEDst, ("%p vs %p (%RGv)\n", pgmShwGetPaePDEPtr(&pVM->pgm.s, GCPtrStrict), pPDEDst, GCPtrStrict));
     3255#   endif /* VBOX_STRICT */
    32493256#  endif
    32503257            GSTPDE PdeSrc = pPDSrc->a[iPD];
     
    32913298                        pMapping = pMapping->pNextR3;
    32923299                    iPdNoMapping = pMapping ? pMapping->GCPtr >> GST_PD_SHIFT : ~0U;
    3293 #   else
     3300#   else  /* !IN_RING3 */
    32943301                    LogFlow(("SyncCR3: detected conflict -> VINF_PGM_SYNC_CR3\n"));
    32953302                    return VINF_PGM_SYNC_CR3;
    3296 #   endif
     3303#   endif /* !IN_RING3 */
    32973304                }
    32983305#  else  /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */
     
    33103317                for (unsigned i = 0, iPdShw = iPD * 2; i < 2; i++, iPdShw++) /* pray that the compiler unrolls this */
    33113318#  elif PGM_GST_TYPE == PGM_TYPE_PAE
    3312                     const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; NOREF(iPdShw);
     3319                const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; NOREF(iPdShw);
    33133320#  else
    33143321                const unsigned iPdShw = iPD; NOREF(iPdShw);
     
    33843391                    else
    33853392                        MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstNotPresent));
     3393
     3394                    /* advance */
    33863395                    pPDEDst++;
    3387                 }
     3396                } /* foreach 2MB PAE PDE in 4MB guest PDE */
    33883397            }
    33893398#  if PGM_GST_TYPE == PGM_TYPE_PAE
     
    33993408                for (unsigned i = 0, iPdShw = iPD * 2; i < 2; i++, iPdShw++) /* pray that the compiler unrolls this */
    34003409#  elif PGM_GST_TYPE == PGM_TYPE_PAE
    3401                     const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES; NOREF(iPdShw);
     3410                const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES;
    34023411#  else
    3403                 const unsigned iPdShw = iPD; NOREF(iPdShw);
     3412                const unsigned iPdShw = iPD;
    34043413#  endif
    34053414                {
     
    34313440                {
    34323441                    /*
    3433                     * Check for conflicts for subsequent pagetables
    3434                     * and advance to the next mapping.
    3435                     */
     3442                     * Check for conflicts for subsequent pagetables
     3443                     * and advance to the next mapping.
     3444                     */
    34363445                    iPdNoMapping = ~0U;
    34373446                    unsigned iPT = cPTs;
     
    34513460
    34523461                            /*
    3453                             * Update iPdNoMapping and pMapping.
    3454                             */
     3462                             * Update iPdNoMapping and pMapping.
     3463                             */
    34553464                            pMapping = pVM->pgm.s.CTX_SUFF(pMappings);
    34563465                            while (pMapping && pMapping->GCPtr < (iPD << GST_PD_SHIFT))
     
    35473556    || PGM_GST_TYPE == PGM_TYPE_AMD64
    35483557
    3549 #  if PGM_GST_TYPE == PGM_TYPE_AMD64
     3558# if PGM_GST_TYPE == PGM_TYPE_AMD64
    35503559    bool            fBigPagesSupported = true;
    3551 #  else
     3560# else
    35523561    bool            fBigPagesSupported = !!(CPUMGetGuestCR4(pVM) & X86_CR4_PSE);
    3553 #  endif
     3562# endif
    35543563    PPGM            pPGM = &pVM->pgm.s;
    35553564    RTGCPHYS        GCPhysGst;              /* page address derived from the guest page tables. */
     
    35823591    AssertMsgReturn((cr3 & GST_CR3_PAGE_MASK) == GCPhys, ("GCPhys=%RGp cr3=%RGp\n", GCPhys, (RTGCPHYS)cr3), false);
    35833592#  endif
    3584 #endif /* !IN_RING0 */
     3593# endif /* !IN_RING0 */
    35853594
    35863595    /*
     
    36743683            PX86PDPE        pPdpeDst;
    36753684            RTGCPHYS        GCPhysPdeSrc;
    3676  if PGM_GST_TYPE == PGM_TYPE_PAE
     3685if PGM_GST_TYPE == PGM_TYPE_PAE
    36773686            X86PDPE         PdpeSrc;
    36783687            PGSTPD          pPDSrc    = pgmGstGetPaePDPtr(&pVM->pgm.s, GCPtr, &iPDSrc, &PdpeSrc);
    36793688            PX86PDPT        pPdptDst  = pgmShwGetPaePDPTPtr(&pVM->pgm.s);
    3680  else
     3689else
    36813690            PX86PML4E       pPml4eSrc;
    36823691            X86PDPE         PdpeSrc;
     
    36933702            }
    36943703            Assert(pPDDst);
    3695  endif
     3704endif
    36963705            Assert(iPDSrc == 0);
    36973706
     
    37393748#  endif
    37403749
    3741 # else
     3750# else  /* PGM_GST_TYPE != PGM_TYPE_AMD64 && PGM_GST_TYPE != PGM_TYPE_PAE */
    37423751        {
    3743 # endif
     3752# endif /* PGM_GST_TYPE != PGM_TYPE_AMD64 && PGM_GST_TYPE != PGM_TYPE_PAE */
    37443753# if PGM_GST_TYPE == PGM_TYPE_32BIT
    37453754            GSTPD const    *pPDSrc = pgmGstGet32bitPDPtr(&pVM->pgm.s);
     
    37473756            PCX86PD         pPDDst = pPGM->CTXMID(p,32BitPD);
    37483757#  endif
    3749 # endif
     3758# endif /* PGM_GST_TYPE == PGM_TYPE_32BIT */
    37503759            /*
    37513760            * Iterate the shadow page directory.
     
    37583767                iPDDst++, GCPtr += cIncrement)
    37593768            {
    3760 #  if PGM_SHW_TYPE == PGM_TYPE_PAE
     3769# if PGM_SHW_TYPE == PGM_TYPE_PAE
    37613770                const SHWPDE PdeDst = *pgmShwGetPaePDEPtr(pPGM, GCPtr);
    3762 #  else
     3771# else
    37633772                const SHWPDE PdeDst = pPDDst->a[iPDDst];
    3764 #  endif
     3773# endif
    37653774                if (PdeDst.u & PGM_PDFLAGS_MAPPING)
    37663775                {
     
    42684277# endif
    42694278
    4270 #endif
     4279#endif /* GST == 32BIT, PAE or AMD64 */
    42714280    return cErrors;
    42724281
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