Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/lib/inat.c
10817 views
1
/*
2
* x86 instruction attribute tables
3
*
4
* Written by Masami Hiramatsu <[email protected]>
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
*
20
*/
21
#include <asm/insn.h>
22
23
/* Attribute tables are generated from opcode map */
24
#include "inat-tables.c"
25
26
/* Attribute search APIs */
27
insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode)
28
{
29
return inat_primary_table[opcode];
30
}
31
32
insn_attr_t inat_get_escape_attribute(insn_byte_t opcode, insn_byte_t last_pfx,
33
insn_attr_t esc_attr)
34
{
35
const insn_attr_t *table;
36
insn_attr_t lpfx_attr;
37
int n, m = 0;
38
39
n = inat_escape_id(esc_attr);
40
if (last_pfx) {
41
lpfx_attr = inat_get_opcode_attribute(last_pfx);
42
m = inat_last_prefix_id(lpfx_attr);
43
}
44
table = inat_escape_tables[n][0];
45
if (!table)
46
return 0;
47
if (inat_has_variant(table[opcode]) && m) {
48
table = inat_escape_tables[n][m];
49
if (!table)
50
return 0;
51
}
52
return table[opcode];
53
}
54
55
insn_attr_t inat_get_group_attribute(insn_byte_t modrm, insn_byte_t last_pfx,
56
insn_attr_t grp_attr)
57
{
58
const insn_attr_t *table;
59
insn_attr_t lpfx_attr;
60
int n, m = 0;
61
62
n = inat_group_id(grp_attr);
63
if (last_pfx) {
64
lpfx_attr = inat_get_opcode_attribute(last_pfx);
65
m = inat_last_prefix_id(lpfx_attr);
66
}
67
table = inat_group_tables[n][0];
68
if (!table)
69
return inat_group_common_attribute(grp_attr);
70
if (inat_has_variant(table[X86_MODRM_REG(modrm)]) && m) {
71
table = inat_group_tables[n][m];
72
if (!table)
73
return inat_group_common_attribute(grp_attr);
74
}
75
return table[X86_MODRM_REG(modrm)] |
76
inat_group_common_attribute(grp_attr);
77
}
78
79
insn_attr_t inat_get_avx_attribute(insn_byte_t opcode, insn_byte_t vex_m,
80
insn_byte_t vex_p)
81
{
82
const insn_attr_t *table;
83
if (vex_m > X86_VEX_M_MAX || vex_p > INAT_LSTPFX_MAX)
84
return 0;
85
table = inat_avx_tables[vex_m][vex_p];
86
if (!table)
87
return 0;
88
return table[opcode];
89
}
90
91
92