brintos

brintos / linux-shallow public Read only

0
0
Text · 1.9 KiB · dfbcc64 Raw
84 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * x86 instruction attribute tables4 *5 * Written by Masami Hiramatsu <mhiramat@redhat.com>6 */7#include "../include/asm/insn.h" /* __ignore_sync_check__ */8 9/* Attribute tables are generated from opcode map */10#include "inat-tables.c"11 12/* Attribute search APIs */13insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode)14{15	return inat_primary_table[opcode];16}17 18int 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 26insn_attr_t inat_get_escape_attribute(insn_byte_t opcode, int lpfx_id,27				      insn_attr_t esc_attr)28{29	const insn_attr_t *table;30	int n;31 32	n = inat_escape_id(esc_attr);33 34	table = inat_escape_tables[n][0];35	if (!table)36		return 0;37	if (inat_has_variant(table[opcode]) && lpfx_id) {38		table = inat_escape_tables[n][lpfx_id];39		if (!table)40			return 0;41	}42	return table[opcode];43}44 45insn_attr_t inat_get_group_attribute(insn_byte_t modrm, int lpfx_id,46				     insn_attr_t grp_attr)47{48	const insn_attr_t *table;49	int n;50 51	n = inat_group_id(grp_attr);52 53	table = inat_group_tables[n][0];54	if (!table)55		return inat_group_common_attribute(grp_attr);56	if (inat_has_variant(table[X86_MODRM_REG(modrm)]) && lpfx_id) {57		table = inat_group_tables[n][lpfx_id];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 65insn_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;71	/* At first, this checks the master table */72	table = inat_avx_tables[vex_m][0];73	if (!table)74		return 0;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	}81	return table[opcode];82}83 84