1 /* 2 * x86 instruction attribute tables 3 * 4 * Written by Masami Hiramatsu <mhiramat@redhat.com> 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