]>
Commit | Line | Data |
---|---|---|
1a59d1b8 | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
eb13296c MH |
2 | /* |
3 | * x86 instruction attribute tables | |
4 | * | |
5 | * Written by Masami Hiramatsu <mhiramat@redhat.com> | |
eb13296c MH |
6 | */ |
7 | #include <asm/insn.h> | |
8 | ||
9 | /* Attribute tables are generated from opcode map */ | |
10 | #include "inat-tables.c" | |
11 | ||
12 | /* Attribute search APIs */ | |
13 | insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode) | |
14 | { | |
15 | return inat_primary_table[opcode]; | |
16 | } | |
17 | ||
f8d98f10 MH |
18 | int inat_get_last_prefix_id(insn_byte_t last_pfx) |
19 | { | |
20 | insn_attr_t lpfx_attr; | |
21 | ||
22 | lpfx_attr = inat_get_opcode_attribute(last_pfx); | |
23 | return inat_last_prefix_id(lpfx_attr); | |
24 | } | |
25 | ||
26 | insn_attr_t inat_get_escape_attribute(insn_byte_t opcode, int lpfx_id, | |
eb13296c MH |
27 | insn_attr_t esc_attr) |
28 | { | |
29 | const insn_attr_t *table; | |
f8d98f10 | 30 | int n; |
eb13296c MH |
31 | |
32 | n = inat_escape_id(esc_attr); | |
f8d98f10 | 33 | |
eb13296c MH |
34 | table = inat_escape_tables[n][0]; |
35 | if (!table) | |
36 | return 0; | |
f8d98f10 MH |
37 | if (inat_has_variant(table[opcode]) && lpfx_id) { |
38 | table = inat_escape_tables[n][lpfx_id]; | |
eb13296c MH |
39 | if (!table) |
40 | return 0; | |
41 | } | |
42 | return table[opcode]; | |
43 | } | |
44 | ||
f8d98f10 | 45 | insn_attr_t inat_get_group_attribute(insn_byte_t modrm, int lpfx_id, |
eb13296c MH |
46 | insn_attr_t grp_attr) |
47 | { | |
48 | const insn_attr_t *table; | |
f8d98f10 | 49 | int n; |
eb13296c MH |
50 | |
51 | n = inat_group_id(grp_attr); | |
f8d98f10 | 52 | |
eb13296c MH |
53 | table = inat_group_tables[n][0]; |
54 | if (!table) | |
55 | return inat_group_common_attribute(grp_attr); | |
f8d98f10 MH |
56 | if (inat_has_variant(table[X86_MODRM_REG(modrm)]) && lpfx_id) { |
57 | table = inat_group_tables[n][lpfx_id]; | |
eb13296c MH |
58 | if (!table) |
59 | return inat_group_common_attribute(grp_attr); | |
60 | } | |
61 | return table[X86_MODRM_REG(modrm)] | | |
62 | inat_group_common_attribute(grp_attr); | |
63 | } | |
64 | ||
e0e492e9 MH |
65 | insn_attr_t inat_get_avx_attribute(insn_byte_t opcode, insn_byte_t vex_m, |
66 | insn_byte_t vex_p) | |
67 | { | |
68 | const insn_attr_t *table; | |
69 | if (vex_m > X86_VEX_M_MAX || vex_p > INAT_LSTPFX_MAX) | |
70 | return 0; | |
130b78b2 MH |
71 | /* At first, this checks the master table */ |
72 | table = inat_avx_tables[vex_m][0]; | |
e0e492e9 MH |
73 | if (!table) |
74 | return 0; | |
130b78b2 MH |
75 | if (!inat_is_group(table[opcode]) && vex_p) { |
76 | /* If this is not a group, get attribute directly */ | |
77 | table = inat_avx_tables[vex_m][vex_p]; | |
78 | if (!table) | |
79 | return 0; | |
80 | } | |
e0e492e9 MH |
81 | return table[opcode]; |
82 | } | |
83 |