VirtualBox

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


Ignore:
Timestamp:
Mar 6, 2024 9:36:59 PM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162085
Message:

DIS: cmpxchg8b/16b fix

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

Legend:

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

    r103709 r103717  
    20752075
    20762076    uint8_t const bRm = disReadByte(pDis, offInstr);
    2077     uint8_t const idx = MODRM_REG(bRm);
     2077    uint8_t       idx = MODRM_REG(bRm);
    20782078    if (MODRM_MOD(bRm) != X86_MOD_REG)
    20792079    {
     
    20862086        }
    20872087        /** @todo bLastPrefix is also set for OP_SEG & OP_ADDRSIZE which aren't relevant here or to any other of the table */
    2088         else if (pDis->x86.bLastPrefix != OP_LOCK && pDis->x86.bLastPrefix != OP_REPNE)
     2088        else if (pDis->x86.bLastPrefix != OP_REPNE && (pDis->x86.bLastPrefix != OP_LOCK || idx == 1 /*cmpxchg8/16b*/))
     2089        {
     2090            if ((pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W) && (pDis->x86.fPrefix & DISPREFIX_REX))
     2091                idx += 8;
    20892092            pOp = &g_aMapX86_Group9_mem_none[idx];
     2093        }
    20902094        else
    20912095            pOp = &g_InvalidOpcode[0];
     
    24112415    {
    24122416        /* simple: no variations */
    2413         case OP_CMPXCHG8B: /* == OP_CMPXCHG16B? */
     2417        case OP_CMPXCHG8B:
     2418        case OP_CMPXCHG16B:
    24142419            return;
    24152420
  • trunk/src/VBox/Disassembler/DisasmInternal-x86-amd64.h

    r103709 r103717  
    201201extern const DISOPCODE g_aMapX86_Group7_mod11_reg111[8];
    202202extern const DISOPCODE g_aMapX86_Group8[8];
    203 extern const DISOPCODE g_aMapX86_Group9_mem_none[8];
     203extern const DISOPCODE g_aMapX86_Group9_mem_none[8*2];
    204204extern const DISOPCODE g_aMapX86_Group9_mem_66[8];
    205205extern const DISOPCODE g_aMapX86_Group9_mem_f3[8];
  • trunk/src/VBox/Disassembler/DisasmTables-x86-amd64.cpp

    r103709 r103717  
    31183118};
    31193119
    3120 /* 0F C7 mode=mem index by /reg - w/o SSE prefix */
    3121 const DISOPCODE g_aMapX86_Group9_mem_none[8] =
    3122 {
     3120/* 0F C7 mode=mem index by /reg + REX.W*8 - w/o SSE prefix */
     3121const DISOPCODE g_aMapX86_Group9_mem_none[8 * 2] =
     3122{
     3123    /* REX.W = 0 */
    31233124    INVALID_OPCODE_MOD_RM(0x0),
    3124     OP("cmpxchg8b %Mq",      IDX_ParseModRM,     0,          0,          OP_CMPXCHG8B, OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3125    OP("cmpxchg8b %Mq",      IDX_ParseModRM,     0,             0,       OP_CMPXCHG8B, OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    31253126    INVALID_OPCODE_MOD_RM(0x2),
    31263127    INVALID_OPCODE_MOD_RM(0x3),
    31273128    INVALID_OPCODE_MOD_RM(0x4),
    31283129    INVALID_OPCODE_MOD_RM(0x5),
    3129     OP("vmptrld %M",         IDX_ParseModRM,     0,             0,       OP_VMPTRLD,   OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    3130     OP("vmptrst %M",         IDX_ParseModRM,     0,             0,       OP_VMPTRST,   OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3130    OP("vmptrld %Mq",        IDX_ParseModRM,     0,             0,       OP_VMPTRLD,   OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3131    OP("vmptrst %Mq",        IDX_ParseModRM,     0,             0,       OP_VMPTRST,   OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3132    /* REX.W = 1 */
     3133    INVALID_OPCODE_MOD_RM(0x0),
     3134    OP("cmpxchg16b %Mdq",    IDX_ParseModRM,     0,             0,       OP_CMPXCHG16B, OP_PARM_Mdq,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3135    INVALID_OPCODE_MOD_RM(0x2),
     3136    INVALID_OPCODE_MOD_RM(0x3),
     3137    INVALID_OPCODE_MOD_RM(0x4),
     3138    INVALID_OPCODE_MOD_RM(0x5),
     3139    INVALID_OPCODE_MOD_RM(0x6),
     3140    INVALID_OPCODE_MOD_RM(0x7),
    31313141};
    31323142
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm

    r103709 r103717  
    514514        vmxon [rax]
    515515
     516        cmpxchg8b [rdi]
     517        lock cmpxchg8b [rdi]
     518        cmpxchg16b [rdi]
     519        lock cmpxchg16b [rdi]
     520        vmptrst [rsi + 1]
     521
    516522        ret
    517523ENDPROC   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