VirtualBox

Changeset 15227 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Dec 10, 2008 4:41:37 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
40641
Message:

PGMAllBth: Fixed typo in CalcKind (harmless), did some predicting and cleanup in SyncCR3 (PAE/32-bit).

File:
1 edited

Legend:

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

    r14868 r15227  
    30543054DECLINLINE(PGMPOOLKIND) PGM_BTH_NAME(CalcPageKind)(const GSTPDE *pPdeSrc, uint32_t cr4)
    30553055{
    3056 #  if PMG_GST_TYPE == PGM_TYPE_AMD64
     3056#  if PGM_GST_TYPE == PGM_TYPE_AMD64
    30573057    if (!pPdeSrc->n.u1Size)
    30583058#  else
     
    31223122#ifdef PGMPOOL_WITH_MONITORING
    31233123    int rc = pgmPoolSyncCR3(pVM);
    3124     if (rc != VINF_SUCCESS)
     3124    if (RT_UNLIKELY(rc != VINF_SUCCESS))
    31253125        return rc;
    31263126#endif
     
    31593159#  else /* PGM_SHW_TYPE == PGM_TYPE_PAE */
    31603160#   if PGM_GST_TYPE == PGM_TYPE_32BIT
     3161    PX86PDEPAE  paPDEDst[4];
     3162    paPDEDst[0] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0x00000000));
     3163    paPDEDst[1] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0x40000000));
     3164    paPDEDst[2] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0x80000000));
     3165    paPDEDst[3] = pgmShwGetPaePDEPtr(&pVM->pgm.s, UINT32_C(0xc0000000));
    31613166    PX86PDEPAE  pPDEDst = NULL;
    31623167#   endif
     
    31743179     * Iterate the the CR3 page.
    31753180     */
     3181    const bool  fRawR0Enabled = EMIsRawRing0Enabled(pVM);
     3182    PPGMPOOL    pPool         = pVM->pgm.s.CTX_SUFF(pPool);
     3183
     3184    /* Only check mappings if they are supposed to be put into the shadow page table. */
     3185#  ifndef PGM_WITHOUT_MAPPINGS
    31763186    PPGMMAPPING pMapping;
    31773187    unsigned    iPdNoMapping;
    3178     const bool  fRawR0Enabled = EMIsRawRing0Enabled(pVM);
    3179     PPGMPOOL    pPool         = pVM->pgm.s.CTX_SUFF(pPool);
    3180 
    3181     /* Only check mappings if they are supposed to be put into the shadow page table. */
    31823188    if (pgmMapAreMappingsEnabled(&pVM->pgm.s))
    31833189    {
     
    31903196        iPdNoMapping  = ~0U;
    31913197    }
     3198#  else  /* PGM_WITHOUT_MAPPINGS */
     3199    Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
     3200#  endif /* PGM_WITHOUT_MAPPINGS */
    31923201
    31933202#  if PGM_GST_TYPE == PGM_TYPE_PAE
    31943203    for (uint64_t iPdpt = 0; iPdpt < GST_PDPE_ENTRIES; iPdpt++)
    3195     {
     3204#  endif /* PGM_GST_TYPE == PGM_TYPE_PAE */
     3205    {
     3206#  if PGM_GST_TYPE == PGM_TYPE_PAE
    31963207        unsigned        iPDSrc;
    31973208        X86PDPE         PdpeSrc;
     
    32213232            continue;
    32223233        }
    3223 #  else  /* PGM_GST_TYPE != PGM_TYPE_PAE */
    3224     {
    3225 #  endif /* PGM_GST_TYPE != PGM_TYPE_PAE */
     3234#  endif /* PGM_GST_TYPE == PGM_TYPE_PAE */
     3235
    32263236        for (unsigned iPD = 0; iPD < RT_ELEMENTS(pPDSrc->a); iPD++)
    32273237        {
    32283238#  if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    3229             if ((iPD & 255) == 0) /* Start of new PD. */
    3230                 pPDEDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)iPD << GST_PD_SHIFT);
     3239            if (RT_UNLIKELY((iPD & 255) == 0)) /* Start of new PD. */
     3240                pPDEDst = paPDEDst[iPD >> 8];
    32313241#  endif
    32323242#  if PGM_SHW_TYPE == PGM_TYPE_32BIT
    32333243            Assert(pgmShwGet32BitPDEPtr(&pVM->pgm.s, (uint32_t)iPD << SHW_PD_SHIFT) == pPDEDst);
    32343244#  elif PGM_SHW_TYPE == PGM_TYPE_PAE
    3235 #   if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortuantely not reliable with PGMR0DynMap and multiple VMs. */
     3245#   if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortunately not reliable with PGMR0DynMap and multiple VMs. */
    32363246            RTGCPTR GCPtrStrict = (uint32_t)iPD << GST_PD_SHIFT;
    32373247#    if PGM_GST_TYPE == PGM_TYPE_PAE
     
    32453255                &&  (PdeSrc.n.u1User || fRawR0Enabled))
    32463256            {
    3247 #  if    (   PGM_GST_TYPE == PGM_TYPE_32BIT \
    3248           || PGM_GST_TYPE == PGM_TYPE_PAE) \
    3249       && !defined(PGM_WITHOUT_MAPPINGS)
    3250 
     3257#  ifndef PGM_WITHOUT_MAPPINGS
    32513258                /*
    32523259                 * Check for conflicts with GC mappings.
     
    32553262                if (iPD + iPdpt * X86_PG_PAE_ENTRIES == iPdNoMapping)
    32563263#   else
    3257                 if (iPD == iPdNoMapping)
     3264                if (RT_UNLIKELY(iPD == iPdNoMapping))
    32583265#   endif
    32593266                {
     
    32653272                        iPD += cPTs - 1;
    32663273#   if PGM_SHW_TYPE != PGM_GST_TYPE /* SHW==PAE && GST==32BIT */
    3267                         pPDEDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)(iPD + 1) << GST_PD_SHIFT);
     3274                        pPDEDst = paPDEDst[(iPD + 1) >> 8];
    32683275#   else
    32693276                        pPDEDst += cPTs;
     
    32943301#   endif /* !IN_RING3 */
    32953302                }
    3296 #  else  /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */
    3297                 Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
    3298 #  endif /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */
     3303#  endif /* !PGM_WITHOUT_MAPPINGS */
    32993304
    33003305                /*
     
    33873392                } /* foreach 2MB PAE PDE in 4MB guest PDE */
    33883393            }
    3389 #  if PGM_GST_TYPE == PGM_TYPE_PAE
     3394#  ifdef PGM_WITHOUT_MAPPINGS
     3395            else
     3396#  elif PGM_GST_TYPE == PGM_TYPE_PAE
    33903397            else if (iPD + iPdpt * X86_PG_PAE_ENTRIES != iPdNoMapping)
    33913398#  else
     
    33973404                 */
    33983405#  if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    3399                 for (unsigned i = 0, iPdShw = iPD * 2; i < 2; i++, iPdShw++) /* pray that the compiler unrolls this */
    3400 #  elif PGM_GST_TYPE == PGM_TYPE_PAE
    3401                 const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES;
    3402 #  else
    3403                 const unsigned iPdShw = iPD;
    3404 #  endif
     3406                /* first half */
     3407                if (pPDEDst->n.u1Present)
    34053408                {
    3406                     if (pPDEDst->n.u1Present)
    3407                     {
    3408                         pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPdShw);
    3409                         pPDEDst->u = 0;
    3410                         MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP));
    3411                     }
    3412                     pPDEDst++;
     3409                    pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPD * 2);
     3410                    pPDEDst->u = 0;
     3411                    MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP));
    34133412                }
     3413                pPDEDst++;
     3414                /* second half */
     3415                if (pPDEDst->n.u1Present)
     3416                {
     3417                    pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPD * 2 + 1);
     3418                    pPDEDst->u = 0;
     3419                    MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP));
     3420                }
     3421                pPDEDst++;
     3422#  else  /* 1:1 */
     3423                if (pPDEDst->n.u1Present)
     3424                {
     3425#   if PGM_GST_TYPE == PGM_TYPE_PAE
     3426                    const unsigned iPdShw = iPD + iPdpt * X86_PG_PAE_ENTRIES;
     3427#   else
     3428                    const unsigned iPdShw = iPD;
     3429#   endif
     3430                    pgmPoolFree(pVM, pPDEDst->u & SHW_PDE_PG_MASK, SHW_POOL_ROOT_IDX, iPdShw);
     3431                    pPDEDst->u = 0;
     3432                    MY_STAM_COUNTER_INC(&pVM->pgm.s.CTX_MID_Z(Stat,SyncCR3DstFreedSrcNP));
     3433                }
     3434                pPDEDst++;
     3435#  endif /* 1:1 */
    34143436            }
     3437#  ifndef PGM_WITHOUT_MAPPINGS
    34153438            else
    34163439            {
    3417 #  if    (   PGM_GST_TYPE == PGM_TYPE_32BIT \
    3418           || PGM_GST_TYPE == PGM_TYPE_PAE)  \
    3419       && !defined(PGM_WITHOUT_MAPPINGS)
    3420 
    34213440                const unsigned cPTs = pMapping->cb >> GST_PD_SHIFT;
    34223441
     
    34583477                            iPdNoMapping = pMapping ? pMapping->GCPtr >> GST_PD_SHIFT : ~0U;
    34593478                            break;
    3460 #   else
     3479#   else  /* !IN_RING3 */
    34613480                            LogFlow(("SyncCR3: detected conflict -> VINF_PGM_SYNC_CR3\n"));
    34623481                            return VINF_PGM_SYNC_CR3;
    3463 #   endif
     3482#   endif /* !IN_RING3 */
    34643483                        }
    34653484                    }
     
    34763495                iPD += cPTs - 1;
    34773496#   if PGM_SHW_TYPE != PGM_GST_TYPE /* SHW==PAE && GST==32BIT */
    3478                 pPDEDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)(iPD + 1) << GST_PD_SHIFT);
     3497                pPDEDst = paPDEDst[(iPD + 1) >> 8];
    34793498#   else
    34803499                pPDEDst += cPTs;
     
    34833502                AssertCompile(PGM_GST_TYPE == PGM_TYPE_32BIT && PGM_SHW_TYPE == PGM_TYPE_PAE);
    34843503#   endif
    3485 #  else  /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */
    3486                 Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
    3487 #  endif /* (PGM_GST_TYPE != PGM_TYPE_32BIT && PGM_GST_TYPE != PGM_TYPE_PAE) || PGM_WITHOUT_MAPPINGS */
    34883504            }
     3505#  endif /* !PGM_WITHOUT_MAPPINGS */
    34893506
    34903507        } /* for iPD */
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