VirtualBox

Changeset 42777 in vbox


Ignore:
Timestamp:
Aug 11, 2012 8:23:48 PM (12 years ago)
Author:
vboxsync
Message:

IEM and EM: debugging/hacking.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/Makefile.kmk

    r42669 r42777  
    5858# Special IEM debug mode which compares the result with REM.
    5959ifdef IEM_VERIFICATION_MODE
    60  VMM_COMMON_DEFS += IEM_VERIFICATION_MODE
     60 VMM_COMMON_DEFS += IEM_VERIFICATION_MODE IEM_VERIFICATION_MODE_FULL
    6161endif
    6262
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r42707 r42777  
    4747#include <iprt/string.h>
    4848
     49#ifndef IN_RC
     50#undef VBOX_WITH_IEM
     51#endif
    4952#ifdef VBOX_WITH_IEM
    50 # define VBOX_COMPARE_IEM_AND_EM /* debugging... */
    51 # define VBOX_SAME_AS_EM
     53//# define VBOX_COMPARE_IEM_AND_EM /* debugging... */
     54//# define VBOX_SAME_AS_EM
     55//# define VBOX_COMPARE_IEM_FIRST
    5256#endif
    5357
     
    8488*******************************************************************************/
    8589#ifdef VBOX_COMPARE_IEM_AND_EM
     90static const uint32_t g_fInterestingFFs = VMCPU_FF_TO_R3
     91    | VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_CSAM_SCAN_PAGE | VMCPU_FF_INHIBIT_INTERRUPTS
     92    | VMCPU_FF_SELM_SYNC_LDT | VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_TSS | VMCPU_FF_TRPM_SYNC_IDT
     93    | VMCPU_FF_TLB_FLUSH | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL;
     94static uint32_t g_fIncomingFFs;
    8695static CPUMCTX g_IncomingCtx;
    87 static CPUMCTX g_EmOutgoingCtx;
    88 static bool g_fIgnoreRaxRdx = false;
     96static bool    g_fIgnoreRaxRdx = false;
     97
     98static uint32_t g_fEmFFs;
     99static CPUMCTX g_EmCtx;
     100static uint8_t g_abEmWrote[256];
     101static size_t  g_cbEmWrote;
     102
     103static uint32_t g_fIemFFs;
     104static CPUMCTX g_IemCtx;
     105extern uint8_t g_abIemWrote[256];
     106extern size_t  g_cbIemWrote;
    89107#endif
    90108
     
    441459
    442460#ifdef VBOX_COMPARE_IEM_AND_EM
    443 static void emCompareWithIem(PVMCPU pVCpu, PCCPUMCTX pIemCtx, VBOXSTRICTRC rcEm, VBOXSTRICTRC rcIem,
     461static void emCompareWithIem(PVMCPU pVCpu, PCCPUMCTX pEmCtx, PCCPUMCTX pIemCtx,
     462                             VBOXSTRICTRC rcEm, VBOXSTRICTRC rcIem,
    444463                             uint32_t cbEm, uint32_t cbIem)
    445464{
    446465    /* Quick compare. */
    447     PCCPUMCTX pEmCtx = &g_EmOutgoingCtx;
    448466    if (   rcEm == rcIem
    449467        && cbEm == cbIem
    450         && memcmp(pIemCtx, pEmCtx, sizeof(*pIemCtx)) == 0)
     468        && g_cbEmWrote == g_cbIemWrote
     469        && memcmp(g_abIemWrote, g_abEmWrote, g_cbIemWrote) == 0
     470        && memcmp(pIemCtx, pEmCtx, sizeof(*pIemCtx)) == 0
     471        && (g_fEmFFs & g_fInterestingFFs) == (g_fIemFFs & g_fInterestingFFs)
     472       )
    451473        return;
    452474
    453475    /* Report exact differences. */
    454     RTLogPrintf("!! EM and IEM differs at %04x:%08RGv !!\n", g_IncomingCtx.cs.Sel, g_IncomingCtx.rip);
     476    RTLogPrintf("! EM and IEM differs at %04x:%08RGv !\n", g_IncomingCtx.cs.Sel, g_IncomingCtx.rip);
    455477    if (rcEm != rcIem)
    456478        RTLogPrintf(" * rcIem=%Rrc rcEm=%Rrc\n", VBOXSTRICTRC_VAL(rcIem), VBOXSTRICTRC_VAL(rcEm));
     
    458480        RTLogPrintf(" * cbIem=%#x cbEm=%#x\n", cbIem, cbEm);
    459481
    460     if (rcEm == rcIem)
    461     {
     482    if (RT_SUCCESS(rcEm) && RT_SUCCESS(rcIem))
     483    {
     484        if (g_cbIemWrote != g_cbEmWrote)
     485            RTLogPrintf("!! g_cbIemWrote=%#x g_cbEmWrote=%#x\n", g_cbIemWrote, g_cbEmWrote);
     486        else if (memcmp(g_abIemWrote, g_abEmWrote, g_cbIemWrote))
     487        {
     488            RTLogPrintf("!! IemWrote %.*Rhxs\n", RT_MIN(RT_MAX(1, g_cbIemWrote), 64), g_abIemWrote);
     489            RTLogPrintf("!! EemWrote  %.*Rhxs\n", RT_MIN(RT_MAX(1, g_cbIemWrote), 64), g_abIemWrote);
     490        }
     491
     492        if ((g_fEmFFs & g_fInterestingFFs) != (g_fIemFFs & g_fInterestingFFs))
     493            RTLogPrintf("!! g_fIemFFs=%#x  g_fEmFFs=%#x (diff=%#x)\n", g_fIemFFs & g_fInterestingFFs,
     494                        g_fEmFFs & g_fInterestingFFs, (g_fIemFFs ^ g_fEmFFs) & g_fInterestingFFs);
     495
    462496#  define CHECK_FIELD(a_Field) \
    463497        do \
     
    467501                switch (sizeof(pEmCtx->a_Field)) \
    468502                { \
    469                     case 1: RTLogPrintf("  %8s differs - iem=%02x - em=%02x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
    470                     case 2: RTLogPrintf("  %8s differs - iem=%04x - em=%04x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
    471                     case 4: RTLogPrintf("  %8s differs - iem=%08x - em=%08x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
    472                     case 8: RTLogPrintf("  %8s differs - iem=%016llx - em=%016llx\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
    473                     default: RTLogPrintf("  %8s differs\n", #a_Field); break; \
     503                    case 1: RTLogPrintf("!! %8s differs - iem=%02x - em=%02x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
     504                    case 2: RTLogPrintf("!! %8s differs - iem=%04x - em=%04x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
     505                    case 4: RTLogPrintf("!! %8s differs - iem=%08x - em=%08x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
     506                    case 8: RTLogPrintf("!! %8s differs - iem=%016llx - em=%016llx\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); break; \
     507                    default: RTLogPrintf("!!  %8s differs\n", #a_Field); break; \
    474508                } \
    475509                cDiffs++; \
     
    482516            if (pEmCtx->a_Field != pIemCtx->a_Field) \
    483517            { \
    484                 RTLogPrintf("  %8s differs - iem=%02x - em=%02x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); \
     518                RTLogPrintf("!! %8s differs - iem=%02x - em=%02x\n", #a_Field, pIemCtx->a_Field, pEmCtx->a_Field); \
    485519                cDiffs++; \
    486520            } \
     
    544578        if (pEmCtx->rflags.u != pIemCtx->rflags.u)
    545579        {
    546             RTLogPrintf("  rflags differs - iem=%08llx em=%08llx\n", pIemCtx->rflags.u, pEmCtx->rflags.u);
     580            RTLogPrintf("!! rflags differs - iem=%08llx em=%08llx\n", pIemCtx->rflags.u, pEmCtx->rflags.u);
    547581            CHECK_BIT_FIELD(rflags.Bits.u1CF);
    548582            CHECK_BIT_FIELD(rflags.Bits.u1Reserved0);
     
    652686    PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu);
    653687    g_IncomingCtx = *pCtx;
     688    g_fIncomingFFs = pVCpu->fLocalForcedActions;
     689    g_cbEmWrote = g_cbIemWrote = 0;
     690
     691#  ifdef VBOX_COMPARE_IEM_FIRST
     692# error
     693    /* IEM */
     694    VBOXSTRICTRC rcIem = IEMExecOneBypassEx(pVCpu, pRegFrame, NULL);
     695    if (RT_UNLIKELY(   rcIem == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     696                    || rcIem == VERR_IEM_INSTR_NOT_IMPLEMENTED))
     697        rcIem = VERR_EM_INTERPRETER;
     698    g_IemCtx = *pCtx;
     699    g_fIemFFs = pVCpu->fLocalForcedActions;
     700    pVCpu->fLocalForcedActions = (pVCpu->fLocalForcedActions & ~g_fInterestingFFs) | (g_fIncomingFFs & g_fInterestingFFs);
     701    *pCtx = g_IncomingCtx;
     702#  endif
    654703
    655704    /* EM */
     
    682731    }
    683732#  endif
    684 
    685     g_EmOutgoingCtx = *pCtx;
     733    g_EmCtx = *pCtx;
     734    g_fEmFFs = pVCpu->fLocalForcedActions;
     735    VBOXSTRICTRC rc = rcEm;
     736
     737#  ifdef VBOX_COMPARE_IEM_LAST
     738# error
     739    /* IEM */
     740    pVCpu->fLocalForcedActions = (pVCpu->fLocalForcedActions & ~g_fInterestingFFs) | (g_fIncomingFFs & g_fInterestingFFs);
    686741    *pCtx = g_IncomingCtx;
    687 
    688     /* IEM */
    689 # endif /* VBOX_COMPARE_IEM_AND_EM */
     742    VBOXSTRICTRC rcIem = IEMExecOneBypassEx(pVCpu, pRegFrame, NULL);
     743    if (RT_UNLIKELY(   rcIem == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     744                    || rcIem == VERR_IEM_INSTR_NOT_IMPLEMENTED))
     745        rcIem = VERR_EM_INTERPRETER;
     746    g_IemCtx = *pCtx;
     747    g_fIemFFs = pVCpu->fLocalForcedActions;
     748    rc = rcIem;
     749#  endif
     750
     751#  if defined(VBOX_COMPARE_IEM_LAST) || defined(VBOX_COMPARE_IEM_FIRST)
     752# error
     753    emCompareWithIem(pVCpu, &g_EmCtx, &g_IemCtx, rcEm, rcIem, 0, 0);
     754#  endif
     755
     756# else
    690757    VBOXSTRICTRC rc = IEMExecOneBypassEx(pVCpu, pRegFrame, NULL);
    691758    if (RT_UNLIKELY(   rc == VERR_IEM_ASPECT_NOT_IMPLEMENTED
    692759                    || rc == VERR_IEM_INSTR_NOT_IMPLEMENTED))
    693760        rc = VERR_EM_INTERPRETER;
    694 
    695 # ifdef VBOX_COMPARE_IEM_AND_EM
    696     emCompareWithIem(pVCpu, pCtx, rcEm, rc, 0, 0);
    697761# endif
    698762    if (rc != VINF_SUCCESS)
     
    754818    PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu);
    755819    g_IncomingCtx = *pCtx;
     820    g_fIncomingFFs = pVCpu->fLocalForcedActions;
     821    g_cbEmWrote = g_cbIemWrote = 0;
     822
     823#  ifdef VBOX_COMPARE_IEM_FIRST
     824    /* IEM */
     825    uint32_t cbIemWritten = 0;
     826    VBOXSTRICTRC rcIem = IEMExecOneBypassEx(pVCpu, pRegFrame, &cbIemWritten);
     827    if (RT_UNLIKELY(   rcIem == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     828                    || rcIem == VERR_IEM_INSTR_NOT_IMPLEMENTED))
     829        rcIem = VERR_EM_INTERPRETER;
     830    g_IemCtx = *pCtx;
     831    g_fIemFFs = pVCpu->fLocalForcedActions;
     832    pVCpu->fLocalForcedActions = (pVCpu->fLocalForcedActions & ~g_fInterestingFFs) | (g_fIncomingFFs & g_fInterestingFFs);
     833    *pCtx = g_IncomingCtx;
     834#  endif
    756835
    757836    /* EM */
     
    785864    }
    786865#  endif
    787 
    788     g_EmOutgoingCtx = *pCtx;
     866    g_EmCtx = *pCtx;
     867    g_fEmFFs = pVCpu->fLocalForcedActions;
     868    *pcbWritten = cbEmWritten;
     869    VBOXSTRICTRC rc = rcEm;
     870
     871#  ifdef VBOX_COMPARE_IEM_LAST
     872    /* IEM */
     873    pVCpu->fLocalForcedActions = (pVCpu->fLocalForcedActions & ~g_fInterestingFFs) | (g_fIncomingFFs & g_fInterestingFFs);
    789874    *pCtx = g_IncomingCtx;
    790 
    791     /* IEM */
    792 # endif /* VBOX_COMPARE_IEM_AND_EM */
     875    uint32_t cbIemWritten = 0;
     876    VBOXSTRICTRC rcIem = IEMExecOneBypassEx(pVCpu, pRegFrame, &cbIemWritten);
     877    if (RT_UNLIKELY(   rcIem == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     878                    || rcIem == VERR_IEM_INSTR_NOT_IMPLEMENTED))
     879        rcIem = VERR_EM_INTERPRETER;
     880    g_IemCtx = *pCtx;
     881    g_fIemFFs = pVCpu->fLocalForcedActions;
     882    *pcbWritten = cbIemWritten;
     883    rc = rcIem;
     884#  endif
     885
     886#  if defined(VBOX_COMPARE_IEM_LAST) || defined(VBOX_COMPARE_IEM_FIRST)
     887    emCompareWithIem(pVCpu, &g_EmCtx, &g_IemCtx, rcEm, rcIem, cbEmWritten, cbIemWritten);
     888#  endif
     889
     890# else
    793891    VBOXSTRICTRC rc = IEMExecOneBypassEx(pVCpu, pRegFrame, pcbWritten);
    794892    if (RT_UNLIKELY(   rc == VERR_IEM_ASPECT_NOT_IMPLEMENTED
    795893                    || rc == VERR_IEM_INSTR_NOT_IMPLEMENTED))
    796894        rc = VERR_EM_INTERPRETER;
    797 
    798 # ifdef VBOX_COMPARE_IEM_AND_EM
    799     emCompareWithIem(pVCpu, pCtx, rcEm, rc, cbEmWritten, *pcbWritten);
    800895# endif
    801896    if (rc != VINF_SUCCESS)
     
    866961    PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu);
    867962    g_IncomingCtx = *pCtx;
     963    g_fIncomingFFs = pVCpu->fLocalForcedActions;
     964    g_cbEmWrote = g_cbIemWrote = 0;
     965
     966#  ifdef VBOX_COMPARE_IEM_FIRST
     967    VBOXSTRICTRC rcIem = IEMExecOneBypassWithPrefetchedByPC(pVCpu, pRegFrame, pRegFrame->rip, pDis->abInstr, pDis->cbCachedInstr);
     968    if (RT_UNLIKELY(   rcIem == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     969                    || rcIem == VERR_IEM_INSTR_NOT_IMPLEMENTED))
     970        rcIem = VERR_EM_INTERPRETER;
     971    g_IemCtx = *pCtx;
     972    g_fIemFFs = pVCpu->fLocalForcedActions;
     973    pVCpu->fLocalForcedActions = (pVCpu->fLocalForcedActions & ~g_fInterestingFFs) | (g_fIncomingFFs & g_fInterestingFFs);
     974    *pCtx = g_IncomingCtx;
     975#  endif
    868976
    869977    /* EM */
     
    879987    }
    880988#  endif
    881 
    882     g_EmOutgoingCtx = *pCtx;
     989    g_EmCtx = *pCtx;
     990    g_fEmFFs = pVCpu->fLocalForcedActions;
     991    VBOXSTRICTRC rc = rcEm;
     992
     993#  ifdef VBOX_COMPARE_IEM_LAST
     994    /* IEM */
     995    pVCpu->fLocalForcedActions = (pVCpu->fLocalForcedActions & ~g_fInterestingFFs) | (g_fIncomingFFs & g_fInterestingFFs);
    883996    *pCtx = g_IncomingCtx;
    884 
    885     /* IEM */
    886 # endif
     997    VBOXSTRICTRC rcIem = IEMExecOneBypassWithPrefetchedByPC(pVCpu, pRegFrame, pRegFrame->rip, pDis->abInstr, pDis->cbCachedInstr);
     998    if (RT_UNLIKELY(   rcIem == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     999                    || rcIem == VERR_IEM_INSTR_NOT_IMPLEMENTED))
     1000        rcIem = VERR_EM_INTERPRETER;
     1001    g_IemCtx = *pCtx;
     1002    g_fIemFFs = pVCpu->fLocalForcedActions;
     1003    rc = rcIem;
     1004#  endif
     1005
     1006#  if defined(VBOX_COMPARE_IEM_LAST) || defined(VBOX_COMPARE_IEM_FIRST)
     1007    emCompareWithIem(pVCpu, &g_EmCtx, &g_IemCtx, rcEm, rcIem, 0, 0);
     1008#  endif
     1009
     1010# else
    8871011    VBOXSTRICTRC rc = IEMExecOneBypassWithPrefetchedByPC(pVCpu, pRegFrame, pRegFrame->rip, pDis->abInstr, pDis->cbCachedInstr);
    8881012    if (RT_UNLIKELY(   rc == VERR_IEM_ASPECT_NOT_IMPLEMENTED
    8891013                    || rc == VERR_IEM_INSTR_NOT_IMPLEMENTED))
    8901014        rc = VERR_EM_INTERPRETER;
    891 
    892 # ifdef VBOX_COMPARE_IEM_AND_EM
    893     emCompareWithIem(pVCpu, pCtx, rcEm, rc, 0, 0);
    8941015# endif
     1016
    8951017    if (rc != VINF_SUCCESS)
    8961018        Log(("EMInterpretInstructionDisasState: returns %Rrc\n", VBOXSTRICTRC_VAL(rc)));
     
    12491371#endif
    12501372        rc = VINF_SUCCESS;
    1251 #ifndef VBOX_COMPARE_IEM_AND_EM
     1373#if !defined(VBOX_COMPARE_IEM_AND_EM) || !defined(VBOX_COMPARE_IEM_LAST)
    12521374        CPUMSetGuestCR0(pVCpu, val);
    12531375#else
     
    15791701       pages or write monitored pages. */
    15801702    NOREF(pVM);
    1581 #ifndef VBOX_COMPARE_IEM_AND_EM
    1582     return PGMPhysInterpretedWriteNoHandlers(pVCpu, pCtxCore, GCPtrDst, pvSrc, cb, /*fMayTrap*/ false);
     1703#if !defined(VBOX_COMPARE_IEM_AND_EM) || !defined(VBOX_COMPARE_IEM_LAST)
     1704    int rc = PGMPhysInterpretedWriteNoHandlers(pVCpu, pCtxCore, GCPtrDst, pvSrc, cb, /*fMayTrap*/ false);
    15831705#else
    1584     return VINF_SUCCESS;
    1585 #endif
     1706    int rc = VINF_SUCCESS;
     1707#endif
     1708#ifdef VBOX_COMPARE_IEM_AND_EM
     1709    Log(("EM Wrote: %RGv %.*Rhxs rc=%Rrc\n", GCPtrDst, RT_MAX(RT_MIN(cb, 64), 1), pvSrc, rc));
     1710    g_cbEmWrote = cb;
     1711    memcpy(g_abEmWrote, pvSrc, RT_MIN(cb, sizeof(g_abEmWrote)));
     1712#endif
     1713    return rc;
    15861714}
    15871715
     
    27232851    }
    27242852    eflags = EMEmulateCmpXchg(&u64, &pRegFrame->rax, valpar, pDis->Param2.cb);
     2853    int rc2 = emRamWrite(pVM, pVCpu, pRegFrame, GCPtrPar1, &u64, pDis->Param2.cb); AssertRCSuccess(rc2);
    27252854#endif /* VBOX_COMPARE_IEM_AND_EM */
    27262855
     
    27812910    uint64_t u64 = *(uint64_t *)pvParam1;
    27822911    eflags = EMEmulateCmpXchg8b(&u64, &pRegFrame->eax, &pRegFrame->edx, pRegFrame->ebx, pRegFrame->ecx);
     2912    int rc2 = emRamWrite(pVM, pVCpu, pRegFrame, GCPtrPar1, &u64, sizeof(u64)); AssertRCSuccess(rc2);
    27832913#endif /* VBOX_COMPARE_IEM_AND_EM */
    27842914
     
    28632993            }
    28642994            eflags = EMEmulateXAdd(&u64, pvParamReg2, cbParamReg2);
     2995            int rc2 = emRamWrite(pVM, pVCpu, pRegFrame, GCPtrPar1, &u64, pDis->Param2.cb); AssertRCSuccess(rc2);
    28652996#endif /* VBOX_COMPARE_IEM_AND_EM */
    28662997
     
    36243755                STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); \
    36253756            return rc
    3626 # endif /* VBOX_COMPARE_IEM_AND_EM*/
     3757# endif /* VBOX_COMPARE_IEM_AND_EM */
    36273758
    36283759#define INTERPRET_CASE_EX_PARAM3(opcode, Instr, InstrFn, pfnEmulate) \
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r42725 r42777  
    7070 *
    7171 */
     72
     73/** @def IEM_VERIFICATION_MODE_MINIMAL
     74 * Use for pitting IEM against EM or something else in ring-0 or raw-mode
     75 * context. */
     76//#define IEM_VERIFICATION_MODE_MINIMAL
    7277
    7378/*******************************************************************************
     
    8691# include <VBox/vmm/patm.h>
    8792#endif
    88 #ifdef IEM_VERIFICATION_MODE
     93#include "IEMInternal.h"
     94#ifdef IEM_VERIFICATION_MODE_FULL
    8995# include <VBox/vmm/rem.h>
    9096# include <VBox/vmm/mm.h>
    9197#endif
    92 #include "IEMInternal.h"
    9398#include <VBox/vmm/vm.h>
    9499#include <VBox/log.h>
     
    173178*   Defined Constants And Macros                                               *
    174179*******************************************************************************/
    175 /** @def IEM_LOG_MEMORY_ACCESS
    176  * Can be used to log memory accesses when debugging problematic guest behavior. */
    177 #if 0
    178 # define IEM_LOG_MEMORY_ACCESS
    179 #endif
    180 
    181180/** @name IEM status codes.
    182181 *
     
    634633    iemAImpl_shrd_u64,
    635634};
     635
     636
     637#ifdef IEM_VERIFICATION_MODE_MINIMAL
     638/** What IEM just wrote. */
     639uint8_t g_abIemWrote[256];
     640/** How much IEM just wrote. */
     641size_t g_cbIemWrote;
     642#endif
    636643
    637644
     
    664671static uint16_t         iemSRegFetchU16(PIEMCPU pIemCpu, uint8_t iSegReg);
    665672
    666 #ifdef IEM_VERIFICATION_MODE
     673#if defined(IEM_VERIFICATION_MODE_FULL) && !defined(IEM_VERIFICATION_MODE_MINIMAL)
    667674static PIEMVERIFYEVTREC iemVerifyAllocRecord(PIEMCPU pIemCpu);
    668675#endif
     
    722729    PVMCPU   pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    723730
    724 #if defined(VBOX_STRICT) && (defined(IEM_VERIFICATION_MODE) || !defined(VBOX_WITH_RAW_MODE_NOT_R0))
     731#if defined(VBOX_STRICT) && (defined(IEM_VERIFICATION_MODE_FULL) || defined(VBOX_WITH_RAW_MODE_NOT_R0))
    725732    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->cs));
    726733    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ss));
     
    737744#endif
    738745    pIemCpu->uCpl               = CPUMGetGuestCPL(pVCpu);
    739 #ifdef IEM_VERIFICATION_MODE
     746#ifdef IEM_VERIFICATION_MODE_FULL
    740747    if (pIemCpu->uInjectCpl != UINT8_MAX)
    741748        pIemCpu->uCpl           = pIemCpu->uInjectCpl;
     
    775782static VBOXSTRICTRC iemInitDecoderAndPrefetchOpcodes(PIEMCPU pIemCpu, bool fBypassHandlers)
    776783{
    777 #ifdef IEM_VERIFICATION_MODE
     784#ifdef IEM_VERIFICATION_MODE_FULL
    778785    uint8_t const cbOldOpcodes = pIemCpu->cbOpcode;
    779786#endif
     
    846853     *        TLB... */
    847854
    848 #ifdef IEM_VERIFICATION_MODE
     855#ifdef IEM_VERIFICATION_MODE_FULL
    849856    /*
    850857     * Optimistic optimization: Use unconsumed opcode bytes from the previous
     
    47274734static int iemMemPageMap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, void **ppvMem, PPGMPAGEMAPLOCK pLock)
    47284735{
    4729 #ifdef IEM_VERIFICATION_MODE
     4736#ifdef IEM_VERIFICATION_MODE_FULL
    47304737    /* Force the alternative path so we can ignore writes. */
    47314738    if ((fAccess & IEM_ACCESS_TYPE_WRITE) && !pIemCpu->fNoRem)
    47324739        return VERR_PGM_PHYS_TLB_CATCH_ALL;
    47334740#endif
    4734 #ifdef IEM_LOG_MEMORY_ACCESS
     4741#ifdef IEM_VERIFICATION_MODE_MINIMAL
    47354742    return VERR_PGM_PHYS_TLB_CATCH_ALL;
    47364743#endif
     
    48394846     */
    48404847    int rc;
     4848#ifndef IEM_VERIFICATION_MODE_MINIMAL
    48414849    if (   !pIemCpu->aMemBbMappings[iMemMap].fUnassigned
    48424850        && !IEM_VERIFICATION_ENABLED(pIemCpu))
     
    48794887    }
    48804888    else
     4889#endif
    48814890        rc = VINF_SUCCESS;
    48824891
    4883 #if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
     4892#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    48844893    /*
    48854894     * Record the write(s).
     
    49154924    }
    49164925#endif
    4917 #ifdef IEM_LOG_MEMORY_ACCESS
     4926#ifdef IEM_VERIFICATION_MODE_MINIMAL
    49184927    if (rc == VINF_SUCCESS)
    49194928    {
     
    49244933                 RT_MIN(pIemCpu->aMemBbMappings[iMemMap].cbSecond, 64),
    49254934                 &pIemCpu->aBounceBuffers[iMemMap].ab[pIemCpu->aMemBbMappings[iMemMap].cbFirst]));
     4935
     4936        size_t cbWrote = pIemCpu->aMemBbMappings[iMemMap].cbFirst + pIemCpu->aMemBbMappings[iMemMap].cbSecond;
     4937        g_cbIemWrote = cbWrote;
     4938        memcpy(g_abIemWrote, &pIemCpu->aBounceBuffers[iMemMap].ab[0], RT_MIN(cbWrote, sizeof(g_abIemWrote)));
    49264939    }
    49274940#endif
     
    50055018        }
    50065019
    5007 #if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
     5020#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    50085021        if (   !pIemCpu->fNoRem
    50095022            && (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC)) )
     
    51035116        }
    51045117
    5105 #if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
     5118#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    51065119        if (   !pIemCpu->fNoRem
    51075120            && (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC)) )
     
    74347447
    74357448
    7436 #if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
     7449#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    74377450
    74387451/**
     
    82438256}
    82448257
    8245 #else  /* !IEM_VERIFICATION_MODE || !IN_RING3 */
     8258#else  /* !IEM_VERIFICATION_MODE_FULL || !IN_RING3 */
    82468259
    82478260/* stubs */
     
    82588271}
    82598272
    8260 #endif /* !IEM_VERIFICATION_MODE || !IN_RING3 */
     8273#endif /* !IEM_VERIFICATION_MODE_FULL || !IN_RING3 */
    82618274
    82628275
     
    83288341        else if (rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED)
    83298342            pIemCpu->cRetInstrNotImplemented++;
    8330 #ifdef IEM_VERIFICATION_MODE
     8343#ifdef IEM_VERIFICATION_MODE_FULL
    83318344        else if (rcStrict == VERR_IEM_RESTART_INSTRUCTION)
    83328345            rcStrict = VINF_SUCCESS;
     
    83438356    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->cs));
    83448357    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ss));
    8345 #if defined(IEM_VERIFICATION_MODE)
     8358#if defined(IEM_VERIFICATION_MODE_FULL)
    83468359    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->es));
    83478360    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ds));
     
    83638376    PIEMCPU  pIemCpu = &pVCpu->iem.s;
    83648377
    8365 #if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
     8378#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    83668379    iemExecVerificationModeSetup(pIemCpu);
    83678380#endif
     
    84078420        rcStrict = iemExecOneInner(pVCpu, pIemCpu, true);
    84088421
    8409 #if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
     8422#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    84108423    /*
    84118424     * Assert some sanity.
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r42724 r42777  
    10251025        if (rcStrict != VINF_SUCCESS)
    10261026            return rcStrict;
    1027 #ifdef IEM_VERIFICATION_MODE /** @todo check what VT-x and AMD-V does. */
     1027        /** @todo check what VT-x and AMD-V does. */
    10281028        Desc.Legacy.Gen.u4Type |= X86_SEL_TYPE_ACCESSED;
    1029 #endif
    10301029    }
    10311030
     
    12211220        if (rcStrict != VINF_SUCCESS)
    12221221            return rcStrict;
    1223 #ifdef IEM_VERIFICATION_MODE /** @todo check what VT-x and AMD-V does. */
     1222        /** @todo check what VT-x and AMD-V does. */
    12241223        Desc.Legacy.Gen.u4Type |= X86_SEL_TYPE_ACCESSED;
    1225 #endif
    12261224    }
    12271225
     
    15291527            if (rcStrict != VINF_SUCCESS)
    15301528                return rcStrict;
    1531 #ifdef IEM_VERIFICATION_MODE /** @todo check what VT-x and AMD-V does. */
     1529            /** @todo check what VT-x and AMD-V does. */
    15321530            DescCs.Legacy.Gen.u4Type |= X86_SEL_TYPE_ACCESSED;
    1533 #endif
    15341531        }
    15351532        /** @todo Testcase: Need to check WHEN exactly the SS accessed bit is set. */
     
    15391536            if (rcStrict != VINF_SUCCESS)
    15401537                return rcStrict;
    1541 #ifdef IEM_VERIFICATION_MODE /** @todo check what VT-x and AMD-V does. */
     1538            /** @todo check what VT-x and AMD-V does. */
    15421539            DescSs.Legacy.Gen.u4Type |= X86_SEL_TYPE_ACCESSED;
    1543 #endif
    15441540        }
    15451541
     
    16221618            if (rcStrict != VINF_SUCCESS)
    16231619                return rcStrict;
    1624 #ifdef IEM_VERIFICATION_MODE /** @todo check what VT-x and AMD-V does. */
     1620            /** @todo check what VT-x and AMD-V does. */
    16251621            DescCs.Legacy.Gen.u4Type |= X86_SEL_TYPE_ACCESSED;
    1626 #endif
    16271622        }
    16281623
     
    37433738    pCtx->rax = (uint32_t)uTicks;
    37443739    pCtx->rdx = uTicks >> 32;
    3745 #ifdef IEM_VERIFICATION_MODE
     3740#ifdef IEM_VERIFICATION_MODE_FULL
    37463741    pIemCpu->fIgnoreRaxRdx = true;
    37473742#endif
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r42704 r42777  
    3232 * @{
    3333 */
     34
     35/** @def IEM_VERIFICATION_MODE_FULL
     36 * Shorthand for:
     37 *    defined(IEM_VERIFICATION_MODE) && !defined(IEM_VERIFICATION_MODE_MINIMAL)
     38 */
     39#if defined(IEM_VERIFICATION_MODE) && !defined(IEM_VERIFICATION_MODE_MINIMAL) && !defined(IEM_VERIFICATION_MODE_FULL)
     40# define IEM_VERIFICATION_MODE_FULL
     41#endif
    3442
    3543
     
    121129
    122130
    123 #ifdef IEM_VERIFICATION_MODE
     131#ifdef IEM_VERIFICATION_MODE_FULL
    124132
    125133/**
     
    184192typedef IEMVERIFYEVTREC *PIEMVERIFYEVTREC;
    185193
    186 #endif /* IEM_VERIFICATION_MODE */
     194#endif /* IEM_VERIFICATION_MODE_FULL */
    187195
    188196
     
    247255    /** Number of times rcPassUp has been used. */
    248256    uint32_t                cRetPassUpStatus;
    249 #ifdef IEM_VERIFICATION_MODE
     257#ifdef IEM_VERIFICATION_MODE_FULL
    250258    /** The Number of I/O port reads that has been performed. */
    251259    uint32_t                cIOReads;
     
    369377    } aBounceBuffers[3];
    370378
    371 #ifdef IEM_VERIFICATION_MODE
     379#ifdef IEM_VERIFICATION_MODE_FULL
    372380    /** The event verification records for what IEM did (LIFO). */
    373381    R3PTRTYPE(PIEMVERIFYEVTREC)     pIemEvtRecHead;
     
    464472 * should therefore cause the compiler to eliminate the verification branch
    465473 * of an if statement.  */
    466 #ifdef IEM_VERIFICATION_MODE
     474#ifdef IEM_VERIFICATION_MODE_FULL
    467475# define IEM_VERIFICATION_ENABLED(a_pIemCpu)    (!(a_pIemCpu)->fNoRem)
     476#elif defined(IEM_VERIFICATION_MODE_MINIMAL)
     477# define IEM_VERIFICATION_ENABLED(a_pIemCpu)    (true)
    468478#else
    469479# define IEM_VERIFICATION_ENABLED(a_pIemCpu)    (false)
    470480#endif
    471481
     482/** @def IEM_VERIFICATION_MODE
     483 * Indicates that one of the verfication modes are enabled.
     484 */
     485#if (defined(IEM_VERIFICATION_MODE_FULL) || defined(IEM_VERIFICATION_MODE_MINIMAL)) && !defined(IEM_VERIFICATION_MODE)
     486# define IEM_VERIFICATION_MODE
     487#endif
     488
    472489/**
    473490 * Indicates to the verifier that the given flag set is undefined.
     
    477494 * This is a NOOP if the verifier isn't compiled in.
    478495 */
    479 #ifdef IEM_VERIFICATION_MODE
     496#ifdef IEM_VERIFICATION_MODE_FULL
    480497# define IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fEfl) do { pIemCpu->fUndefinedEFlags |= (a_fEfl); } while (0)
    481498#else
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