diff options
| -rw-r--r-- | arch/x86/lib/inat.c | 9 | ||||
| -rw-r--r-- | arch/x86/lib/insn.c | 4 |
2 files changed, 11 insertions, 2 deletions
diff --git a/arch/x86/lib/inat.c b/arch/x86/lib/inat.c index 46fc4ee09fc..88ad5fbda6e 100644 --- a/arch/x86/lib/inat.c +++ b/arch/x86/lib/inat.c | |||
| @@ -82,9 +82,16 @@ insn_attr_t inat_get_avx_attribute(insn_byte_t opcode, insn_byte_t vex_m, | |||
| 82 | const insn_attr_t *table; | 82 | const insn_attr_t *table; |
| 83 | if (vex_m > X86_VEX_M_MAX || vex_p > INAT_LSTPFX_MAX) | 83 | if (vex_m > X86_VEX_M_MAX || vex_p > INAT_LSTPFX_MAX) |
| 84 | return 0; | 84 | return 0; |
| 85 | table = inat_avx_tables[vex_m][vex_p]; | 85 | /* At first, this checks the master table */ |
| 86 | table = inat_avx_tables[vex_m][0]; | ||
| 86 | if (!table) | 87 | if (!table) |
| 87 | return 0; | 88 | return 0; |
| 89 | if (!inat_is_group(table[opcode]) && vex_p) { | ||
| 90 | /* If this is not a group, get attribute directly */ | ||
| 91 | table = inat_avx_tables[vex_m][vex_p]; | ||
| 92 | if (!table) | ||
| 93 | return 0; | ||
| 94 | } | ||
| 88 | return table[opcode]; | 95 | return table[opcode]; |
| 89 | } | 96 | } |
| 90 | 97 | ||
diff --git a/arch/x86/lib/insn.c b/arch/x86/lib/insn.c index 374562ed670..5a1f9f3e3fb 100644 --- a/arch/x86/lib/insn.c +++ b/arch/x86/lib/insn.c | |||
| @@ -202,7 +202,7 @@ void insn_get_opcode(struct insn *insn) | |||
| 202 | m = insn_vex_m_bits(insn); | 202 | m = insn_vex_m_bits(insn); |
| 203 | p = insn_vex_p_bits(insn); | 203 | p = insn_vex_p_bits(insn); |
| 204 | insn->attr = inat_get_avx_attribute(op, m, p); | 204 | insn->attr = inat_get_avx_attribute(op, m, p); |
| 205 | if (!inat_accept_vex(insn->attr)) | 205 | if (!inat_accept_vex(insn->attr) && !inat_is_group(insn->attr)) |
| 206 | insn->attr = 0; /* This instruction is bad */ | 206 | insn->attr = 0; /* This instruction is bad */ |
| 207 | goto end; /* VEX has only 1 byte for opcode */ | 207 | goto end; /* VEX has only 1 byte for opcode */ |
| 208 | } | 208 | } |
| @@ -249,6 +249,8 @@ void insn_get_modrm(struct insn *insn) | |||
| 249 | pfx = insn_last_prefix(insn); | 249 | pfx = insn_last_prefix(insn); |
| 250 | insn->attr = inat_get_group_attribute(mod, pfx, | 250 | insn->attr = inat_get_group_attribute(mod, pfx, |
| 251 | insn->attr); | 251 | insn->attr); |
| 252 | if (insn_is_avx(insn) && !inat_accept_vex(insn->attr)) | ||
| 253 | insn->attr = 0; /* This is bad */ | ||
| 252 | } | 254 | } |
| 253 | } | 255 | } |
| 254 | 256 | ||
