VirtualBox

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


Ignore:
Timestamp:
Jun 5, 2023 3:17:42 PM (20 months ago)
Author:
vboxsync
Message:

VMM/IEM: Reworked all the IEM_MC_CALL/DEFER_TO_CIMPL macros to include some clues about what they may end up doing. The IEM_MC_DEFER_TO_CIMPL_X macros now returns implictly and is renamed to IEM_MC_DEFER_TO_CIMPL_X_RET - this will ease adding more code/whatever to follow the return from the call when recompiling and such. Also fixed buggy POP CS in 8086 mode. bugref:10369

Location:
trunk/src/VBox/VMM/include
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/include/IEMInternal-armv8.h

    r99739 r100072  
    12301230 * @return  Strict VBox status code.
    12311231 */
    1232 #define IEMOP_RAISE_DIVIDE_ERROR()          IEM_MC_DEFER_TO_CIMPL_0(iemCImplRaiseDivideError)
     1232#define IEMOP_RAISE_DIVIDE_ERROR_RET()      IEM_MC_DEFER_TO_CIMPL_0_RET(iemCImplRaiseDivideError)
    12331233
    12341234/**
     
    12401240 * @return  Strict VBox status code.
    12411241 */
    1242 #define IEMOP_RAISE_INVALID_OPCODE()        IEM_MC_DEFER_TO_CIMPL_0(iemCImplRaiseInvalidOpcode)
     1242#define IEMOP_RAISE_INVALID_OPCODE_RET()    IEM_MC_DEFER_TO_CIMPL_0_RET(iemCImplRaiseInvalidOpcode)
    12431243/** @} */
    12441244
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r100061 r100072  
    41574157 * @return  Strict VBox status code.
    41584158 */
    4159 #define IEMOP_RAISE_DIVIDE_ERROR()          IEM_MC_DEFER_TO_CIMPL_0(iemCImplRaiseDivideError)
     4159#define IEMOP_RAISE_DIVIDE_ERROR_RET()      IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseDivideError)
    41604160
    41614161/**
     
    41674167 * @return  Strict VBox status code.
    41684168 */
    4169 #define IEMOP_RAISE_INVALID_LOCK_PREFIX()   IEM_MC_DEFER_TO_CIMPL_0(iemCImplRaiseInvalidLockPrefix)
     4169#define IEMOP_RAISE_INVALID_LOCK_PREFIX_RET() IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseInvalidLockPrefix)
    41704170
    41714171/**
     
    41774177 * @return  Strict VBox status code.
    41784178 */
    4179 #define IEMOP_RAISE_INVALID_OPCODE()        IEM_MC_DEFER_TO_CIMPL_0(iemCImplRaiseInvalidOpcode)
     4179#define IEMOP_RAISE_INVALID_OPCODE_RET()    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseInvalidOpcode)
    41804180/** @} */
    41814181
  • trunk/src/VBox/VMM/include/IEMMc.h

    r100052 r100072  
    10741074#define IEM_MC_CALL_AIMPL_4(a_rc, a_pfn, a0, a1, a2, a3)  (a_rc) = (a_pfn)((a0), (a1), (a2), (a3))
    10751075
     1076/** @name IEM_CIMPL_F_XXX - State change clues for CIMPL calls.
     1077 *
     1078 * These clues are mainly for the recompiler, so that it can
     1079 *
     1080 * @{ */
     1081#define IEM_CIMPL_F_MODE            RT_BIT_32(0)    /**< Execution flags may change (IEMCPU::fExec). */
     1082#define IEM_CIMPL_F_BRANCH          RT_BIT_32(1)    /**< Branches (changes RIP, maybe CS). */
     1083#define IEM_CIMPL_F_RFLAGS          RT_BIT_32(2)    /**< May change significant portions of RFLAGS. */
     1084#define IEM_CIMPL_F_STATUS_FLAGS    RT_BIT_32(3)    /**< May change the status bits (X86_EFL_STATUS_BITS) in RFLAGS . */
     1085#define IEM_CIMPL_F_VMEXIT          RT_BIT_32(4)    /**< May trigger a VM exit. */
     1086#define IEM_CIMPL_F_FPU             RT_BIT_32(5)    /**< May modify FPU state. */
     1087#define IEM_CIMPL_F_REP             RT_BIT_32(6)    /**< REP prefixed instruction which may yield before updating PC. */
     1088#define IEM_CIMPL_F_END_TB          RT_BIT_32(7)
     1089/** Convenience: Raise exception (technically unnecessary, since it shouldn't return VINF_SUCCESS). */
     1090#define IEM_CIMPL_F_XCPT            (IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT)
     1091/** @} */
     1092
     1093/** @def IEM_MC_CALL_CIMPL_HLP_RET
     1094 * Helper macro for check that all important IEM_CIMPL_F_XXX bits are set.
     1095 */
     1096#ifdef VBOX_STRICT
     1097#define IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, a_CallExpr) \
     1098    do { \
     1099        uint8_t      const cbInstr     = IEM_GET_INSTR_LEN(pVCpu); /* may be flushed */ \
     1100        uint16_t     const uCsBefore   = pVCpu->cpum.GstCtx.cs.Sel; \
     1101        uint64_t     const uRipBefore  = pVCpu->cpum.GstCtx.rip; \
     1102        uint32_t     const fEflBefore  = pVCpu->cpum.GstCtx.eflags.u; \
     1103        uint32_t     const fExecBefore = pVCpu->iem.s.fExec; \
     1104        VBOXSTRICTRC const rcStrictHlp = a_CallExpr; \
     1105        if (rcStrictHlp == VINF_SUCCESS) \
     1106        { \
     1107            AssertMsg(   ((a_fFlags) & IEM_CIMPL_F_BRANCH) \
     1108                      || (   uRipBefore + cbInstr == pVCpu->cpum.GstCtx.rip \
     1109                          && uCsBefore            == pVCpu->cpum.GstCtx.cs.Sel) \
     1110                      || (   ((a_fFlags) & IEM_CIMPL_F_REP) \
     1111                          && uRipBefore == pVCpu->cpum.GstCtx.rip \
     1112                          && uCsBefore  == pVCpu->cpum.GstCtx.cs.Sel), \
     1113                      ("CS:RIP=%04x:%08RX64 + %x -> %04x:%08RX64, expected %04x:%08RX64\n", uCsBefore, uRipBefore, cbInstr, \
     1114                       pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.rip, uCsBefore, uRipBefore + cbInstr)); \
     1115            if ((a_fFlags) & IEM_CIMPL_F_RFLAGS) \
     1116            { /* No need to check fEflBefore */ Assert(!((a_fFlags) & IEM_CIMPL_F_STATUS_FLAGS)); } \
     1117            else if ((a_fFlags) & IEM_CIMPL_F_STATUS_FLAGS) \
     1118                AssertMsg(   (pVCpu->cpum.GstCtx.eflags.u & ~(X86_EFL_STATUS_BITS | X86_EFL_RF)) \
     1119                          == (fEflBefore                  & ~(X86_EFL_STATUS_BITS | X86_EFL_RF)), \
     1120                          ("EFL=%#RX32 -> %#RX32\n", fEflBefore, pVCpu->cpum.GstCtx.eflags.u)); \
     1121            else \
     1122                AssertMsg(   (pVCpu->cpum.GstCtx.eflags.u & ~(X86_EFL_RF)) \
     1123                          == (fEflBefore                  & ~(X86_EFL_RF)), \
     1124                          ("EFL=%#RX32 -> %#RX32\n", fEflBefore, pVCpu->cpum.GstCtx.eflags.u)); \
     1125            if (!((a_fFlags) & IEM_CIMPL_F_MODE)) \
     1126            { \
     1127                uint32_t fExecRecalc = iemCalcExecFlags(pVCpu) | (pVCpu->iem.s.fExec & IEM_F_USER_OPTS); \
     1128                AssertMsg(fExecBefore == fExecRecalc, \
     1129                          ("fExec=%#x -> %#x (diff %#x)\n", fExecBefore, fExecRecalc, fExecBefore ^ fExecRecalc)); \
     1130            } \
     1131        } \
     1132        return rcStrictHlp; \
     1133    } while (0)
     1134#else
     1135# define IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, a_CallExpr) return a_CallExpr
     1136#endif
     1137
    10761138/**
    10771139 * Defers the rest of the instruction emulation to a C implementation routine
    10781140 * and returns, only taking the standard parameters.
    10791141 *
     1142 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    10801143 * @param   a_pfnCImpl      The pointer to the C routine.
    10811144 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    10821145 */
    1083 #define IEM_MC_CALL_CIMPL_0(a_pfnCImpl)                 return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu))
     1146#define IEM_MC_CALL_CIMPL_0(a_fFlags, a_pfnCImpl) \
     1147    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu)))
    10841148
    10851149/**
     
    10871151 * returns, taking one argument in addition to the standard ones.
    10881152 *
     1153 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    10891154 * @param   a_pfnCImpl      The pointer to the C routine.
    10901155 * @param   a0              The argument.
    10911156 */
    1092 #define IEM_MC_CALL_CIMPL_1(a_pfnCImpl, a0)             return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0)
     1157#define IEM_MC_CALL_CIMPL_1(a_fFlags, a_pfnCImpl, a0) \
     1158    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0))
    10931159
    10941160/**
     
    10961162 * and returns, taking two arguments in addition to the standard ones.
    10971163 *
     1164 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    10981165 * @param   a_pfnCImpl      The pointer to the C routine.
    10991166 * @param   a0              The first extra argument.
    11001167 * @param   a1              The second extra argument.
    11011168 */
    1102 #define IEM_MC_CALL_CIMPL_2(a_pfnCImpl, a0, a1)         return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1)
     1169#define IEM_MC_CALL_CIMPL_2(a_fFlags, a_pfnCImpl, a0, a1) \
     1170    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1))
    11031171
    11041172/**
     
    11061174 * and returns, taking three arguments in addition to the standard ones.
    11071175 *
     1176 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11081177 * @param   a_pfnCImpl      The pointer to the C routine.
    11091178 * @param   a0              The first extra argument.
     
    11111180 * @param   a2              The third extra argument.
    11121181 */
    1113 #define IEM_MC_CALL_CIMPL_3(a_pfnCImpl, a0, a1, a2)     return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2)
     1182#define IEM_MC_CALL_CIMPL_3(a_fFlags, a_pfnCImpl, a0, a1, a2) \
     1183    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2))
    11141184
    11151185/**
     
    11171187 * and returns, taking four arguments in addition to the standard ones.
    11181188 *
     1189 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11191190 * @param   a_pfnCImpl      The pointer to the C routine.
    11201191 * @param   a0              The first extra argument.
     
    11231194 * @param   a3              The fourth extra argument.
    11241195 */
    1125 #define IEM_MC_CALL_CIMPL_4(a_pfnCImpl, a0, a1, a2, a3)     return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2, a3)
     1196#define IEM_MC_CALL_CIMPL_4(a_fFlags, a_pfnCImpl, a0, a1, a2, a3) \
     1197    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2, a3))
    11261198
    11271199/**
     
    11291201 * and returns, taking two arguments in addition to the standard ones.
    11301202 *
     1203 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11311204 * @param   a_pfnCImpl      The pointer to the C routine.
    11321205 * @param   a0              The first extra argument.
     
    11361209 * @param   a4              The fifth extra argument.
    11371210 */
    1138 #define IEM_MC_CALL_CIMPL_5(a_pfnCImpl, a0, a1, a2, a3, a4) return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2, a3, a4)
     1211#define IEM_MC_CALL_CIMPL_5(a_fFlags, a_pfnCImpl, a0, a1, a2, a3, a4) \
     1212    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2, a3, a4))
    11391213
    11401214/**
     
    11441218 * This shall be used without any IEM_MC_BEGIN or IEM_END macro surrounding it.
    11451219 *
     1220 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11461221 * @param   a_pfnCImpl      The pointer to the C routine.
    11471222 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    11481223 */
    1149 #define IEM_MC_DEFER_TO_CIMPL_0(a_pfnCImpl)             (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu))
     1224#define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_pfnCImpl) \
     1225    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu)))
    11501226
    11511227/**
     
    11551231 * This shall be used without any IEM_MC_BEGIN or IEM_END macro surrounding it.
    11561232 *
     1233 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11571234 * @param   a_pfnCImpl      The pointer to the C routine.
    11581235 * @param   a0              The argument.
    11591236 */
    1160 #define IEM_MC_DEFER_TO_CIMPL_1(a_pfnCImpl, a0)         (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0)
     1237#define IEM_MC_DEFER_TO_CIMPL_1_RET(a_fFlags, a_pfnCImpl, a0) \
     1238    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0))
    11611239
    11621240/**
     
    11661244 * This shall be used without any IEM_MC_BEGIN or IEM_END macro surrounding it.
    11671245 *
     1246 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11681247 * @param   a_pfnCImpl      The pointer to the C routine.
    11691248 * @param   a0              The first extra argument.
    11701249 * @param   a1              The second extra argument.
    11711250 */
    1172 #define IEM_MC_DEFER_TO_CIMPL_2(a_pfnCImpl, a0, a1)     (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1)
     1251#define IEM_MC_DEFER_TO_CIMPL_2_RET(a_fFlags, a_pfnCImpl, a0, a1) \
     1252    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1))
    11731253
    11741254/**
     
    11781258 * This shall be used without any IEM_MC_BEGIN or IEM_END macro surrounding it.
    11791259 *
     1260 * @param   a_fFlags        IEM_CIMPL_F_XXX.
    11801261 * @param   a_pfnCImpl      The pointer to the C routine.
    11811262 * @param   a0              The first extra argument.
     
    11831264 * @param   a2              The third extra argument.
    11841265 */
    1185 #define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2) (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2)
     1266#define IEM_MC_DEFER_TO_CIMPL_3_RET(a_fFlags, a_pfnCImpl, a0, a1, a2) \
     1267    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2))
     1268
    11861269
    11871270/**
  • trunk/src/VBox/VMM/include/IEMOpHlp.h

    r100052 r100072  
    8080    { \
    8181        Log(("Unsupported instruction %Rfn\n", __FUNCTION__)); \
    82         return IEMOP_RAISE_INVALID_OPCODE(); \
     82        IEMOP_RAISE_INVALID_OPCODE_RET(); \
    8383    } \
    8484    typedef int ignore_semicolon
     
    9191        RT_NOREF_PV(a_Name0); \
    9292        Log(("Unsupported instruction %Rfn\n", __FUNCTION__)); \
    93         return IEMOP_RAISE_INVALID_OPCODE(); \
     93        IEMOP_RAISE_INVALID_OPCODE_RET(); \
    9494    } \
    9595    typedef int ignore_semicolon
     
    225225        { \
    226226            (void)DBGFSTOP(pVCpu->CTX_SUFF(pVM)); \
    227             return IEMOP_RAISE_INVALID_OPCODE(); \
     227            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    228228        } \
    229229    } while (0)
     
    232232    do { \
    233233        if (IEM_GET_TARGET_CPU(pVCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
    234         else return IEMOP_RAISE_INVALID_OPCODE(); \
     234        else IEMOP_RAISE_INVALID_OPCODE_RET(); \
    235235    } while (0)
    236236#endif
     
    291291    { \
    292292        if (!IEM_IS_REAL_OR_V86_MODE(pVCpu)) { /* likely */ } \
    293         else return IEMOP_RAISE_INVALID_OPCODE(); \
     293        else IEMOP_RAISE_INVALID_OPCODE_RET(); \
    294294    } while (0)
    295295
     
    312312                pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = a_InsDiagPrefix##_RealOrV86Mode; \
    313313                Log5((a_szInstr ": Real or v8086 mode -> #UD\n")); \
    314                 return IEMOP_RAISE_INVALID_OPCODE(); \
     314                IEMOP_RAISE_INVALID_OPCODE_RET(); \
    315315            } \
    316316            if (IEM_IS_LONG_MODE(pVCpu) && !IEM_IS_64BIT_CODE(pVCpu)) \
     
    318318                pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = a_InsDiagPrefix##_LongModeCS; \
    319319                Log5((a_szInstr ": Long mode without 64-bit code segment -> #UD\n")); \
    320                 return IEMOP_RAISE_INVALID_OPCODE(); \
     320                IEMOP_RAISE_INVALID_OPCODE_RET(); \
    321321            } \
    322322        } \
     
    336336            pVCpu->cpum.GstCtx.hwvirt.vmx.enmDiag = a_InsDiagPrefix##_VmxRoot; \
    337337            Log5((a_szInstr ": Not in VMX operation (root mode) -> #UD\n")); \
    338             return IEMOP_RAISE_INVALID_OPCODE(); \
     338            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    339339        } \
    340340    } while (0)
     
    349349        { /* likely */ } \
    350350        else \
    351             return IEMOP_RAISE_INVALID_OPCODE(); \
     351            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    352352    } while (0)
    353353
     
    360360        { /* likely */ } \
    361361        else \
    362             return IEMOP_RAISE_INVALID_OPCODE(); \
     362            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    363363    } while (0)
    364364
     
    422422        { /* likely */ } \
    423423        else \
    424             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     424            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    425425    } while (0)
    426426
     
    436436        { /* likely */ } \
    437437        else \
    438             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     438            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    439439    } while (0)
    440440
     
    451451        { /* likely */ } \
    452452        else \
    453             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     453            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    454454    } while (0)
    455455
     
    469469        { /* likely */ } \
    470470        else \
    471             return IEMOP_RAISE_INVALID_OPCODE(); \
     471            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    472472    } while (0)
    473473
     
    487487        { /* likely */ } \
    488488        else \
    489             return IEMOP_RAISE_INVALID_OPCODE(); \
     489            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    490490    } while (0)
    491491
     
    506506        { /* likely */ } \
    507507        else \
    508             return IEMOP_RAISE_INVALID_OPCODE(); \
     508            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    509509    } while (0)
    510510
     
    526526        { /* likely */ } \
    527527        else \
    528             return IEMOP_RAISE_INVALID_OPCODE(); \
     528            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    529529    } while (0)
    530530
     
    537537        { \
    538538            NOREF(a_uDisOpNo); NOREF(a_fIemOpFlags); NOREF(a_uDisParam0); NOREF(a_fDisOpType); \
    539             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     539            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    540540        } \
    541541    } while (0)
     
    548548        { \
    549549            NOREF(a_uDisOpNo); NOREF(a_fIemOpFlags); NOREF(a_uDisParam0); NOREF(a_uDisParam1); NOREF(a_fDisOpType); \
    550             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     550            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    551551        } \
    552552    } while (0)
     
    562562        { /* likely */ } \
    563563        else \
    564             return IEMOP_RAISE_INVALID_OPCODE(); \
     564            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    565565    } while (0)
    566566
     
    575575        { /* likely */ } \
    576576        else \
    577             return IEMOP_RAISE_INVALID_OPCODE(); \
     577            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    578578    } while (0)
    579579
     
    587587        { /* likely */ } \
    588588        else \
    589             return IEMOP_RAISE_INVALID_OPCODE(); \
     589            IEMOP_RAISE_INVALID_OPCODE_RET(); \
    590590    } while (0)
    591591
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