Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.34 90 lines 2.5 kB view raw
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 */ 27insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode) 28{ 29 return inat_primary_table[opcode]; 30} 31 32insn_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 55insn_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 79insn_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