VirtualBox

Changeset 104881 in vbox for trunk/src/VBox/VMM/include


Ignore:
Timestamp:
Jun 11, 2024 9:05:04 AM (8 months ago)
Author:
vboxsync
Message:

VMM/PGM: Made the apRamRangesTlb users handle stale entries (the TLB may contain such since r163452). bugref:10687 bugref:10093

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/include/PGMInline.h

    r104859 r104881  
    7171DECLINLINE(PPGMRAMRANGE) pgmPhysGetRange(PVMCC pVM, RTGCPHYS GCPhys)
    7272{
    73     PPGMRAMRANGE pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
    74     if (!pRam || GCPhys - pRam->GCPhys >= pRam->cb)
    75         return pgmPhysGetRangeSlow(pVM, GCPhys);
    76     STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
    77     return pRam;
     73    PPGMRAMRANGE const pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     74    if (pRam)
     75    {
     76        RTGCPHYS const GCPhysFirst = pRam->GCPhys;
     77        if (GCPhys - GCPhysFirst < pRam->cb && GCPhys >= GCPhysFirst)
     78        {
     79            STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
     80            return pRam;
     81        }
     82    }
     83    return pgmPhysGetRangeSlow(pVM, GCPhys);
    7884}
    7985
     
    9197DECLINLINE(PPGMRAMRANGE) pgmPhysGetRangeAtOrAbove(PVMCC pVM, RTGCPHYS GCPhys)
    9298{
    93     PPGMRAMRANGE pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
    94     if (   !pRam
    95         || (GCPhys - pRam->GCPhys) >= pRam->cb)
    96         return pgmPhysGetRangeAtOrAboveSlow(pVM, GCPhys);
    97     STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
    98     return pRam;
     99    PPGMRAMRANGE const pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     100    if (pRam)
     101    {
     102        RTGCPHYS const GCPhysFirst = pRam->GCPhys;
     103        if (GCPhys - GCPhysFirst < pRam->cb && GCPhys >= GCPhysFirst)
     104        {
     105            STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
     106            return pRam;
     107        }
     108    }
     109    return pgmPhysGetRangeAtOrAboveSlow(pVM, GCPhys);
    99110}
    100111
     
    111122DECLINLINE(PPGMPAGE) pgmPhysGetPage(PVMCC pVM, RTGCPHYS GCPhys)
    112123{
    113     PPGMRAMRANGE pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
    114     RTGCPHYS off;
    115     if (   pRam
    116         && (off = GCPhys - pRam->GCPhys) < pRam->cb)
    117     {
    118         STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
    119         return &pRam->aPages[off >> GUEST_PAGE_SHIFT];
     124    PPGMRAMRANGE const pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     125    if (pRam)
     126    {
     127        RTGCPHYS const GCPhysFirst = pRam->GCPhys;
     128        RTGCPHYS const off         = GCPhys - GCPhysFirst;
     129        if (off < pRam->cb && GCPhys >= GCPhysFirst)
     130        {
     131            STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
     132            return &pRam->aPages[off >> GUEST_PAGE_SHIFT];
     133        }
    120134    }
    121135    return pgmPhysGetPageSlow(pVM, GCPhys);
     
    138152DECLINLINE(int) pgmPhysGetPageEx(PVMCC pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage)
    139153{
    140     PPGMRAMRANGE pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
    141     RTGCPHYS off;
    142     if (   !pRam
    143         || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
    144         return pgmPhysGetPageExSlow(pVM, GCPhys, ppPage);
    145     *ppPage = &pRam->aPages[off >> GUEST_PAGE_SHIFT];
    146     STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
    147     return VINF_SUCCESS;
     154    PPGMRAMRANGE const pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     155    if (pRam)
     156    {
     157        RTGCPHYS const GCPhysFirst = pRam->GCPhys;
     158        RTGCPHYS const off         = GCPhys - GCPhysFirst;
     159        if (off < pRam->cb && GCPhys >= GCPhysFirst)
     160        {
     161            STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
     162            *ppPage = &pRam->aPages[off >> GUEST_PAGE_SHIFT];
     163            return VINF_SUCCESS;
     164        }
     165    }
     166    return pgmPhysGetPageExSlow(pVM, GCPhys, ppPage);
    148167}
    149168
     
    166185DECLINLINE(int) pgmPhysGetPageWithHintEx(PVMCC pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRamHint)
    167186{
    168     RTGCPHYS off;
    169187    PPGMRAMRANGE pRam = *ppRamHint;
    170     if (    !pRam
    171         ||  RT_UNLIKELY((off = GCPhys - pRam->GCPhys) >= pRam->cb))
     188    RTGCPHYS     GCPhysFirst;
     189    RTGCPHYS     off;
     190    if (   !pRam
     191        || RT_UNLIKELY(   (off = GCPhys - (GCPhysFirst = pRam->GCPhys)) >= pRam->cb
     192                       && GCPhys >= GCPhysFirst) )
    172193    {
    173194        pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
    174195        if (   !pRam
    175             || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
     196            || (off = GCPhys - (GCPhysFirst = pRam->GCPhys)) >= pRam->cb
     197            || GCPhys < GCPhysFirst)
    176198            return pgmPhysGetPageAndRangeExSlow(pVM, GCPhys, ppPage, ppRamHint);
    177199
     
    198220{
    199221    PPGMRAMRANGE pRam = pVM->CTX_EXPR(pgm, pgmr0, pgm).s.apRamRangesTlb[PGM_RAMRANGE_TLB_IDX(GCPhys)];
    200     RTGCPHYS off;
    201     if (   !pRam
    202         || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
    203         return pgmPhysGetPageAndRangeExSlow(pVM, GCPhys, ppPage, ppRam);
    204 
    205     STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
    206     *ppRam = pRam;
    207     *ppPage = &pRam->aPages[off >> GUEST_PAGE_SHIFT];
    208     return VINF_SUCCESS;
     222    if (pRam)
     223    {
     224        RTGCPHYS const GCPhysFirst = pRam->GCPhys;
     225        RTGCPHYS const off         = GCPhys - GCPhysFirst;
     226        if (off < pRam->cb && GCPhys >= GCPhysFirst)
     227        {
     228            STAM_COUNTER_INC(&pVM->pgm.s.Stats.CTX_MID_Z(Stat,RamRangeTlbHits));
     229            *ppRam = pRam;
     230            *ppPage = &pRam->aPages[off >> GUEST_PAGE_SHIFT];
     231            return VINF_SUCCESS;
     232        }
     233    }
     234    return pgmPhysGetPageAndRangeExSlow(pVM, GCPhys, ppPage, ppRam);
    209235}
    210236
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