VirtualBox

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


Ignore:
Timestamp:
Aug 1, 2023 2:24:11 AM (18 months ago)
Author:
vboxsync
Message:

VMM/IEM: Check for IRQs every so often, especially after sti, popf and iret. Increased the hash table size. Disabled some debug code. bugref:10369

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

Legend:

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

    r100740 r100761  
    23122312        IEMOP_HLP_NO_64BIT();
    23132313        if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    2314             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS, iemCImpl_popa_16);
     2314            IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_popa_16);
    23152315        Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    2316         IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS, iemCImpl_popa_32);
     2316        IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_popa_32);
    23172317    }
    23182318    IEMOP_MNEMONIC(mvex, "mvex");
     
    57235723    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    57245724    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    5725     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS, iemCImpl_popf, pVCpu->iem.s.enmEffOpSize);
     5725    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_CHECK_IRQ,
     5726                                iemCImpl_popf, pVCpu->iem.s.enmEffOpSize);
    57265727}
    57275728
     
    75847585    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    75857586    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    7586                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     7587                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_CHECK_IRQ | IEM_CIMPL_F_VMEXIT,
    75877588                                iemCImpl_iret, pVCpu->iem.s.enmEffOpSize);
    75887589}
     
    1254312544    IEMOP_MNEMONIC(sti, "sti");
    1254412545    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12545     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, iemCImpl_sti);
     12546    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_CHECK_IRQ_DELAYED | IEM_CIMPL_F_VMEXIT, iemCImpl_sti);
    1254612547}
    1254712548
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdFuncsBltIn.cpp

    r100752 r100761  
    8888    return pfnCImpl(pVCpu, cbInstr);
    8989}
     90
     91
     92/**
     93 * Built-in function that checks for pending interrupts that can be delivered.
     94 *
     95 * This triggers after the completion of an instruction, so EIP is already at
     96 * the next instruction.  If an IRQ or important FF is pending, this will return
     97 * a non-zero status that stops TB execution.
     98 */
     99IEM_DECL_IEMTHREADEDFUNC_DEF(iemThreadedFunc_BltIn_CheckIrq)
     100{
     101    RT_NOREF(uParam0, uParam1, uParam2);
     102
     103    /*
     104     * Check for IRQs and other FFs that needs servicing.
     105     */
     106    uint64_t fCpu = pVCpu->fLocalForcedActions;
     107    fCpu &= VMCPU_FF_ALL_MASK & ~(  VMCPU_FF_PGM_SYNC_CR3
     108                                  | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
     109                                  | VMCPU_FF_TLB_FLUSH
     110                                  | VMCPU_FF_UNHALT );
     111    if (RT_LIKELY(   (   !fCpu
     112                      || (   !(fCpu & ~(VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
     113                          && !pVCpu->cpum.GstCtx.rflags.Bits.u1IF) )
     114                  && !VM_FF_IS_ANY_SET(pVCpu->CTX_SUFF(pVM), VM_FF_ALL_MASK) ))
     115        return VINF_SUCCESS;
     116
     117    Log(("%04x:%08RX32: Pending IRQ and/or FF: fCpu=%#RX64 fVm=%#RX32 IF=%d\n",
     118         pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, fCpu,
     119         pVCpu->CTX_SUFF(pVM)->fGlobalForcedActions & VM_FF_ALL_MASK, pVCpu->cpum.GstCtx.rflags.Bits.u1IF));
     120    return VINF_IEM_REEXEC_MODE_CHANGED;
     121}
     122
    90123
    91124
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r100752 r100761  
    209209        'IEM_CIMPL_F_BRANCH_CONDITIONAL':   False,
    210210        'IEM_CIMPL_F_RFLAGS':               False,
     211        'IEM_CIMPL_F_CHECK_IRQ':            False,
     212        'IEM_CIMPL_F_CHECK_IRQ_DELAYED':    False,
    211213        'IEM_CIMPL_F_STATUS_FLAGS':         False,
    212214        'IEM_CIMPL_F_VMEXIT':               True,
     
    909911        # mask and maybe emit additional checks.
    910912        if 'IEM_CIMPL_F_MODE' in self.dsCImplFlags or 'IEM_CIMPL_F_XCPT' in self.dsCImplFlags:
    911             aoStmts.append(iai.McCppCall('IEM_MC2_EMIT_CALL_1', ( 'kIemThreadedFunc_CheckMode', 'pVCpu->iem.s.fExec', ),
     913            aoStmts.append(iai.McCppCall('IEM_MC2_EMIT_CALL_1', ( 'kIemThreadedFunc_BltIn_CheckMode', 'pVCpu->iem.s.fExec', ),
    912914                                         cchIndent = cchIndent));
    913915
     
    931933            aoStmts.append(iai.McCppGeneric('pVCpu->iem.s.fEndTb = true; /* %s */' % (','.join(asEndTbFlags),),
    932934                                            cchIndent = cchIndent));
     935
     936        if 'IEM_CIMPL_F_CHECK_IRQ' in self.dsCImplFlags:
     937            aoStmts.append(iai.McCppGeneric('pVCpu->iem.s.cInstrTillIrqCheck = 0;', cchIndent = cchIndent));
     938        elif 'IEM_CIMPL_F_CHECK_IRQ_DELAYED' in self.dsCImplFlags:
     939            aoStmts.append(iai.McCppGeneric('pVCpu->iem.s.cInstrTillIrqCheck = 1;', cchIndent = cchIndent));
    933940
    934941        return aoStmts;
     
    13661373        ];
    13671374
     1375    ## List of built-in threaded functions.
     1376    kasBltIns = (
     1377        'DeferToCImpl0',
     1378        'CheckIrq',
     1379        'CheckMode',
     1380        'CheckCsLim',
     1381        'CheckCsLimAndOpcodes',
     1382        'CheckOpcodes',
     1383        'CheckCsLimAndPcAndOpcodes',
     1384        'CheckPcAndOpcodes',
     1385        'CheckCsLimAndOpcodesAcrossPageLoadingTlb',
     1386        'CheckOpcodesAcrossPageLoadingTlb',
     1387        'CheckCsLimAndOpcodesLoadingTlb',
     1388        'CheckOpcodesLoadingTlb',
     1389        'CheckCsLimAndOpcodesOnNextPageLoadingTlb',
     1390        'CheckOpcodesOnNextPageLoadingTlb',
     1391        'CheckCsLimAndOpcodesOnNewPageLoadingTlb',
     1392        'CheckOpcodesOnNewPageLoadingTlb',
     1393    );
    13681394
    13691395    def generateThreadedFunctionsHeader(self, oOut):
     
    13841410            '     * Predefined',
    13851411            '     */',
    1386             '    kIemThreadedFunc_DeferToCImpl0,',
    1387             '    kIemThreadedFunc_CheckMode,',
    1388             '    kIemThreadedFunc_CheckCsLim,',
    1389             '    kIemThreadedFunc_CheckCsLimAndOpcodes,',
    1390             '    kIemThreadedFunc_CheckOpcodes,',
    1391             '    kIemThreadedFunc_CheckCsLimAndPcAndOpcodes,',
    1392             '    kIemThreadedFunc_CheckPcAndOpcodes,',
    1393             '    kIemThreadedFunc_CheckCsLimAndOpcodesAcrossPageLoadingTlb,',
    1394             '    kIemThreadedFunc_CheckOpcodesAcrossPageLoadingTlb,',
    1395             '    kIemThreadedFunc_CheckCsLimAndOpcodesLoadingTlb,',
    1396             '    kIemThreadedFunc_CheckOpcodesLoadingTlb,',
    1397             '    kIemThreadedFunc_CheckCsLimAndOpcodesOnNextPageLoadingTlb,',
    1398             '    kIemThreadedFunc_CheckOpcodesOnNextPageLoadingTlb,',
    1399             '    kIemThreadedFunc_CheckCsLimAndOpcodesOnNewPageLoadingTlb,',
    1400             '    kIemThreadedFunc_CheckOpcodesOnNewPageLoadingTlb,',
    14011412        ];
     1413        asLines += ['    kIemThreadedFunc_BltIn_%s,' % (sFuncNm,) for sFuncNm in self.kasBltIns];
     1414
    14021415        iThreadedFunction = 1;
    14031416        for sVariation in ThreadedFunctionVariation.kasVariationsEmitOrder:
     
    15401553                   + '    /*\n'
    15411554                   + '     * Predefined.\n'
    1542                    + '     */'
    1543                    + '    iemThreadedFunc_BltIn_DeferToCImpl0,\n'
    1544                    + '    iemThreadedFunc_BltIn_CheckMode,\n'
    1545                    + '    iemThreadedFunc_BltIn_CheckCsLim,\n'
    1546                    + '    iemThreadedFunc_BltIn_CheckCsLimAndOpcodes,\n'
    1547                    + '    iemThreadedFunc_BltIn_CheckOpcodes,\n'
    1548                    + '    iemThreadedFunc_BltIn_CheckCsLimAndPcAndOpcodes,\n'
    1549                    + '    iemThreadedFunc_BltIn_CheckPcAndOpcodes,\n'
    1550                    + '    iemThreadedFunc_BltIn_CheckCsLimAndOpcodesAcrossPageLoadingTlb,\n'
    1551                    + '    iemThreadedFunc_BltIn_CheckOpcodesAcrossPageLoadingTlb,\n'
    1552                    + '    iemThreadedFunc_BltIn_CheckCsLimAndOpcodesLoadingTlb,\n'
    1553                    + '    iemThreadedFunc_BltIn_CheckOpcodesLoadingTlb,\n'
    1554                    + '    iemThreadedFunc_BltIn_CheckCsLimAndOpcodesOnNextPageLoadingTlb,\n'
    1555                    + '    iemThreadedFunc_BltIn_CheckOpcodesOnNextPageLoadingTlb,\n'
    1556                    + '    iemThreadedFunc_BltIn_CheckCsLimAndOpcodesOnNewPageLoadingTlb,\n'
    1557                    + '    iemThreadedFunc_BltIn_CheckOpcodesOnNewPageLoadingTlb,\n'
    1558                    );
     1555                   + '     */\n');
     1556        for sFuncNm in self.kasBltIns:
     1557            oOut.write('    iemThreadedFunc_BltIn_%s,\n' % (sFuncNm,));
     1558
    15591559        iThreadedFunction = 1;
    15601560        for sVariation in ThreadedFunctionVariation.kasVariationsEmitOrder:
     
    15861586                   + '    /*\n'
    15871587                   + '     * Predefined.\n'
    1588                    + '     */'
    1589                    + '    "BltIn_DeferToCImpl0",\n'
    1590                    + '    "BltIn_CheckMode",\n'
    1591                    + '    "BltIn_CheckCsLim",\n'
    1592                    + '    "BltIn_CheckCsLimAndOpcodes",\n'
    1593                    + '    "BltIn_CheckOpcodes",\n'
    1594                    + '    "BltIn_CheckCsLimAndPcAndOpcodes",\n'
    1595                    + '    "BltIn_CheckPcAndOpcodes",\n'
    1596                    + '    "BltIn_CheckCsLimAndOpcodesAcrossPageLoadingTlb",\n'
    1597                    + '    "BltIn_CheckOpcodesAcrossPageLoadingTlb",\n'
    1598                    + '    "BltIn_CheckCsLimAndOpcodesLoadingTlb",\n'
    1599                    + '    "BltIn_CheckOpcodesLoadingTlb",\n'
    1600                    + '    "BltIn_CheckCsLimAndOpcodesOnNextPageLoadingTlb",\n'
    1601                    + '    "BltIn_CheckOpcodesOnNextPageLoadingTlb",\n'
    1602                    + '    "BltIn_CheckCsLimAndOpcodesOnNewPageLoadingTlb",\n'
    1603                    + '    "BltIn_CheckOpcodesOnNewPageLoadingTlb",\n'
    1604                    );
     1588                   + '     */\n');
     1589        for sFuncNm in self.kasBltIns:
     1590            oOut.write('    "BltIn_%s",\n' % (sFuncNm,));
     1591
    16051592        iThreadedFunction = 1;
    16061593        for sVariation in ThreadedFunctionVariation.kasVariationsEmitOrder:
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdRecompiler.cpp

    r100752 r100761  
    446446    uint32_t cHash;
    447447    uint32_t uHashMask;
    448     PIEMTB   apHash[_64K];
     448    PIEMTB   apHash[_1M];
    449449} IEMTBCACHE;
    450450
    451 static IEMTBCACHE g_TbCache = { _64K, 0xffff, }; /**< Quick and dirty. */
     451static IEMTBCACHE g_TbCache = { _1M, _1M - 1, }; /**< Quick and dirty. */
    452452
    453453#define IEMTBCACHE_HASH(a_paCache, a_fTbFlags, a_GCPhysPc) \
     
    735735        pVCpu->iem.s.fTbBranched            = IEMBRANCHED_F_NO;
    736736        pVCpu->iem.s.fTbCrossedPage         = false;
     737        pVCpu->iem.s.cInstrTillIrqCheck     = 32;
    737738    }
    738739    else
     
    868869{
    869870    Assert((pVCpu->iem.s.GCPhysInstrBuf & GUEST_PAGE_OFFSET_MASK) == 0);
     871#if 0
    870872    if (pVCpu->cpum.GstCtx.rip >= 0xc0000000 && !LogIsEnabled())
    871873        RTLogChangeFlags(NULL, 0, RTLOGFLAGS_DISABLED);
     874#endif
    872875
    873876    /*
     
    992995                || pVCpu->iem.s.fTbCrossedPage)
    993996                pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    994                                    ? kIemThreadedFunc_CheckCsLimAndOpcodesLoadingTlb
    995                                    : kIemThreadedFunc_CheckOpcodesLoadingTlb;
     997                                   ? kIemThreadedFunc_BltIn_CheckCsLimAndOpcodesLoadingTlb
     998                                   : kIemThreadedFunc_BltIn_CheckOpcodesLoadingTlb;
    996999            else if (pVCpu->iem.s.fTbBranched & (IEMBRANCHED_F_CONDITIONAL | /* paranoia: */ IEMBRANCHED_F_DIRECT))
    9971000                pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    998                                    ? kIemThreadedFunc_CheckCsLimAndPcAndOpcodes
    999                                    : kIemThreadedFunc_CheckPcAndOpcodes;
     1001                                   ? kIemThreadedFunc_BltIn_CheckCsLimAndPcAndOpcodes
     1002                                   : kIemThreadedFunc_BltIn_CheckPcAndOpcodes;
    10001003            else
    10011004            {
    10021005                Assert(pVCpu->iem.s.fTbBranched & IEMBRANCHED_F_RELATIVE);
    10031006                pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    1004                                    ? kIemThreadedFunc_CheckCsLimAndOpcodes
    1005                                    : kIemThreadedFunc_CheckOpcodes;
     1007                                   ? kIemThreadedFunc_BltIn_CheckCsLimAndOpcodes
     1008                                   : kIemThreadedFunc_BltIn_CheckOpcodes;
    10061009            }
    10071010        }
     
    11041107            /* Determin which function we need to load & check. */
    11051108            pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    1106                                ? kIemThreadedFunc_CheckCsLimAndOpcodesOnNewPageLoadingTlb
    1107                                : kIemThreadedFunc_CheckOpcodesOnNewPageLoadingTlb;
     1109                               ? kIemThreadedFunc_BltIn_CheckCsLimAndOpcodesOnNewPageLoadingTlb
     1110                               : kIemThreadedFunc_BltIn_CheckOpcodesOnNewPageLoadingTlb;
    11081111        }
    11091112        else
     
    11261129            if (pVCpu->iem.s.fTbCheckOpcodes)
    11271130                pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    1128                                    ? kIemThreadedFunc_CheckCsLimAndOpcodesAcrossPageLoadingTlb
    1129                                    : kIemThreadedFunc_CheckOpcodesAcrossPageLoadingTlb;
     1131                                   ? kIemThreadedFunc_BltIn_CheckCsLimAndOpcodesAcrossPageLoadingTlb
     1132                                   : kIemThreadedFunc_BltIn_CheckOpcodesAcrossPageLoadingTlb;
    11301133            else
    11311134                pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    1132                                    ? kIemThreadedFunc_CheckCsLimAndOpcodesOnNextPageLoadingTlb
    1133                                    : kIemThreadedFunc_CheckOpcodesOnNextPageLoadingTlb;
     1135                                   ? kIemThreadedFunc_BltIn_CheckCsLimAndOpcodesOnNextPageLoadingTlb
     1136                                   : kIemThreadedFunc_BltIn_CheckOpcodesOnNextPageLoadingTlb;
    11341137        }
    11351138    }
     
    11431146        if (pVCpu->iem.s.fTbCheckOpcodes)
    11441147            pCall->enmFunction = pTb->fFlags & IEMTB_F_CS_LIM_CHECKS
    1145                                ? kIemThreadedFunc_CheckCsLimAndOpcodes
    1146                                : kIemThreadedFunc_CheckOpcodes;
     1148                               ? kIemThreadedFunc_BltIn_CheckCsLimAndOpcodes
     1149                               : kIemThreadedFunc_BltIn_CheckOpcodes;
    11471150        else
    1148             pCall->enmFunction = kIemThreadedFunc_CheckCsLim;
     1151            pCall->enmFunction = kIemThreadedFunc_BltIn_CheckCsLim;
    11491152
    11501153        iemThreadedCopyOpcodeBytesInline(pVCpu, &pTb->pabOpcodes[offOpcode], cbInstr);
     
    11761179}
    11771180
     1181
     1182/**
     1183 * Emits an IRQ check call and checks for pending IRQs.
     1184 *
     1185 * @returns true if IRQs are pending and can be dispatched, false if not.
     1186 * @param   pVCpu       The cross context virtual CPU structure of the calling
     1187 *                      thread.
     1188 * @param   pTb         The transation block.
     1189 */
     1190static bool iemThreadedCompileCheckIrq(PVMCPUCC pVCpu, PIEMTB pTb)
     1191{
     1192    pVCpu->iem.s.cInstrTillIrqCheck = 32;
     1193
     1194    /*
     1195     * Emit the call first.
     1196     */
     1197    AssertReturn(pTb->Thrd.cCalls < pTb->Thrd.cAllocated, true);
     1198    PIEMTHRDEDCALLENTRY pCall = &pTb->Thrd.paCalls[pTb->Thrd.cCalls++];
     1199    pCall->enmFunction = kIemThreadedFunc_BltIn_CheckIrq;
     1200    pCall->uUnused0    = 0;
     1201    pCall->offOpcode   = 0;
     1202    pCall->cbOpcode    = 0;
     1203    pCall->idxRange    = 0;
     1204    pCall->auParams[0] = 0;
     1205    pCall->auParams[1] = 0;
     1206    pCall->auParams[2] = 0;
     1207
     1208
     1209    /*
     1210     * Check for IRQs.
     1211     */
     1212    uint64_t fCpu = pVCpu->fLocalForcedActions;
     1213    fCpu &= VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI;
     1214    if (RT_LIKELY(   !fCpu
     1215                  || (   !(fCpu & ~(VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
     1216                      && !pVCpu->cpum.GstCtx.rflags.Bits.u1IF)))
     1217        return false;
     1218    return true;
     1219}
    11781220
    11791221
     
    12511293            return iemExecStatusCodeFiddling(pVCpu, rcStrict);
    12521294        }
     1295
     1296        /* Check for IRQs? */
     1297        if (pVCpu->iem.s.cInstrTillIrqCheck-- > 0)
     1298        { /* likely */ }
     1299        else if (iemThreadedCompileCheckIrq(pVCpu, pTb))
     1300            break;
    12531301
    12541302        /* Still space in the TB? */
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdTables.h

    r100742 r100761  
    275275
    276276    IEM_MC2_BEGIN_EMIT_CALLS();
    277     IEM_MC2_EMIT_CALL_2(kIemThreadedFunc_DeferToCImpl0, (uintptr_t)pfnCImpl, IEM_GET_INSTR_LEN(pVCpu));
     277    IEM_MC2_EMIT_CALL_2(kIemThreadedFunc_BltIn_DeferToCImpl0, (uintptr_t)pfnCImpl, IEM_GET_INSTR_LEN(pVCpu));
    278278    IEM_MC2_END_EMIT_CALLS(fFlags);
    279279
    280     /* We have to repeat work normally done by kdCImplFlags and
    281        ThreadedFunctionVariation.emitThreadedCallStmts here. */
    282     if (fFlags & (IEM_CIMPL_F_END_TB | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_REP))
    283         pVCpu->iem.s.fEndTb = true;
    284 
     280    /*
     281     * We have to repeat work normally done by kdCImplFlags and
     282     * ThreadedFunctionVariation.emitThreadedCallStmts here.
     283     */
    285284    AssertCompile(IEM_CIMPL_F_BRANCH_DIRECT      == IEMBRANCHED_F_DIRECT);
    286285    AssertCompile(IEM_CIMPL_F_BRANCH_INDIRECT    == IEMBRANCHED_F_INDIRECT);
     
    288287    AssertCompile(IEM_CIMPL_F_BRANCH_CONDITIONAL == IEMBRANCHED_F_CONDITIONAL);
    289288    AssertCompile(IEM_CIMPL_F_BRANCH_FAR         == IEMBRANCHED_F_FAR);
    290     if (fFlags & IEM_CIMPL_F_BRANCH_ANY)
     289
     290    if (fFlags & (IEM_CIMPL_F_END_TB | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_REP))
     291        pVCpu->iem.s.fEndTb = true;
     292    else if (fFlags & IEM_CIMPL_F_BRANCH_ANY)
    291293        pVCpu->iem.s.fTbBranched = fFlags & (IEM_CIMPL_F_BRANCH_ANY | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_CONDITIONAL);
     294
     295    if (fFlags & IEM_CIMPL_F_CHECK_IRQ)
     296        pVCpu->iem.s.cInstrTillIrqCheck = 0;
     297    else if (fFlags & IEM_CIMPL_F_CHECK_IRQ_DELAYED)
     298        pVCpu->iem.s.cInstrTillIrqCheck = 1;
    292299
    293300    return pfnCImpl(pVCpu, IEM_GET_INSTR_LEN(pVCpu));
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