VirtualBox

vbox的更動 60384 路徑 trunk/src/VBox/VMM


忽略:
時間撮記:
2016-4-8 上午12:16:58 (9 年 以前)
作者:
vboxsync
訊息:

IEM: Marked instructions introduced by the 186, 286, 386 and 486 to speed up debugging bs3kit on the 286.

位置:
trunk/src/VBox/VMM
檔案:
修改 5 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r60189 r60384  
    93449344 */
    93459345
     9346#ifdef IN_RING3
     9347# define IEMOP_HLP_MIN_CPU(a_uMinCpu, a_fOnlyIf) \
     9348    do { \
     9349        if (IEM_GET_TARGET_CPU(pIemCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
     9350        else \
     9351        { \
     9352            DBGFSTOP(IEMCPU_TO_VM(pIemCpu)); \
     9353            return IEMOP_RAISE_INVALID_OPCODE(); \
     9354        } \
     9355    } while (0)
     9356#else
     9357# define IEMOP_HLP_MIN_CPU(a_uMinCpu, a_fOnlyIf) \
     9358    do { \
     9359        if (IEM_GET_TARGET_CPU(pIemCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
     9360        else return IEMOP_RAISE_INVALID_OPCODE(); \
     9361    } while (0)
     9362#endif
     9363
     9364/** The instruction requires a 186 or later. */
     9365#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_186
     9366# define IEMOP_HLP_MIN_186() do { } while (0)
     9367#else
     9368# define IEMOP_HLP_MIN_186() IEMOP_HLP_MIN_CPU(IEMTARGETCPU_186, true)
     9369#endif
     9370
     9371/** The instruction requires a 286 or later. */
     9372#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_286
     9373# define IEMOP_HLP_MIN_286() do { } while (0)
     9374#else
     9375# define IEMOP_HLP_MIN_286() IEMOP_HLP_MIN_CPU(IEMTARGETCPU_286, true)
     9376#endif
     9377
     9378/** The instruction requires a 386 or later. */
     9379#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_386
     9380# define IEMOP_HLP_MIN_386() do { } while (0)
     9381#else
     9382# define IEMOP_HLP_MIN_386() IEMOP_HLP_MIN_CPU(IEMTARGETCPU_386, true)
     9383#endif
     9384
     9385/** The instruction requires a 386 or later if the given expression is true. */
     9386#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_386
     9387# define IEMOP_HLP_MIN_386_EX(a_fOnlyIf) do { } while (0)
     9388#else
     9389# define IEMOP_HLP_MIN_386_EX(a_fOnlyIf) IEMOP_HLP_MIN_CPU(IEMTARGETCPU_386, a_fOnlyIf)
     9390#endif
     9391
     9392/** The instruction requires a 486 or later. */
     9393#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_486
     9394# define IEMOP_HLP_MIN_486() do { } while (0)
     9395#else
     9396# define IEMOP_HLP_MIN_486() IEMOP_HLP_MIN_CPU(IEMTARGETCPU_486, true)
     9397#endif
     9398
     9399/** The instruction requires a Pentium (586) or later. */
     9400#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_586
     9401# define IEMOP_HLP_MIN_586() do { } while (0)
     9402#else
     9403# define IEMOP_HLP_MIN_586() IEMOP_HLP_MIN_CPU(IEMTARGETCPU_586, true)
     9404#endif
     9405
     9406/** The instruction requires a PentiumPro (686) or later. */
     9407#if IEM_CFG_TARGET_CPU >= IEMTARGETCPU_686
     9408# define IEMOP_HLP_MIN_686() do { } while (0)
     9409#else
     9410# define IEMOP_HLP_MIN_686() IEMOP_HLP_MIN_CPU(IEMTARGETCPU_686, true)
     9411#endif
     9412
     9413
    93469414/** The instruction raises an \#UD in real and V8086 mode. */
    93479415#define IEMOP_HLP_NO_REAL_OR_V86_MODE() \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r60188 r60384  
    541541{
    542542    IEMOP_MNEMONIC("sldt Rv/Mw");
     543    IEMOP_HLP_MIN_286();
    543544    IEMOP_HLP_NO_REAL_OR_V86_MODE();
    544545
     
    598599{
    599600    IEMOP_MNEMONIC("str Rv/Mw");
     601    IEMOP_HLP_MIN_286();
    600602    IEMOP_HLP_NO_REAL_OR_V86_MODE();
    601603
     
    655657{
    656658    IEMOP_MNEMONIC("lldt Ew");
     659    IEMOP_HLP_MIN_286();
    657660    IEMOP_HLP_NO_REAL_OR_V86_MODE();
    658661
     
    686689{
    687690    IEMOP_MNEMONIC("ltr Ew");
     691    IEMOP_HLP_MIN_286();
    688692    IEMOP_HLP_NO_REAL_OR_V86_MODE();
    689693
     
    716720FNIEMOP_DEF_2(iemOpCommonGrp6VerX, uint8_t, bRm, bool, fWrite)
    717721{
     722    IEMOP_HLP_MIN_286();
    718723    IEMOP_HLP_NO_REAL_OR_V86_MODE();
    719724
     
    748753{
    749754    IEMOP_MNEMONIC("verr Ew");
     755    IEMOP_HLP_MIN_286();
    750756    return FNIEMOP_CALL_2(iemOpCommonGrp6VerX, bRm, false);
    751757}
     
    756762{
    757763    IEMOP_MNEMONIC("verr Ew");
     764    IEMOP_HLP_MIN_286();
    758765    return FNIEMOP_CALL_2(iemOpCommonGrp6VerX, bRm, true);
    759766}
     
    784791{
    785792    IEMOP_MNEMONIC("sgdt Ms");
     793    IEMOP_HLP_MIN_286();
    786794    IEMOP_HLP_64BIT_OP_SIZE();
    787795    IEM_MC_BEGIN(3, 1);
     
    834842{
    835843    IEMOP_MNEMONIC("sidt Ms");
     844    IEMOP_HLP_MIN_286();
    836845    IEMOP_HLP_64BIT_OP_SIZE();
    837846    IEM_MC_BEGIN(3, 1);
     
    957966{
    958967    IEMOP_MNEMONIC("smsw");
     968    IEMOP_HLP_MIN_286();
    959969    IEMOP_HLP_NO_LOCK_PREFIX();
    960970    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    10141024       lower 3-bits are used. */
    10151025    IEMOP_MNEMONIC("lmsw");
     1026    IEMOP_HLP_MIN_286();
    10161027    IEMOP_HLP_NO_LOCK_PREFIX();
    10171028    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    10411052{
    10421053    IEMOP_MNEMONIC("invlpg");
     1054    IEMOP_HLP_MIN_486();
    10431055    IEMOP_HLP_NO_LOCK_PREFIX();
    10441056    IEM_MC_BEGIN(1, 1);
     
    10551067{
    10561068    IEMOP_MNEMONIC("swapgs");
     1069    IEMOP_HLP_ONLY_64BIT();
    10571070    IEMOP_HLP_NO_LOCK_PREFIX();
    1058     IEMOP_HLP_ONLY_64BIT();
    10591071    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_swapgs);
    10601072}
     
    12671279
    12681280
    1269 /** Opcode 0x0f 0x04. */
     1281/** Opcode 0x0f 0x05. */
    12701282FNIEMOP_DEF(iemOp_syscall)
    12711283{
    1272     IEMOP_MNEMONIC("syscall");
     1284    IEMOP_MNEMONIC("syscall"); /** @todo 286 LOADALL   */
    12731285    IEMOP_HLP_NO_LOCK_PREFIX();
    12741286    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_syscall);
     
    12761288
    12771289
    1278 /** Opcode 0x0f 0x05. */
     1290/** Opcode 0x0f 0x06. */
    12791291FNIEMOP_DEF(iemOp_clts)
    12801292{
     
    12851297
    12861298
    1287 /** Opcode 0x0f 0x06. */
     1299/** Opcode 0x0f 0x07. */
    12881300FNIEMOP_DEF(iemOp_sysret)
    12891301{
    1290     IEMOP_MNEMONIC("sysret");
     1302    IEMOP_MNEMONIC("sysret");  /** @todo 386 LOADALL   */
    12911303    IEMOP_HLP_NO_LOCK_PREFIX();
    12921304    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_sysret);
     
    12961308/** Opcode 0x0f 0x08. */
    12971309FNIEMOP_STUB(iemOp_invd);
     1310// IEMOP_HLP_MIN_486();
    12981311
    12991312
     
    13021315{
    13031316    IEMOP_MNEMONIC("wbinvd");
     1317    IEMOP_HLP_MIN_486();
    13041318    IEMOP_HLP_NO_LOCK_PREFIX();
    13051319    IEM_MC_BEGIN(0, 0);
     
    15551569    /* mod is ignored, as is operand size overrides. */
    15561570    IEMOP_MNEMONIC("mov Rd,Cd");
     1571    IEMOP_HLP_MIN_386();
    15571572    if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    15581573        pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT;
     
    15861601{
    15871602    IEMOP_MNEMONIC("mov Rd,Dd");
     1603    IEMOP_HLP_MIN_386();
    15881604    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    15891605    IEMOP_HLP_NO_LOCK_PREFIX();
     
    16011617    /* mod is ignored, as is operand size overrides. */
    16021618    IEMOP_MNEMONIC("mov Cd,Rd");
     1619    IEMOP_HLP_MIN_386();
    16031620    if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    16041621        pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT;
     
    16321649{
    16331650    IEMOP_MNEMONIC("mov Dd,Rd");
     1651    IEMOP_HLP_MIN_386();
    16341652    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    16351653    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     
    16461664{
    16471665    IEMOP_MNEMONIC("mov Rd,Td");
     1666    /** @todo works on 386 and 486. */
    16481667    /* The RM byte is not considered, see testcase. */
    16491668    return IEMOP_RAISE_INVALID_OPCODE();
     
    16551674{
    16561675    IEMOP_MNEMONIC("mov Td,Rd");
     1676    /** @todo works on 386 and 486. */
    16571677    /* The RM byte is not considered, see testcase. */
    16581678    return IEMOP_RAISE_INVALID_OPCODE();
     
    31223142{
    31233143    IEMOP_MNEMONIC("jo  Jv");
     3144    IEMOP_HLP_MIN_386();
    31243145    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    31253146    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    31573178{
    31583179    IEMOP_MNEMONIC("jno Jv");
     3180    IEMOP_HLP_MIN_386();
    31593181    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    31603182    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    31923214{
    31933215    IEMOP_MNEMONIC("jc/jb/jnae Jv");
     3216    IEMOP_HLP_MIN_386();
    31943217    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    31953218    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    32273250{
    32283251    IEMOP_MNEMONIC("jnc/jnb/jae Jv");
     3252    IEMOP_HLP_MIN_386();
    32293253    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    32303254    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    32623286{
    32633287    IEMOP_MNEMONIC("je/jz Jv");
     3288    IEMOP_HLP_MIN_386();
    32643289    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    32653290    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    32973322{
    32983323    IEMOP_MNEMONIC("jne/jnz Jv");
     3324    IEMOP_HLP_MIN_386();
    32993325    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    33003326    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    33323358{
    33333359    IEMOP_MNEMONIC("jbe/jna Jv");
     3360    IEMOP_HLP_MIN_386();
    33343361    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    33353362    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    33673394{
    33683395    IEMOP_MNEMONIC("jnbe/ja Jv");
     3396    IEMOP_HLP_MIN_386();
    33693397    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    33703398    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    34023430{
    34033431    IEMOP_MNEMONIC("js  Jv");
     3432    IEMOP_HLP_MIN_386();
    34043433    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    34053434    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    34373466{
    34383467    IEMOP_MNEMONIC("jns Jv");
     3468    IEMOP_HLP_MIN_386();
    34393469    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    34403470    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    34723502{
    34733503    IEMOP_MNEMONIC("jp  Jv");
     3504    IEMOP_HLP_MIN_386();
    34743505    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    34753506    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    35073538{
    35083539    IEMOP_MNEMONIC("jo  Jv");
     3540    IEMOP_HLP_MIN_386();
    35093541    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    35103542    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    35423574{
    35433575    IEMOP_MNEMONIC("jl/jnge Jv");
     3576    IEMOP_HLP_MIN_386();
    35443577    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    35453578    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    35773610{
    35783611    IEMOP_MNEMONIC("jnl/jge Jv");
     3612    IEMOP_HLP_MIN_386();
    35793613    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    35803614    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    36123646{
    36133647    IEMOP_MNEMONIC("jle/jng Jv");
     3648    IEMOP_HLP_MIN_386();
    36143649    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    36153650    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    36473682{
    36483683    IEMOP_MNEMONIC("jnle/jg Jv");
     3684    IEMOP_HLP_MIN_386();
    36493685    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    36503686    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    36823718{
    36833719    IEMOP_MNEMONIC("seto Eb");
     3720    IEMOP_HLP_MIN_386();
    36843721    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    36853722    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    37223759{
    37233760    IEMOP_MNEMONIC("setno Eb");
     3761    IEMOP_HLP_MIN_386();
    37243762    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    37253763    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    37623800{
    37633801    IEMOP_MNEMONIC("setc Eb");
     3802    IEMOP_HLP_MIN_386();
    37643803    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    37653804    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    38023841{
    38033842    IEMOP_MNEMONIC("setnc Eb");
     3843    IEMOP_HLP_MIN_386();
    38043844    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    38053845    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    38423882{
    38433883    IEMOP_MNEMONIC("sete Eb");
     3884    IEMOP_HLP_MIN_386();
    38443885    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    38453886    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    38823923{
    38833924    IEMOP_MNEMONIC("setne Eb");
     3925    IEMOP_HLP_MIN_386();
    38843926    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    38853927    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    39223964{
    39233965    IEMOP_MNEMONIC("setbe Eb");
     3966    IEMOP_HLP_MIN_386();
    39243967    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    39253968    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    39624005{
    39634006    IEMOP_MNEMONIC("setnbe Eb");
     4007    IEMOP_HLP_MIN_386();
    39644008    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    39654009    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    40024046{
    40034047    IEMOP_MNEMONIC("sets Eb");
     4048    IEMOP_HLP_MIN_386();
    40044049    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    40054050    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    40424087{
    40434088    IEMOP_MNEMONIC("setns Eb");
     4089    IEMOP_HLP_MIN_386();
    40444090    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    40454091    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    40824128{
    40834129    IEMOP_MNEMONIC("setnp Eb");
     4130    IEMOP_HLP_MIN_386();
    40844131    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    40854132    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    41224169{
    41234170    IEMOP_MNEMONIC("setnp Eb");
     4171    IEMOP_HLP_MIN_386();
    41244172    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    41254173    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    41624210{
    41634211    IEMOP_MNEMONIC("setl Eb");
     4212    IEMOP_HLP_MIN_386();
    41644213    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    41654214    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    42024251{
    42034252    IEMOP_MNEMONIC("setnl Eb");
     4253    IEMOP_HLP_MIN_386();
    42044254    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    42054255    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    42424292{
    42434293    IEMOP_MNEMONIC("setle Eb");
     4294    IEMOP_HLP_MIN_386();
    42444295    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    42454296    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    42824333{
    42834334    IEMOP_MNEMONIC("setnle Eb");
     4335    IEMOP_HLP_MIN_386();
    42844336    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    42854337    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
     
    43664418{
    43674419    IEMOP_MNEMONIC("push fs");
     4420    IEMOP_HLP_MIN_386();
    43684421    IEMOP_HLP_NO_LOCK_PREFIX();
    43694422    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_FS);
     
    43754428{
    43764429    IEMOP_MNEMONIC("pop fs");
     4430    IEMOP_HLP_MIN_386();
    43774431    IEMOP_HLP_NO_LOCK_PREFIX();
    43784432    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_FS, pIemCpu->enmEffOpSize);
     
    43844438{
    43854439    IEMOP_MNEMONIC("cpuid");
     4440    IEMOP_HLP_MIN_486(); /* not all 486es. */
    43864441    IEMOP_HLP_NO_LOCK_PREFIX();
    43874442    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_cpuid);
     
    45714626{
    45724627    IEMOP_MNEMONIC("bt  Gv,Gv");
     4628    IEMOP_HLP_MIN_386();
    45734629    return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_bt);
    45744630}
     
    48714927{
    48724928    IEMOP_MNEMONIC("shld Ev,Gv,Ib");
     4929    IEMOP_HLP_MIN_386();
    48734930    return FNIEMOP_CALL_1(iemOpCommonShldShrd_Ib, &g_iemAImpl_shld);
    48744931}
    48754932
    48764933
    4877 /** Opcode 0x0f 0xa7. */
     4934/** Opcode 0x0f 0xa5. */
    48784935FNIEMOP_DEF(iemOp_shld_Ev_Gv_CL)
    48794936{
    48804937    IEMOP_MNEMONIC("shld Ev,Gv,CL");
     4938    IEMOP_HLP_MIN_386();
    48814939    return FNIEMOP_CALL_1(iemOpCommonShldShrd_CL, &g_iemAImpl_shld);
    48824940}
     
    48874945{
    48884946    IEMOP_MNEMONIC("push gs");
     4947    IEMOP_HLP_MIN_386();
    48894948    IEMOP_HLP_NO_LOCK_PREFIX();
    48904949    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_GS);
     
    48964955{
    48974956    IEMOP_MNEMONIC("pop gs");
     4957    IEMOP_HLP_MIN_386();
    48984958    IEMOP_HLP_NO_LOCK_PREFIX();
    48994959    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_GS, pIemCpu->enmEffOpSize);
     
    49034963/** Opcode 0x0f 0xaa. */
    49044964FNIEMOP_STUB(iemOp_rsm);
     4965//IEMOP_HLP_MIN_386();
    49054966
    49064967
     
    49094970{
    49104971    IEMOP_MNEMONIC("bts Ev,Gv");
     4972    IEMOP_HLP_MIN_386();
    49114973    return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_bts);
    49124974}
     
    49174979{
    49184980    IEMOP_MNEMONIC("shrd Ev,Gv,Ib");
     4981    IEMOP_HLP_MIN_386();
    49194982    return FNIEMOP_CALL_1(iemOpCommonShldShrd_Ib, &g_iemAImpl_shrd);
    49204983}
     
    49254988{
    49264989    IEMOP_MNEMONIC("shrd Ev,Gv,CL");
     4990    IEMOP_HLP_MIN_386();
    49274991    return FNIEMOP_CALL_1(iemOpCommonShldShrd_CL, &g_iemAImpl_shrd);
    49284992}
     
    50615125FNIEMOP_DEF(iemOp_Grp15)
    50625126{
     5127    IEMOP_HLP_MIN_586(); /* Not entirely accurate nor needed, but useful for debugging 286 code. */
    50635128    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    50645129    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    51225187{
    51235188    IEMOP_MNEMONIC("imul Gv,Ev");
     5189    IEMOP_HLP_MIN_386();
    51245190    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
    51255191    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_imul_two);
     
    51315197{
    51325198    IEMOP_MNEMONIC("cmpxchg Eb,Gb");
     5199    IEMOP_HLP_MIN_486();
    51335200    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    51345201
     
    51895256{
    51905257    IEMOP_MNEMONIC("cmpxchg Ev,Gv");
     5258    IEMOP_HLP_MIN_486();
    51915259    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    51925260
     
    54465514{
    54475515    IEMOP_MNEMONIC("lss Gv,Mp");
     5516    IEMOP_HLP_MIN_386();
    54485517    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    54495518    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    54655534{
    54665535    IEMOP_MNEMONIC("lfs Gv,Mp");
     5536    IEMOP_HLP_MIN_386();
    54675537    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    54685538    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    54765546{
    54775547    IEMOP_MNEMONIC("lgs Gv,Mp");
     5548    IEMOP_HLP_MIN_386();
    54785549    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    54795550    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    54875558{
    54885559    IEMOP_MNEMONIC("movzx Gv,Eb");
     5560    IEMOP_HLP_MIN_386();
    54895561
    54905562    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    55785650{
    55795651    IEMOP_MNEMONIC("movzx Gv,Ew");
     5652    IEMOP_HLP_MIN_386();
    55805653
    55815654    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    56565729FNIEMOP_DEF(iemOp_Grp8)
    56575730{
     5731    IEMOP_HLP_MIN_386();
    56585732    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    56595733    PCIEMOPBINSIZES pImpl;
     
    58205894{
    58215895    IEMOP_MNEMONIC("btc Ev,Gv");
     5896    IEMOP_HLP_MIN_386();
    58225897    return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_btc);
    58235898}
     
    58285903{
    58295904    IEMOP_MNEMONIC("bsf Gv,Ev");
     5905    IEMOP_HLP_MIN_386();
    58305906    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
    58315907    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_bsf);
     
    58375913{
    58385914    IEMOP_MNEMONIC("bsr Gv,Ev");
     5915    IEMOP_HLP_MIN_386();
    58395916    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
    58405917    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_bsr);
     
    58465923{
    58475924    IEMOP_MNEMONIC("movsx Gv,Eb");
     5925    IEMOP_HLP_MIN_386();
    58485926
    58495927    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    59376015{
    59386016    IEMOP_MNEMONIC("movsx Gv,Ew");
     6017    IEMOP_HLP_MIN_386();
    59396018
    59406019    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    60046083{
    60056084    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     6085    IEMOP_HLP_MIN_486();
    60066086    IEMOP_MNEMONIC("xadd Eb,Gb");
    60076087
     
    60636143{
    60646144    IEMOP_MNEMONIC("xadd Ev,Gv");
     6145    IEMOP_HLP_MIN_486();
    60656146    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    60666147
     
    63856466             prefix.  REX.B is the correct prefix it appears.  For a parallel
    63866467             case, see iemOp_mov_AL_Ib and iemOp_mov_eAX_Iv. */
     6468    IEMOP_HLP_MIN_486();
    63876469    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xAX | pIemCpu->uRexB);
    63886470}
     
    63936475{
    63946476    IEMOP_MNEMONIC("bswap rCX/r9");
     6477    IEMOP_HLP_MIN_486();
    63956478    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xCX | pIemCpu->uRexB);
    63966479}
     
    64016484{
    64026485    IEMOP_MNEMONIC("bswap rDX/r9");
     6486    IEMOP_HLP_MIN_486();
    64036487    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDX | pIemCpu->uRexB);
    64046488}
     
    64096493{
    64106494    IEMOP_MNEMONIC("bswap rBX/r9");
     6495    IEMOP_HLP_MIN_486();
    64116496    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBX | pIemCpu->uRexB);
    64126497}
     
    64176502{
    64186503    IEMOP_MNEMONIC("bswap rSP/r12");
     6504    IEMOP_HLP_MIN_486();
    64196505    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSP | pIemCpu->uRexB);
    64206506}
     
    64256511{
    64266512    IEMOP_MNEMONIC("bswap rBP/r13");
     6513    IEMOP_HLP_MIN_486();
    64276514    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBP | pIemCpu->uRexB);
    64286515}
     
    64336520{
    64346521    IEMOP_MNEMONIC("bswap rSI/r14");
     6522    IEMOP_HLP_MIN_486();
    64356523    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSI | pIemCpu->uRexB);
    64366524}
     
    64416529{
    64426530    IEMOP_MNEMONIC("bswap rDI/r15");
     6531    IEMOP_HLP_MIN_486();
    64436532    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDI | pIemCpu->uRexB);
    64446533}
     
    69997088{
    70007089    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     7090    /** @todo PUSH CS on 8086, undefined on 80186. */
     7091    IEMOP_HLP_MIN_286();
    70017092    return FNIEMOP_CALL(g_apfnTwoByteMap[b]);
    70027093}
     
    80848175{
    80858176    IEMOP_MNEMONIC("pusha");
     8177    IEMOP_HLP_MIN_186();
    80868178    IEMOP_HLP_NO_64BIT();
    80878179    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    80968188{
    80978189    IEMOP_MNEMONIC("popa");
     8190    IEMOP_HLP_MIN_186();
    80988191    IEMOP_HLP_NO_64BIT();
    80998192    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     
    81068199/** Opcode 0x62. */
    81078200FNIEMOP_STUB(iemOp_bound_Gv_Ma_evex);
     8201//    IEMOP_HLP_MIN_186();
    81088202
    81098203
     
    81128206{
    81138207    IEMOP_MNEMONIC("arpl Ew,Gw");
     8208    IEMOP_HLP_MIN_286();
    81148209    IEMOP_HLP_NO_REAL_OR_V86_MODE();
    81158210    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    82058300{
    82068301    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg fs");
     8302    IEMOP_HLP_MIN_386();
     8303
    82078304    pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_FS;
    82088305    pIemCpu->iEffSeg    = X86_SREG_FS;
     
    82178314{
    82188315    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg gs");
     8316    IEMOP_HLP_MIN_386();
     8317
    82198318    pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_GS;
    82208319    pIemCpu->iEffSeg    = X86_SREG_GS;
     
    82298328{
    82308329    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("op size");
     8330    IEMOP_HLP_MIN_386();
     8331
    82318332    pIemCpu->fPrefixes |= IEM_OP_PRF_SIZE_OP;
    82328333    iemRecalEffOpSize(pIemCpu);
     
    82418342{
    82428343    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("addr size");
     8344    IEMOP_HLP_MIN_386();
     8345
    82438346    pIemCpu->fPrefixes |= IEM_OP_PRF_SIZE_ADDR;
    82448347    switch (pIemCpu->enmDefAddrMode)
     
    82598362{
    82608363    IEMOP_MNEMONIC("push Iz");
     8364    IEMOP_HLP_MIN_186();
    82618365    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    82628366    switch (pIemCpu->enmEffOpSize)
     
    83048408{
    83058409    IEMOP_MNEMONIC("imul Gv,Ev,Iz"); /* Gv = Ev * Iz; */
     8410    IEMOP_HLP_MIN_186();
    83068411    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    83078412    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
     
    84648569{
    84658570    IEMOP_MNEMONIC("push Ib");
     8571    IEMOP_HLP_MIN_186();
    84668572    int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
    84678573    IEMOP_HLP_NO_LOCK_PREFIX();
     
    84918597{
    84928598    IEMOP_MNEMONIC("imul Gv,Ev,Ib"); /* Gv = Ev * Iz; */
     8599    IEMOP_HLP_MIN_186();
    84938600    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    84948601    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
     
    86448751FNIEMOP_DEF(iemOp_insb_Yb_DX)
    86458752{
     8753    IEMOP_HLP_MIN_186();
    86468754    IEMOP_HLP_NO_LOCK_PREFIX();
    86478755    if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     
    86738781FNIEMOP_DEF(iemOp_inswd_Yv_DX)
    86748782{
     8783    IEMOP_HLP_MIN_186();
    86758784    IEMOP_HLP_NO_LOCK_PREFIX();
    86768785    if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     
    87348843FNIEMOP_DEF(iemOp_outsb_Yb_DX)
    87358844{
     8845    IEMOP_HLP_MIN_186();
    87368846    IEMOP_HLP_NO_LOCK_PREFIX();
    87378847    if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     
    87638873FNIEMOP_DEF(iemOp_outswd_Yv_DX)
    87648874{
     8875    IEMOP_HLP_MIN_186();
    87658876    IEMOP_HLP_NO_LOCK_PREFIX();
    87668877    if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     
    93739484    uint8_t bRm;   IEM_OPCODE_GET_NEXT_U8(&bRm);
    93749485    IEMOP_MNEMONIC2("add\0or\0\0adc\0sbb\0and\0sub\0xor\0cmp" + ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)*4, "Ev,Ib");
     9486    /* Note! Seems the OR, AND, and XOR instructions are present on CPUs prior
     9487             to the 386 even if absent in the intel reference manuals and some
     9488             3rd party opcode listings. */
    93759489    PCIEMOPBINSIZES pImpl = g_apIemImplGrp1[(bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK];
    93769490
     
    1176611880FNIEMOP_DEF(iemOp_Grp2_Eb_Ib)
    1176711881{
     11882    IEMOP_HLP_MIN_186();
    1176811883    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1176911884    PCIEMOPSHIFTSIZES pImpl;
     
    1182611941FNIEMOP_DEF(iemOp_Grp2_Ev_Ib)
    1182711942{
     11943    IEMOP_HLP_MIN_186();
    1182811944    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1182911945    PCIEMOPSHIFTSIZES pImpl;
     
    1216412280{
    1216512281    IEMOP_MNEMONIC("enter Iw,Ib");
     12282    IEMOP_HLP_MIN_186();
    1216612283    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1216712284    IEMOP_HLP_NO_LOCK_PREFIX();
     
    1217612293{
    1217712294    IEMOP_MNEMONIC("retn");
     12295    IEMOP_HLP_MIN_186();
    1217812296    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1217912297    IEMOP_HLP_NO_LOCK_PREFIX();
     
    1265612774{
    1265712775    IEMOP_MNEMONIC("salc");
     12776    IEMOP_HLP_MIN_286(); /* (undocument at the time) */
    1265812777    uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    1265912778    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     
    1620416323{
    1620516324    IEMOP_MNEMONIC("int1"); /* icebp */
     16325    IEMOP_HLP_MIN_386(); /** @todo does not generate #UD on 286, or so they say... */
    1620616326    /** @todo testcase! */
    1620716327    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, X86_XCPT_DB, false /*fIsBpInstr*/);
     
    1623916359{
    1624016360    IEMOP_HLP_NO_LOCK_PREFIX();
     16361#if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC && 0
     16362    if (   pIemCpu->uTargetCpu == IEMTARGETCPU_CURRENT
     16363        && pIemCpu->CTX_SUFF(pCtx)->cs.Sel <= 1000)
     16364    {
     16365        pIemCpu->uTargetCpu = IEMTARGETCPU_286;
     16366        LogAlways(("\niemOp_hlt: Enabled CPU restrictions!\n\n"));
     16367    }
     16368#endif
    1624116369    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_hlt);
    1624216370}
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r58122 r60384  
    7272         * Host and guest CPU information.
    7373         */
     74#if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
     75        pVCpu->iem.s.uTargetCpu = IEMTARGETCPU_CURRENT;
     76#endif
    7477        if (idCpu == 0)
    7578        {
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r60188 r60384  
    4848# define IEM_VERIFICATION_MODE_FULL
    4949#endif
     50
     51
     52/** @def IEM_CFG_TARGET_CPU
     53 * The minimum target CPU for the IEM emulation (IEMTARGETCPU_XXX value). The
     54 * default is the a "current" CPU, i.e. something newer than the pentium pro. By
     55 * twiddling this value, you can make IEM try behave like older CPUs which is
     56 * useful when checking software that needs to run on real old CPUs.
     57 */
     58#if !defined(IEM_CFG_TARGET_CPU) || defined(DOXYGEN_RUNNING)
     59# define IEM_CFG_TARGET_CPU IEMTARGETCPU_CURRENT
     60/*# define IEM_CFG_TARGET_CPU IEMTARGETCPU_DYNAMIC*/
     61#endif
     62
    5063
    5164
     
    382395    uint8_t                 offFpuOpcode;
    383396
    384     /** @}*/
     397    /** @} */
    385398
    386399    /** The number of active guest memory mappings. */
     
    451464    /** @name Target CPU information.
    452465     * @{ */
     466#if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
     467    /** The target CPU. */
     468    uint32_t                uTargetCpu;
     469#else
     470    uint32_t                u32TargetCpuPadding;
     471#endif
    453472    /** The CPU vendor. */
    454473    CPUMCPUVENDOR           enmCpuVendor;
     
    460479    CPUMCPUVENDOR           enmHostCpuVendor;
    461480    /** @} */
     481
     482    uint32_t                u32Alignment6; /**< Alignment padding. */
    462483
    463484#ifdef IEM_VERIFICATION_MODE_FULL
     
    490511 */
    491512#define IEMCPU_TO_VM(a_pIemCpu)     ((PVM)( (uintptr_t)(a_pIemCpu) + a_pIemCpu->offVM ))
     513
     514/** Gets the current IEMTARGETCPU value.
     515 * @returns IEMTARGETCPU value.
     516 * @param   a_pIemCpu       The IEM per CPU instance data.
     517 */
     518#if IEM_CFG_TARGET_CPU != IEMTARGETCPU_DYNAMIC
     519# define IEM_GET_TARGET_CPU(a_pIemCpu)   (IEM_CFG_TARGET_CPU)
     520#else
     521# define IEM_GET_TARGET_CPU(a_pIemCpu)   ((a_pIemCpu)->uTargetCpu)
     522#endif
    492523
    493524/** @name IEM_ACCESS_XXX - Access details.
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r57432 r60384  
    100100#define IEM_OPCODE_GET_NEXT_S32_SX_U64(a_pu64)              do { *(a_pu64) = g_bRandom; CHK_PTYPE(uint64_t *, a_pu64); } while (0)
    101101#define IEM_OPCODE_GET_NEXT_U64(a_pu64)                     do { *(a_pu64) = g_bRandom; CHK_PTYPE(uint64_t *, a_pu64); } while (0)
     102#define IEMOP_HLP_MIN_186()                                 do { } while (0)
     103#define IEMOP_HLP_MIN_286()                                 do { } while (0)
     104#define IEMOP_HLP_MIN_386()                                 do { } while (0)
     105#define IEMOP_HLP_MIN_386_EX(a_fTrue)                       do { } while (0)
     106#define IEMOP_HLP_MIN_486()                                 do { } while (0)
     107#define IEMOP_HLP_MIN_586()                                 do { } while (0)
     108#define IEMOP_HLP_MIN_686()                                 do { } while (0)
    102109#define IEMOP_HLP_NO_REAL_OR_V86_MODE()                     do { } while (0)
    103110#define IEMOP_HLP_NO_LOCK_PREFIX()                          do { } while (0)
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette