VirtualBox

Changeset 103698 in vbox for trunk/src/VBox/Disassembler


Ignore:
Timestamp:
Mar 6, 2024 10:20:15 AM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162065
Message:

DIS: Added a bunch of missing group 7 instructions and rearranged the tables. bugref:10376

Location:
trunk/src/VBox/Disassembler
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore-x86-amd64.cpp

    r103511 r103698  
    20292029    uint8_t rm    = MODRM_RM(modrm);
    20302030
    2031     if (mod == 3 && rm == 0)
    2032         pOp = &g_aMapX86_Group7_mod11_rm000[reg];
    2033     else
    2034     if (mod == 3 && rm == 1)
    2035         pOp = &g_aMapX86_Group7_mod11_rm001[reg];
    2036     else
     2031    if (mod != 3)
    20372032        pOp = &g_aMapX86_Group7_mem[reg];
     2033    else if (reg == 0)
     2034        pOp = &g_aMapX86_Group7_mod11_reg000[rm];
     2035    else if (reg == 1)
     2036        pOp = &g_aMapX86_Group7_mod11_reg001[rm];
     2037    else if (reg == 2)
     2038        pOp = &g_aMapX86_Group7_mod11_reg010[rm];
     2039    else if (reg == 7)
     2040        pOp = &g_aMapX86_Group7_mod11_reg111[rm];
     2041    else if (reg == 4 || reg == 6)
     2042        pOp = &g_aMapX86_Group7_mem[reg];
     2043    else
     2044        pOp = &g_InvalidOpcode[0];
    20382045
    20392046    /* Cannot easily skip this hack because of monitor and vmcall! */
  • trunk/src/VBox/Disassembler/DisasmInternal-x86-amd64.h

    r103511 r103698  
    192192extern const DISOPCODE g_aMapX86_Group6[8];
    193193extern const DISOPCODE g_aMapX86_Group7_mem[8];
    194 extern const DISOPCODE g_aMapX86_Group7_mod11_rm000[8];
    195 extern const DISOPCODE g_aMapX86_Group7_mod11_rm001[8];
     194extern const DISOPCODE g_aMapX86_Group7_mod11_reg000[8];
     195extern const DISOPCODE g_aMapX86_Group7_mod11_reg001[8];
     196extern const DISOPCODE g_aMapX86_Group7_mod11_reg010[8];
     197extern const DISOPCODE g_aMapX86_Group7_mod11_reg111[8];
    196198extern const DISOPCODE g_aMapX86_Group8[8];
    197199extern const DISOPCODE g_aMapX86_Group9[8];
  • trunk/src/VBox/Disassembler/DisasmTables-x86-amd64.cpp

    r103599 r103698  
    30573057};
    30583058
    3059 /* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
    3060 const DISOPCODE g_aMapX86_Group7_mod11_rm000[8] =
    3061 {
    3062     /* 0F 01 MOD=11b */
    3063     INVALID_OPCODE,
    3064     OP("monitor %eAX,%eCX,%eDX", IDX_ParseFixedReg, IDX_ParseFixedReg, IDX_ParseFixedReg,          OP_MONITOR,         OP_PARM_REG_EAX, OP_PARM_REG_ECX, OP_PARM_REG_EDX,    DISOPTYPE_HARMLESS ),
     3059const DISOPCODE g_aMapX86_Group7_mod11_reg000[8] =
     3060{
     3061    OP("enclv",              0,                  0,          0,          OP_ENCLV,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3062    OP("vmcall",             0,                  0,          0,          OP_VMCALL,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3063    OP("vmlaunch",           0,                  0,          0,          OP_VMLAUNCH, OP_PARM_NONE,      OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3064    OP("vmresume",           0,                  0,          0,          OP_VMRESUME, OP_PARM_NONE,      OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3065    OP("vmoff",              0,                  0,          0,          OP_VMOFF,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3066    INVALID_OPCODE,
     3067    INVALID_OPCODE,
     3068    INVALID_OPCODE,
     3069};
     3070
     3071const DISOPCODE g_aMapX86_Group7_mod11_reg001[8] =
     3072{
     3073    OP("monitor %eAX,%eCX,%eDX", IDX_ParseFixedReg, IDX_ParseFixedReg, IDX_ParseFixedReg, OP_MONITOR, OP_PARM_REG_EAX, OP_PARM_REG_ECX, OP_PARM_REG_EDX, DISOPTYPE_HARMLESS ),
     3074    OP("mwait %eAX,%eCX",    IDX_ParseFixedReg,  IDX_ParseFixedReg, 0,  OP_MWAIT,    OP_PARM_REG_EAX,    OP_PARM_REG_ECX, OP_PARM_NONE,  DISOPTYPE_HARMLESS ),
     3075    OP("clac",               0,                  0,          0,         OP_CLAC,     OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3076    OP("stac",               0,                  0,          0,         OP_STAC,     OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3077    INVALID_OPCODE,
     3078    INVALID_OPCODE,
     3079    INVALID_OPCODE,
     3080    OP("encls",              0,                  0,          0,         OP_ENCLS,    OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3081};
     3082
     3083const DISOPCODE g_aMapX86_Group7_mod11_reg010[8] =
     3084{
    30653085    OP("xgetbv",             0,                  0,          0,          OP_XGETBV,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ), /* fixed ops: ECX & EDX:EAX like wrmsr we don't details these */
    3066     INVALID_OPCODE,
    3067     OP("smsw %Ew",           IDX_ParseModRM,     0,          0,          OP_SMSW,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP),
    3068     INVALID_OPCODE,
    3069     OP("lmsw %Ew",           IDX_ParseModRM,     0,          0,          OP_LMSW,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED),
    3070     OP("swapgs",             0,                  0,          0,          OP_SWAPGS,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS )
    3071 };
    3072 
    3073 /* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
    3074 const DISOPCODE g_aMapX86_Group7_mod11_rm001[8] =
    3075 {
    3076     /* 0F 01 MOD=11b */
    3077     OP("vmcall",             0,                  0,          0,          OP_VMCALL,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
    3078     OP("mwait %eAX,%eCX",    IDX_ParseFixedReg,  IDX_ParseFixedReg, 0,   OP_MWAIT,   OP_PARM_REG_EAX,    OP_PARM_REG_ECX,OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
    30793086    OP("xsetbv",             0,                  0,          0,          OP_XSETBV,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ), /* fixed ops: ECX & EDX:EAX like wrmsr we don't details these */
    3080     OP("vmmcall",            0,                  0,          0,          OP_VMMCALL, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
    3081     OP("smsw %Ew",           IDX_ParseModRM,     0,          0,          OP_SMSW,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP),
    3082     INVALID_OPCODE,
    3083     OP("lmsw %Ew",           IDX_ParseModRM,     0,          0,          OP_LMSW,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED),
    3084     OP("rdtscp",             0,                  0,          0,          OP_RDTSCP, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_POTENTIALLY_DANGEROUS ),
     3087    INVALID_OPCODE,
     3088    INVALID_OPCODE,
     3089    OP("vmfunc",             0,                  0,          0,          OP_VMFUNC,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3090    OP("xend",               0,                  0,          0,          OP_XEND,    OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3091    OP("xtest",              0,                  0,          0,          OP_XTEST,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3092    OP("enclu",              0,                  0,          0,          OP_ENCLU,   OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3093};
     3094
     3095const DISOPCODE g_aMapX86_Group7_mod11_reg111[8] =
     3096{
     3097    OP("swapgs",             0,                  0,          0,          OP_SWAPGS,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
     3098    OP("rdtscp",             0,                  0,          0,          OP_RDTSCP,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_POTENTIALLY_DANGEROUS ),
     3099    INVALID_OPCODE,
     3100    INVALID_OPCODE,
     3101    INVALID_OPCODE,
     3102    INVALID_OPCODE,
     3103    INVALID_OPCODE,
     3104    INVALID_OPCODE,
    30853105};
    30863106
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm

    r103599 r103698  
    490490        vpsrldq xmm1, xmm2, 3
    491491
     492        ; group 7 stuff.
     493        vmcall
     494        vmlaunch
     495        vmresume
     496        vmxoff
     497        monitor
     498        mwait
     499        clac
     500        stac
     501        encls
     502        xgetbv
     503        xsetbv
     504        vmfunc
     505        xend
     506        xtest
     507        enclu
     508        swpgs
     509        rdtscp
     510
    492511        ret
    493512ENDPROC   TestProc64
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