xref: /openbmc/linux/arch/x86/include/asm/inat.h (revision 04d46c1b)
1eb13296cSMasami Hiramatsu #ifndef _ASM_X86_INAT_H
2eb13296cSMasami Hiramatsu #define _ASM_X86_INAT_H
3eb13296cSMasami Hiramatsu /*
4eb13296cSMasami Hiramatsu  * x86 instruction attributes
5eb13296cSMasami Hiramatsu  *
6eb13296cSMasami Hiramatsu  * Written by Masami Hiramatsu <mhiramat@redhat.com>
7eb13296cSMasami Hiramatsu  *
8eb13296cSMasami Hiramatsu  * This program is free software; you can redistribute it and/or modify
9eb13296cSMasami Hiramatsu  * it under the terms of the GNU General Public License as published by
10eb13296cSMasami Hiramatsu  * the Free Software Foundation; either version 2 of the License, or
11eb13296cSMasami Hiramatsu  * (at your option) any later version.
12eb13296cSMasami Hiramatsu  *
13eb13296cSMasami Hiramatsu  * This program is distributed in the hope that it will be useful,
14eb13296cSMasami Hiramatsu  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15eb13296cSMasami Hiramatsu  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16eb13296cSMasami Hiramatsu  * GNU General Public License for more details.
17eb13296cSMasami Hiramatsu  *
18eb13296cSMasami Hiramatsu  * You should have received a copy of the GNU General Public License
19eb13296cSMasami Hiramatsu  * along with this program; if not, write to the Free Software
20eb13296cSMasami Hiramatsu  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21eb13296cSMasami Hiramatsu  *
22eb13296cSMasami Hiramatsu  */
23eb13296cSMasami Hiramatsu #include <asm/inat_types.h>
24eb13296cSMasami Hiramatsu 
25eb13296cSMasami Hiramatsu /*
26eb13296cSMasami Hiramatsu  * Internal bits. Don't use bitmasks directly, because these bits are
27eb13296cSMasami Hiramatsu  * unstable. You should use checking functions.
28eb13296cSMasami Hiramatsu  */
29eb13296cSMasami Hiramatsu 
30eb13296cSMasami Hiramatsu #define INAT_OPCODE_TABLE_SIZE 256
31eb13296cSMasami Hiramatsu #define INAT_GROUP_TABLE_SIZE 8
32eb13296cSMasami Hiramatsu 
3304d46c1bSMasami Hiramatsu /* Legacy last prefixes */
34eb13296cSMasami Hiramatsu #define INAT_PFX_OPNDSZ	1	/* 0x66 */ /* LPFX1 */
35eb13296cSMasami Hiramatsu #define INAT_PFX_REPNE	2	/* 0xF2 */ /* LPFX2 */
36eb13296cSMasami Hiramatsu #define INAT_PFX_REPE	3	/* 0xF3 */ /* LPFX3 */
3704d46c1bSMasami Hiramatsu /* Other Legacy prefixes */
38eb13296cSMasami Hiramatsu #define INAT_PFX_LOCK	4	/* 0xF0 */
39eb13296cSMasami Hiramatsu #define INAT_PFX_CS	5	/* 0x2E */
40eb13296cSMasami Hiramatsu #define INAT_PFX_DS	6	/* 0x3E */
41eb13296cSMasami Hiramatsu #define INAT_PFX_ES	7	/* 0x26 */
42eb13296cSMasami Hiramatsu #define INAT_PFX_FS	8	/* 0x64 */
43eb13296cSMasami Hiramatsu #define INAT_PFX_GS	9	/* 0x65 */
44eb13296cSMasami Hiramatsu #define INAT_PFX_SS	10	/* 0x36 */
45eb13296cSMasami Hiramatsu #define INAT_PFX_ADDRSZ	11	/* 0x67 */
4604d46c1bSMasami Hiramatsu /* x86-64 REX prefix */
4704d46c1bSMasami Hiramatsu #define INAT_PFX_REX	12	/* 0x4X */
48eb13296cSMasami Hiramatsu 
4904d46c1bSMasami Hiramatsu #define INAT_LSTPFX_MAX	3
5004d46c1bSMasami Hiramatsu #define INAT_LGCPFX_MAX	11
51eb13296cSMasami Hiramatsu 
52eb13296cSMasami Hiramatsu /* Immediate size */
53eb13296cSMasami Hiramatsu #define INAT_IMM_BYTE		1
54eb13296cSMasami Hiramatsu #define INAT_IMM_WORD		2
55eb13296cSMasami Hiramatsu #define INAT_IMM_DWORD		3
56eb13296cSMasami Hiramatsu #define INAT_IMM_QWORD		4
57eb13296cSMasami Hiramatsu #define INAT_IMM_PTR		5
58eb13296cSMasami Hiramatsu #define INAT_IMM_VWORD32	6
59eb13296cSMasami Hiramatsu #define INAT_IMM_VWORD		7
60eb13296cSMasami Hiramatsu 
61eb13296cSMasami Hiramatsu /* Legacy prefix */
62eb13296cSMasami Hiramatsu #define INAT_PFX_OFFS	0
63eb13296cSMasami Hiramatsu #define INAT_PFX_BITS	4
64eb13296cSMasami Hiramatsu #define INAT_PFX_MAX    ((1 << INAT_PFX_BITS) - 1)
65eb13296cSMasami Hiramatsu #define INAT_PFX_MASK	(INAT_PFX_MAX << INAT_PFX_OFFS)
66eb13296cSMasami Hiramatsu /* Escape opcodes */
67eb13296cSMasami Hiramatsu #define INAT_ESC_OFFS	(INAT_PFX_OFFS + INAT_PFX_BITS)
68eb13296cSMasami Hiramatsu #define INAT_ESC_BITS	2
69eb13296cSMasami Hiramatsu #define INAT_ESC_MAX	((1 << INAT_ESC_BITS) - 1)
70eb13296cSMasami Hiramatsu #define INAT_ESC_MASK	(INAT_ESC_MAX << INAT_ESC_OFFS)
71eb13296cSMasami Hiramatsu /* Group opcodes (1-16) */
72eb13296cSMasami Hiramatsu #define INAT_GRP_OFFS	(INAT_ESC_OFFS + INAT_ESC_BITS)
73eb13296cSMasami Hiramatsu #define INAT_GRP_BITS	5
74eb13296cSMasami Hiramatsu #define INAT_GRP_MAX	((1 << INAT_GRP_BITS) - 1)
75eb13296cSMasami Hiramatsu #define INAT_GRP_MASK	(INAT_GRP_MAX << INAT_GRP_OFFS)
76eb13296cSMasami Hiramatsu /* Immediates */
77eb13296cSMasami Hiramatsu #define INAT_IMM_OFFS	(INAT_GRP_OFFS + INAT_GRP_BITS)
78eb13296cSMasami Hiramatsu #define INAT_IMM_BITS	3
79eb13296cSMasami Hiramatsu #define INAT_IMM_MASK	(((1 << INAT_IMM_BITS) - 1) << INAT_IMM_OFFS)
80eb13296cSMasami Hiramatsu /* Flags */
81eb13296cSMasami Hiramatsu #define INAT_FLAG_OFFS	(INAT_IMM_OFFS + INAT_IMM_BITS)
8204d46c1bSMasami Hiramatsu #define INAT_MODRM	(1 << (INAT_FLAG_OFFS))
8304d46c1bSMasami Hiramatsu #define INAT_FORCE64	(1 << (INAT_FLAG_OFFS + 1))
8404d46c1bSMasami Hiramatsu #define INAT_SCNDIMM	(1 << (INAT_FLAG_OFFS + 2))
8504d46c1bSMasami Hiramatsu #define INAT_MOFFSET	(1 << (INAT_FLAG_OFFS + 3))
8604d46c1bSMasami Hiramatsu #define INAT_VARIANT	(1 << (INAT_FLAG_OFFS + 4))
87eb13296cSMasami Hiramatsu /* Attribute making macros for attribute tables */
88eb13296cSMasami Hiramatsu #define INAT_MAKE_PREFIX(pfx)	(pfx << INAT_PFX_OFFS)
89eb13296cSMasami Hiramatsu #define INAT_MAKE_ESCAPE(esc)	(esc << INAT_ESC_OFFS)
90eb13296cSMasami Hiramatsu #define INAT_MAKE_GROUP(grp)	((grp << INAT_GRP_OFFS) | INAT_MODRM)
91eb13296cSMasami Hiramatsu #define INAT_MAKE_IMM(imm)	(imm << INAT_IMM_OFFS)
92eb13296cSMasami Hiramatsu 
93eb13296cSMasami Hiramatsu /* Attribute search APIs */
94eb13296cSMasami Hiramatsu extern insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode);
95eb13296cSMasami Hiramatsu extern insn_attr_t inat_get_escape_attribute(insn_byte_t opcode,
96eb13296cSMasami Hiramatsu 					     insn_byte_t last_pfx,
97eb13296cSMasami Hiramatsu 					     insn_attr_t esc_attr);
98eb13296cSMasami Hiramatsu extern insn_attr_t inat_get_group_attribute(insn_byte_t modrm,
99eb13296cSMasami Hiramatsu 					    insn_byte_t last_pfx,
100eb13296cSMasami Hiramatsu 					    insn_attr_t esc_attr);
101eb13296cSMasami Hiramatsu 
102eb13296cSMasami Hiramatsu /* Attribute checking functions */
10304d46c1bSMasami Hiramatsu static inline int inat_is_legacy_prefix(insn_attr_t attr)
104eb13296cSMasami Hiramatsu {
10504d46c1bSMasami Hiramatsu 	attr &= INAT_PFX_MASK;
10604d46c1bSMasami Hiramatsu 	return attr && attr <= INAT_LGCPFX_MAX;
107eb13296cSMasami Hiramatsu }
108eb13296cSMasami Hiramatsu 
109eb13296cSMasami Hiramatsu static inline int inat_is_address_size_prefix(insn_attr_t attr)
110eb13296cSMasami Hiramatsu {
111eb13296cSMasami Hiramatsu 	return (attr & INAT_PFX_MASK) == INAT_PFX_ADDRSZ;
112eb13296cSMasami Hiramatsu }
113eb13296cSMasami Hiramatsu 
114eb13296cSMasami Hiramatsu static inline int inat_is_operand_size_prefix(insn_attr_t attr)
115eb13296cSMasami Hiramatsu {
116eb13296cSMasami Hiramatsu 	return (attr & INAT_PFX_MASK) == INAT_PFX_OPNDSZ;
117eb13296cSMasami Hiramatsu }
118eb13296cSMasami Hiramatsu 
11904d46c1bSMasami Hiramatsu static inline int inat_is_rex_prefix(insn_attr_t attr)
12004d46c1bSMasami Hiramatsu {
12104d46c1bSMasami Hiramatsu 	return (attr & INAT_PFX_MASK) == INAT_PFX_REX;
12204d46c1bSMasami Hiramatsu }
12304d46c1bSMasami Hiramatsu 
124eb13296cSMasami Hiramatsu static inline int inat_last_prefix_id(insn_attr_t attr)
125eb13296cSMasami Hiramatsu {
12604d46c1bSMasami Hiramatsu 	if ((attr & INAT_PFX_MASK) > INAT_LSTPFX_MAX)
127eb13296cSMasami Hiramatsu 		return 0;
128eb13296cSMasami Hiramatsu 	else
129eb13296cSMasami Hiramatsu 		return attr & INAT_PFX_MASK;
130eb13296cSMasami Hiramatsu }
131eb13296cSMasami Hiramatsu 
132eb13296cSMasami Hiramatsu static inline int inat_is_escape(insn_attr_t attr)
133eb13296cSMasami Hiramatsu {
134eb13296cSMasami Hiramatsu 	return attr & INAT_ESC_MASK;
135eb13296cSMasami Hiramatsu }
136eb13296cSMasami Hiramatsu 
137eb13296cSMasami Hiramatsu static inline int inat_escape_id(insn_attr_t attr)
138eb13296cSMasami Hiramatsu {
139eb13296cSMasami Hiramatsu 	return (attr & INAT_ESC_MASK) >> INAT_ESC_OFFS;
140eb13296cSMasami Hiramatsu }
141eb13296cSMasami Hiramatsu 
142eb13296cSMasami Hiramatsu static inline int inat_is_group(insn_attr_t attr)
143eb13296cSMasami Hiramatsu {
144eb13296cSMasami Hiramatsu 	return attr & INAT_GRP_MASK;
145eb13296cSMasami Hiramatsu }
146eb13296cSMasami Hiramatsu 
147eb13296cSMasami Hiramatsu static inline int inat_group_id(insn_attr_t attr)
148eb13296cSMasami Hiramatsu {
149eb13296cSMasami Hiramatsu 	return (attr & INAT_GRP_MASK) >> INAT_GRP_OFFS;
150eb13296cSMasami Hiramatsu }
151eb13296cSMasami Hiramatsu 
152eb13296cSMasami Hiramatsu static inline int inat_group_common_attribute(insn_attr_t attr)
153eb13296cSMasami Hiramatsu {
154eb13296cSMasami Hiramatsu 	return attr & ~INAT_GRP_MASK;
155eb13296cSMasami Hiramatsu }
156eb13296cSMasami Hiramatsu 
157eb13296cSMasami Hiramatsu static inline int inat_has_immediate(insn_attr_t attr)
158eb13296cSMasami Hiramatsu {
159eb13296cSMasami Hiramatsu 	return attr & INAT_IMM_MASK;
160eb13296cSMasami Hiramatsu }
161eb13296cSMasami Hiramatsu 
162eb13296cSMasami Hiramatsu static inline int inat_immediate_size(insn_attr_t attr)
163eb13296cSMasami Hiramatsu {
164eb13296cSMasami Hiramatsu 	return (attr & INAT_IMM_MASK) >> INAT_IMM_OFFS;
165eb13296cSMasami Hiramatsu }
166eb13296cSMasami Hiramatsu 
167eb13296cSMasami Hiramatsu static inline int inat_has_modrm(insn_attr_t attr)
168eb13296cSMasami Hiramatsu {
169eb13296cSMasami Hiramatsu 	return attr & INAT_MODRM;
170eb13296cSMasami Hiramatsu }
171eb13296cSMasami Hiramatsu 
172eb13296cSMasami Hiramatsu static inline int inat_is_force64(insn_attr_t attr)
173eb13296cSMasami Hiramatsu {
174eb13296cSMasami Hiramatsu 	return attr & INAT_FORCE64;
175eb13296cSMasami Hiramatsu }
176eb13296cSMasami Hiramatsu 
177eb13296cSMasami Hiramatsu static inline int inat_has_second_immediate(insn_attr_t attr)
178eb13296cSMasami Hiramatsu {
179eb13296cSMasami Hiramatsu 	return attr & INAT_SCNDIMM;
180eb13296cSMasami Hiramatsu }
181eb13296cSMasami Hiramatsu 
182eb13296cSMasami Hiramatsu static inline int inat_has_moffset(insn_attr_t attr)
183eb13296cSMasami Hiramatsu {
184eb13296cSMasami Hiramatsu 	return attr & INAT_MOFFSET;
185eb13296cSMasami Hiramatsu }
186eb13296cSMasami Hiramatsu 
187eb13296cSMasami Hiramatsu static inline int inat_has_variant(insn_attr_t attr)
188eb13296cSMasami Hiramatsu {
189eb13296cSMasami Hiramatsu 	return attr & INAT_VARIANT;
190eb13296cSMasami Hiramatsu }
191eb13296cSMasami Hiramatsu 
192eb13296cSMasami Hiramatsu #endif
193