VirtualBox

儲存庫 vbox 的更動 15228


忽略:
時間撮記:
2008-12-10 上午04:51:43 (16 年 以前)
作者:
vboxsync
訊息:

backed out 40461. (PGMAllBth.h)

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r15227 r15228  
    30543054DECLINLINE(PGMPOOLKIND) PGM_BTH_NAME(CalcPageKind)(const GSTPDE *pPdeSrc, uint32_t cr4)
    30553055{
    3056 #  if PGM_GST_TYPE == PGM_TYPE_AMD64
     3056#  if PMG_GST_TYPE == PGM_TYPE_AMD64
    30573057    if (!pPdeSrc->n.u1Size)
    30583058#  else
     
    31223122#ifdef PGMPOOL_WITH_MONITORING
    31233123    int rc = pgmPoolSyncCR3(pVM);
    3124     if (RT_UNLIKELY(rc != VINF_SUCCESS))
     3124    if (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));
    31663161    PX86PDEPAE  pPDEDst = NULL;
    31673162#   endif
     
    31793174     * Iterate the the CR3 page.
    31803175     */
     3176    PPGMMAPPING pMapping;
     3177    unsigned    iPdNoMapping;
    31813178    const bool  fRawR0Enabled = EMIsRawRing0Enabled(pVM);
    31823179    PPGMPOOL    pPool         = pVM->pgm.s.CTX_SUFF(pPool);
    31833180
    31843181    /* Only check mappings if they are supposed to be put into the shadow page table. */
    3185 #  ifndef PGM_WITHOUT_MAPPINGS
    3186     PPGMMAPPING pMapping;
    3187     unsigned    iPdNoMapping;
    31883182    if (pgmMapAreMappingsEnabled(&pVM->pgm.s))
    31893183    {
     
    31963190        iPdNoMapping  = ~0U;
    31973191    }
    3198 #  else  /* PGM_WITHOUT_MAPPINGS */
    3199     Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
    3200 #  endif /* PGM_WITHOUT_MAPPINGS */
    32013192
    32023193#  if PGM_GST_TYPE == PGM_TYPE_PAE
    32033194    for (uint64_t iPdpt = 0; iPdpt < GST_PDPE_ENTRIES; iPdpt++)
    3204 #  endif /* PGM_GST_TYPE == PGM_TYPE_PAE */
    3205     {
    3206 #  if PGM_GST_TYPE == PGM_TYPE_PAE
     3195    {
    32073196        unsigned        iPDSrc;
    32083197        X86PDPE         PdpeSrc;
     
    32323221            continue;
    32333222        }
    3234 #  endif /* PGM_GST_TYPE == PGM_TYPE_PAE */
    3235 
     3223#  else  /* PGM_GST_TYPE != PGM_TYPE_PAE */
     3224    {
     3225#  endif /* PGM_GST_TYPE != PGM_TYPE_PAE */
    32363226        for (unsigned iPD = 0; iPD < RT_ELEMENTS(pPDSrc->a); iPD++)
    32373227        {
    32383228#  if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    3239             if (RT_UNLIKELY((iPD & 255) == 0)) /* Start of new PD. */
    3240                 pPDEDst = paPDEDst[iPD >> 8];
     3229            if ((iPD & 255) == 0) /* Start of new PD. */
     3230                pPDEDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)iPD << GST_PD_SHIFT);
    32413231#  endif
    32423232#  if PGM_SHW_TYPE == PGM_TYPE_32BIT
    32433233            Assert(pgmShwGet32BitPDEPtr(&pVM->pgm.s, (uint32_t)iPD << SHW_PD_SHIFT) == pPDEDst);
    32443234#  elif PGM_SHW_TYPE == PGM_TYPE_PAE
    3245 #   if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortunately not reliable with PGMR0DynMap and multiple VMs. */
     3235#   if defined(VBOX_STRICT) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) /* Unfortuantely not reliable with PGMR0DynMap and multiple VMs. */
    32463236            RTGCPTR GCPtrStrict = (uint32_t)iPD << GST_PD_SHIFT;
    32473237#    if PGM_GST_TYPE == PGM_TYPE_PAE
     
    32553245                &&  (PdeSrc.n.u1User || fRawR0Enabled))
    32563246            {
    3257 #  ifndef PGM_WITHOUT_MAPPINGS
     3247#  if    (   PGM_GST_TYPE == PGM_TYPE_32BIT \
     3248          || PGM_GST_TYPE == PGM_TYPE_PAE) \
     3249      && !defined(PGM_WITHOUT_MAPPINGS)
     3250
    32583251                /*
    32593252                 * Check for conflicts with GC mappings.
     
    32623255                if (iPD + iPdpt * X86_PG_PAE_ENTRIES == iPdNoMapping)
    32633256#   else
    3264                 if (RT_UNLIKELY(iPD == iPdNoMapping))
     3257                if (iPD == iPdNoMapping)
    32653258#   endif
    32663259                {
     
    32723265                        iPD += cPTs - 1;
    32733266#   if PGM_SHW_TYPE != PGM_GST_TYPE /* SHW==PAE && GST==32BIT */
    3274                         pPDEDst = paPDEDst[(iPD + 1) >> 8];
     3267                        pPDEDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)(iPD + 1) << GST_PD_SHIFT);
    32753268#   else
    32763269                        pPDEDst += cPTs;
     
    33013294#   endif /* !IN_RING3 */
    33023295                }
    3303 #  endif /* !PGM_WITHOUT_MAPPINGS */
     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 */
    33043299
    33053300                /*
     
    33923387                } /* foreach 2MB PAE PDE in 4MB guest PDE */
    33933388            }
    3394 #  ifdef PGM_WITHOUT_MAPPINGS
    3395             else
    3396 #  elif PGM_GST_TYPE == PGM_TYPE_PAE
     3389#  if PGM_GST_TYPE == PGM_TYPE_PAE
    33973390            else if (iPD + iPdpt * X86_PG_PAE_ENTRIES != iPdNoMapping)
    33983391#  else
     
    34043397                 */
    34053398#  if PGM_SHW_TYPE == PGM_TYPE_PAE && PGM_GST_TYPE == PGM_TYPE_32BIT
    3406                 /* first half */
    3407                 if (pPDEDst->n.u1Present)
     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
    34083405                {
    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));
     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++;
    34123413                }
    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 */
    34363414            }
    3437 #  ifndef PGM_WITHOUT_MAPPINGS
    34383415            else
    34393416            {
     3417#  if    (   PGM_GST_TYPE == PGM_TYPE_32BIT \
     3418          || PGM_GST_TYPE == PGM_TYPE_PAE)  \
     3419      && !defined(PGM_WITHOUT_MAPPINGS)
     3420
    34403421                const unsigned cPTs = pMapping->cb >> GST_PD_SHIFT;
    34413422
     
    34773458                            iPdNoMapping = pMapping ? pMapping->GCPtr >> GST_PD_SHIFT : ~0U;
    34783459                            break;
    3479 #   else  /* !IN_RING3 */
     3460#   else
    34803461                            LogFlow(("SyncCR3: detected conflict -> VINF_PGM_SYNC_CR3\n"));
    34813462                            return VINF_PGM_SYNC_CR3;
    3482 #   endif /* !IN_RING3 */
     3463#   endif
    34833464                        }
    34843465                    }
     
    34953476                iPD += cPTs - 1;
    34963477#   if PGM_SHW_TYPE != PGM_GST_TYPE /* SHW==PAE && GST==32BIT */
    3497                 pPDEDst = paPDEDst[(iPD + 1) >> 8];
     3478                pPDEDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, (uint32_t)(iPD + 1) << GST_PD_SHIFT);
    34983479#   else
    34993480                pPDEDst += cPTs;
     
    35023483                AssertCompile(PGM_GST_TYPE == PGM_TYPE_32BIT && PGM_SHW_TYPE == PGM_TYPE_PAE);
    35033484#   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 */
    35043488            }
    3505 #  endif /* !PGM_WITHOUT_MAPPINGS */
    35063489
    35073490        } /* for iPD */
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette