diff options
author | Jan Beulich <jbeulich@suse.com> | 2024-02-09 08:39:48 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2024-02-09 08:39:48 +0100 |
commit | 41e115853eef32304e3e6fcd7feb4ec116090ee0 (patch) | |
tree | 9e8d842741312d6712c747d0f4c1c6ca036734c4 /opcodes | |
parent | ec3babb8c10111bacfd195fe9eafed1bfb721b5c (diff) | |
download | gdb-41e115853eef32304e3e6fcd7feb4ec116090ee0.zip gdb-41e115853eef32304e3e6fcd7feb4ec116090ee0.tar.gz gdb-41e115853eef32304e3e6fcd7feb4ec116090ee0.tar.bz2 |
x86/APX: with REX2 map 1 doesn't "chain" to maps 2 or 3
Don't wander into three_byte_table[] when REX2 is present.
While there also eliminate related confusion when accessing
dis386_twobyte[]: There's nothing 3-byte-ish involved there. Dropping
the odd variable gets things better in sync with 1-byte handling as
well.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/i386-dis.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 62c37a9..31afa9c 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -8833,6 +8833,8 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) break; case USE_3BYTE_TABLE: + if (ins->last_rex2_prefix >= 0) + return &err_opcode; if (!fetch_code (ins->info, ins->codep + 2)) return &err_opcode; vindex = *ins->codep++; @@ -9550,8 +9552,6 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) /* REX2.M in rex2 prefix represents map0 or map1. */ if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M)) { - unsigned char threebyte; - if (!ins.rex2) { ins.codep++; @@ -9559,17 +9559,15 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) goto fetch_error_out; } - threebyte = *ins.codep; - dp = &dis386_twobyte[threebyte]; - ins.need_modrm = twobyte_has_modrm[threebyte]; - ins.codep++; + dp = &dis386_twobyte[*ins.codep]; + ins.need_modrm = twobyte_has_modrm[*ins.codep]; } else { dp = &dis386[*ins.codep]; ins.need_modrm = onebyte_has_modrm[*ins.codep]; - ins.codep++; } + ins.codep++; /* Save sizeflag for printing the extra ins.prefixes later before updating it for mnemonic and operand processing. The prefix names depend |