diff options
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/i386-dis.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 393522f37ac..60bfa41a5ad 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -8953,7 +8953,11 @@ static const struct dis386 rm_table[][8] = { #define BND_PREFIX 0x04 #define NOTRACK_PREFIX 0x05 -static int +static enum { + ckp_okay, + ckp_bogus, + ckp_fetch_error, +} ckprefix (instr_info *ins) { int newrex, i, length; @@ -8963,7 +8967,8 @@ ckprefix (instr_info *ins) /* The maximum instruction length is 15bytes. */ while (length < MAX_CODE_LENGTH - 1) { - FETCH_DATA (ins->info, ins->codep + 1); + if (!fetch_code (ins->info, ins->codep + 1)) + return ckp_fetch_error; newrex = 0; switch (*ins->codep) { @@ -8987,7 +8992,7 @@ ckprefix (instr_info *ins) if (ins->address_mode == mode_64bit) newrex = *ins->codep; else - return 1; + return ckp_okay; ins->last_rex_prefix = i; break; case 0xf3: @@ -9055,27 +9060,23 @@ ckprefix (instr_info *ins) ins->codep++; /* This ensures that the previous REX prefixes are noticed as unused prefixes, as in the return case below. */ - ins->rex_used = ins->rex; - return 1; + return ins->rex ? ckp_bogus : ckp_okay; } ins->prefixes = PREFIX_FWAIT; break; default: - return 1; + return ckp_okay; } /* Rex is ignored when followed by another prefix. */ if (ins->rex) - { - ins->rex_used = ins->rex; - return 1; - } + return ckp_bogus; if (*ins->codep != FWAIT_OPCODE) ins->all_prefixes[i++] = *ins->codep; ins->rex = newrex; ins->codep++; length++; } - return 0; + return ckp_bogus; } /* Return the name of the prefix byte PREF, or NULL if PREF is not a @@ -9918,8 +9919,12 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) sizeflag = priv.orig_sizeflag; - if (!ckprefix (&ins) || ins.rex_used) + switch (ckprefix (&ins)) { + case ckp_okay: + break; + + case ckp_bogus: /* Too many prefixes or unused REX prefixes. */ for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i]; @@ -9928,6 +9933,9 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) (i == 0 ? "" : " "), prefix_name (&ins, ins.all_prefixes[i], sizeflag)); return i; + + case ckp_fetch_error: + return fetch_error (&ins); } ins.insn_codep = ins.codep; |