VirtualBox

Changeset 100822 in vbox for trunk


Ignore:
Timestamp:
Aug 8, 2023 9:01:10 AM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158717
Message:

VMM/IEM: Combined two conditions of the alignment checks into one in the inline R/W function template. Statistics. bugref:10369

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

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

    r100820 r100822  
    7575RT_CONCAT3(iemMemFetchData,TMPL_MEM_FN_SUFF,SafeJmp)(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP
    7676{
     77# if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3)
     78    pVCpu->iem.s.DataTlb.cTlbSafeReadPath++;
     79# endif
    7780    TMPL_MEM_TYPE const *puSrc = (TMPL_MEM_TYPE const *)iemMemMapJmp(pVCpu, sizeof(*puSrc), iSegReg, GCPtrMem,
    7881                                                                     IEM_ACCESS_DATA_R, TMPL_MEM_TYPE_ALIGN);
     
    121124                                                          TMPL_MEM_TYPE uValue) IEM_NOEXCEPT_MAY_LONGJMP
    122125{
     126# if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3)
     127    pVCpu->iem.s.DataTlb.cTlbSafeWritePath++;
     128# endif
    123129    Log8(("IEM WR " TMPL_MEM_FMT_DESC " %d|%RGv: " TMPL_MEM_FMT_TYPE "\n", iSegReg, GCPtrMem, uValue));
    124130    TMPL_MEM_TYPE *puDst = (TMPL_MEM_TYPE *)iemMemMapJmp(pVCpu, sizeof(*puDst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W, 0);
  • trunk/src/VBox/VMM/VMMAll/IEMAllMemRWTmplInline.cpp.h

    r100821 r100822  
    3131# error "TMPL_MEM_TYPE is undefined"
    3232#endif
     33#ifndef TMPL_MEM_TYPE_SIZE
     34# error "TMPL_MEM_TYPE_SIZE is undefined"
     35#endif
    3336#ifndef TMPL_MEM_TYPE_ALIGN
    34 # define TMPL_MEM_TYPE_ALIGN     (sizeof(TMPL_MEM_TYPE) - 1)
     37# error "TMPL_MEM_TYPE_ALIGN is undefined"
    3538#endif
    3639#ifndef TMPL_MEM_FN_SUFF
     
    5659RT_CONCAT3(iemMemFetchData,TMPL_MEM_FN_SUFF,Jmp)(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP
    5760{
     61    AssertCompile(sizeof(TMPL_MEM_TYPE) == TMPL_MEM_TYPE_SIZE);
    5862# if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3) && !defined(TMPL_MEM_NO_INLINE)
    5963    /*
     
    6165     */
    6266    RTGCPTR GCPtrEff = iemMemApplySegmentToReadJmp(pVCpu, iSegReg, sizeof(TMPL_MEM_TYPE), GCPtrMem);
     67#  if TMPL_MEM_TYPE_SIZE > 1
    6368    if (RT_LIKELY((GCPtrEff & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE)))
     69#  endif
    6470    {
    6571        /*
     
    8187                STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;});
    8288
     89#  if TMPL_MEM_TYPE_ALIGN != 0
    8390                /*
    8491                 * Alignment check:
     
    8693                /** @todo check priority \#AC vs \#PF */
    8794                AssertCompile(X86_CR0_AM == X86_EFL_AC);
     95                AssertCompile(((3U + 1U) << 16) == X86_CR0_AM);
    8896                if (   !(GCPtrEff & TMPL_MEM_TYPE_ALIGN)
    89                     || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM)
    90                     || IEM_GET_CPL(pVCpu) != 3)
     97                    || !(  (uint32_t)pVCpu->cpum.GstCtx.cr0
     98                         & pVCpu->cpum.GstCtx.eflags.u
     99                         & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */
     100                         & X86_CR0_AM))
     101#  endif
    91102                {
    92103                    /*
     
    99110                    return uRet;
    100111                }
     112#  if TMPL_MEM_TYPE_ALIGN != 0
    101113                Log10Func(("Raising #AC for %RGv\n", GCPtrEff));
    102114                iemRaiseAlignmentCheckExceptionJmp(pVCpu);
     115#  endif
    103116            }
    104117        }
     
    123136     * Check that it doesn't cross a page boundrary.
    124137     */
     138#  if TMPL_MEM_TYPE_SIZE > 1
    125139    if (RT_LIKELY((GCPtrMem & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE)))
     140#  endif
    126141    {
    127142        /*
     
    143158                STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;});
    144159
     160#  if TMPL_MEM_TYPE_ALIGN != 0
    145161                /*
    146162                 * Alignment check:
     
    148164                /** @todo check priority \#AC vs \#PF */
    149165                AssertCompile(X86_CR0_AM == X86_EFL_AC);
     166                AssertCompile(((3U + 1U) << 16) == X86_CR0_AM);
    150167                if (   !(GCPtrMem & TMPL_MEM_TYPE_ALIGN)
    151                     || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM)
    152                     || IEM_GET_CPL(pVCpu) != 3)
     168                    || !(  (uint32_t)pVCpu->cpum.GstCtx.cr0
     169                         & pVCpu->cpum.GstCtx.eflags.u
     170                         & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */
     171                         & X86_CR0_AM))
     172#  endif
    153173                {
    154174                    /*
     
    161181                    return uRet;
    162182                }
     183#  if TMPL_MEM_TYPE_ALIGN != 0
    163184                Log10Func(("Raising #AC for %RGv\n", GCPtrMem));
    164185                iemRaiseAlignmentCheckExceptionJmp(pVCpu);
     186#  endif
    165187            }
    166188        }
     
    190212     */
    191213    RTGCPTR GCPtrEff = iemMemApplySegmentToWriteJmp(pVCpu, iSegReg, sizeof(TMPL_MEM_TYPE), GCPtrMem);
     214#  if TMPL_MEM_TYPE_SIZE > 1
    192215    if (RT_LIKELY((GCPtrEff & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE)))
     216#  endif
    193217    {
    194218        /*
     
    211235                STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;});
    212236
     237#   if TMPL_MEM_TYPE_ALIGN != 0
    213238                /*
    214239                 * Alignment check:
     
    216241                /** @todo check priority \#AC vs \#PF */
    217242                AssertCompile(X86_CR0_AM == X86_EFL_AC);
     243                AssertCompile(((3U + 1U) << 16) == X86_CR0_AM);
    218244                if (   !(GCPtrEff & TMPL_MEM_TYPE_ALIGN)
    219                     || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM)
    220                     || IEM_GET_CPL(pVCpu) != 3)
     245                    || !(  (uint32_t)pVCpu->cpum.GstCtx.cr0
     246                         & pVCpu->cpum.GstCtx.eflags.u
     247                         & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */
     248                         & X86_CR0_AM))
     249#   endif
    221250                {
    222251                    /*
     
    229258                    return;
    230259                }
     260#   if TMPL_MEM_TYPE_ALIGN != 0
    231261                Log10Func(("Raising #AC for %RGv\n", GCPtrEff));
    232262                iemRaiseAlignmentCheckExceptionJmp(pVCpu);
     263#   endif
    233264            }
    234265        }
     
    254285     * Check that it doesn't cross a page boundrary.
    255286     */
     287#  if TMPL_MEM_TYPE_SIZE > 1
    256288    if (RT_LIKELY((GCPtrMem & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE)))
     289#  endif
    257290    {
    258291        /*
     
    275308                STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;});
    276309
     310#   if TMPL_MEM_TYPE_ALIGN != 0
    277311                /*
    278312                 * Alignment check:
     
    280314                /** @todo check priority \#AC vs \#PF */
    281315                AssertCompile(X86_CR0_AM == X86_EFL_AC);
     316                AssertCompile(((3U + 1U) << 16) == X86_CR0_AM);
    282317                if (   !(GCPtrMem & TMPL_MEM_TYPE_ALIGN)
    283                     || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM)
    284                     || IEM_GET_CPL(pVCpu) != 3)
     318                    || !(  (uint32_t)pVCpu->cpum.GstCtx.cr0
     319                         & pVCpu->cpum.GstCtx.eflags.u
     320                         & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */
     321                         & X86_CR0_AM))
     322#   endif
    285323                {
    286324                    /*
     
    293331                    return;
    294332                }
     333#   if TMPL_MEM_TYPE_ALIGN != 0
    295334                Log10Func(("Raising #AC for %RGv\n", GCPtrMem));
    296335                iemRaiseAlignmentCheckExceptionJmp(pVCpu);
     336#   endif
    297337            }
    298338        }
     
    312352#undef TMPL_MEM_TYPE
    313353#undef TMPL_MEM_TYPE_ALIGN
     354#undef TMPL_MEM_TYPE_SIZE
    314355#undef TMPL_MEM_FN_SUFF
    315356#undef TMPL_MEM_FMT_TYPE
    316357#undef TMPL_MEM_FMT_DESC
    317 
     358#undef TMPL_MEM_NO_STORE
     359
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r100803 r100822  
    162162        STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.cTlbMisses,          STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
    163163                        "Data TLB misses",                          "/IEM/CPU%u/DataTlb-Misses", idCpu);
     164        STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.cTlbSafeReadPath,    STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     165                        "Data TLB safe read path",                  "/IEM/CPU%u/DataTlb-SafeReads", idCpu);
     166        STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.cTlbSafeWritePath,   STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     167                        "Data TLB safe write path",                 "/IEM/CPU%u/DataTlb-SafeWrites", idCpu);
    164168        STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.uTlbRevision,        STAMTYPE_X64,       STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,
    165169                        "Data TLB revision",                        "/IEM/CPU%u/DataTlb-Revision", idCpu);
  • trunk/src/VBox/VMM/include/IEMInline.h

    r100820 r100822  
    34133413 */
    34143414#define TMPL_MEM_TYPE       uint8_t
     3415#define TMPL_MEM_TYPE_ALIGN 0
     3416#define TMPL_MEM_TYPE_SIZE  1
    34153417#define TMPL_MEM_FN_SUFF    U8
    34163418#define TMPL_MEM_FMT_TYPE   "%#04x"
     
    34193421
    34203422#define TMPL_MEM_TYPE       uint16_t
     3423#define TMPL_MEM_TYPE_ALIGN 1
     3424#define TMPL_MEM_TYPE_SIZE  2
    34213425#define TMPL_MEM_FN_SUFF    U16
    34223426#define TMPL_MEM_FMT_TYPE   "%#06x"
     
    34253429
    34263430#define TMPL_MEM_TYPE       uint32_t
     3431#define TMPL_MEM_TYPE_ALIGN 3
     3432#define TMPL_MEM_TYPE_SIZE  4
    34273433#define TMPL_MEM_FN_SUFF    U32
    34283434#define TMPL_MEM_FMT_TYPE   "%#010x"
     
    34313437
    34323438#define TMPL_MEM_TYPE       uint64_t
     3439#define TMPL_MEM_TYPE_ALIGN 7
     3440#define TMPL_MEM_TYPE_SIZE  8
    34333441#define TMPL_MEM_FN_SUFF    U64
    34343442#define TMPL_MEM_FMT_TYPE   "%#018RX64"
     
    34383446#define TMPL_MEM_NO_STORE
    34393447#define TMPL_MEM_TYPE       uint64_t
    3440 #define TMPL_MEM_TYPE_ALIGN (sizeof(uint64_t) * 2 - 1)
     3448#define TMPL_MEM_TYPE_ALIGN 15
     3449#define TMPL_MEM_TYPE_SIZE  8
    34413450#define TMPL_MEM_FN_SUFF    U64AlignedU128
    34423451#define TMPL_MEM_FMT_TYPE   "%#018RX64"
    34433452#define TMPL_MEM_FMT_DESC   "qword"
    34443453#include "../VMMAll/IEMAllMemRWTmplInline.cpp.h"
    3445 #undef  TMPL_MEM_NO_STORE
    34463454
    34473455/** @} */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r100820 r100822  
    484484    /** Slow read path.  */
    485485    uint32_t            cTlbSlowReadPath;
     486    /** Safe read path.  */
     487    uint32_t            cTlbSafeReadPath;
     488    /** Safe write path.  */
     489    uint32_t            cTlbSafeWritePath;
    486490#if 0
    487491    /** TLB misses because of tag mismatch. */
     
    499503#endif
    500504    /** Alignment padding. */
    501     uint32_t            au32Padding[3+5];
     505    uint32_t            au32Padding[6];
    502506} IEMTLB;
    503507AssertCompileSizeAlignment(IEMTLB, 64);
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