Changeset 103717 in vbox for trunk/src/VBox/Disassembler
- Timestamp:
- Mar 6, 2024 9:36:59 PM (12 months ago)
- svn:sync-xref-src-repo-rev:
- 162085
- Location:
- trunk/src/VBox/Disassembler
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmCore-x86-amd64.cpp
r103709 r103717 2075 2075 2076 2076 uint8_t const bRm = disReadByte(pDis, offInstr); 2077 uint8_t constidx = MODRM_REG(bRm);2077 uint8_t idx = MODRM_REG(bRm); 2078 2078 if (MODRM_MOD(bRm) != X86_MOD_REG) 2079 2079 { … … 2086 2086 } 2087 2087 /** @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; 2089 2092 pOp = &g_aMapX86_Group9_mem_none[idx]; 2093 } 2090 2094 else 2091 2095 pOp = &g_InvalidOpcode[0]; … … 2411 2415 { 2412 2416 /* simple: no variations */ 2413 case OP_CMPXCHG8B: /* == OP_CMPXCHG16B? */ 2417 case OP_CMPXCHG8B: 2418 case OP_CMPXCHG16B: 2414 2419 return; 2415 2420 -
trunk/src/VBox/Disassembler/DisasmInternal-x86-amd64.h
r103709 r103717 201 201 extern const DISOPCODE g_aMapX86_Group7_mod11_reg111[8]; 202 202 extern const DISOPCODE g_aMapX86_Group8[8]; 203 extern const DISOPCODE g_aMapX86_Group9_mem_none[8 ];203 extern const DISOPCODE g_aMapX86_Group9_mem_none[8*2]; 204 204 extern const DISOPCODE g_aMapX86_Group9_mem_66[8]; 205 205 extern const DISOPCODE g_aMapX86_Group9_mem_f3[8]; -
trunk/src/VBox/Disassembler/DisasmTables-x86-amd64.cpp
r103709 r103717 3118 3118 }; 3119 3119 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 */ 3121 const DISOPCODE g_aMapX86_Group9_mem_none[8 * 2] = 3122 { 3123 /* REX.W = 0 */ 3123 3124 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), 3125 3126 INVALID_OPCODE_MOD_RM(0x2), 3126 3127 INVALID_OPCODE_MOD_RM(0x3), 3127 3128 INVALID_OPCODE_MOD_RM(0x4), 3128 3129 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), 3131 3141 }; 3132 3142 -
trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm
r103709 r103717 514 514 vmxon [rax] 515 515 516 cmpxchg8b [rdi] 517 lock cmpxchg8b [rdi] 518 cmpxchg16b [rdi] 519 lock cmpxchg16b [rdi] 520 vmptrst [rsi + 1] 521 516 522 ret 517 523 ENDPROC TestProc64
Note:
See TracChangeset
for help on using the changeset viewer.