1 #ifndef _ASM_X86_INSN_H
2 #define _ASM_X86_INSN_H
71 #define MAX_INSN_SIZE 16
73 #define X86_MODRM_MOD(modrm) (((modrm) & 0xc0) >> 6)
74 #define X86_MODRM_REG(modrm) (((modrm) & 0x38) >> 3)
75 #define X86_MODRM_RM(modrm) ((modrm) & 0x07)
77 #define X86_SIB_SCALE(sib) (((sib) & 0xc0) >> 6)
78 #define X86_SIB_INDEX(sib) (((sib) & 0x38) >> 3)
79 #define X86_SIB_BASE(sib) ((sib) & 0x07)
81 #define X86_REX_W(rex) ((rex) & 8)
82 #define X86_REX_R(rex) ((rex) & 4)
83 #define X86_REX_X(rex) ((rex) & 2)
84 #define X86_REX_B(rex) ((rex) & 1)
87 #define X86_VEX_W(vex) ((vex) & 0x80)
88 #define X86_VEX_R(vex) ((vex) & 0x80)
89 #define X86_VEX_X(vex) ((vex) & 0x40)
90 #define X86_VEX_B(vex) ((vex) & 0x20)
91 #define X86_VEX_L(vex) ((vex) & 0x04)
93 #define X86_VEX3_M(vex) ((vex) & 0x1f)
95 #define X86_VEX_V(vex) (((vex) & 0x78) >> 3)
96 #define X86_VEX_P(vex) ((vex) & 0x03)
97 #define X86_VEX_M_MAX 0x1f
109 static inline void insn_get_attribute(
struct insn *
insn)
118 static inline void kernel_insn_init(
struct insn *
insn,
const void *kaddr)
127 static inline int insn_is_avx(
struct insn *
insn)
135 static inline int insn_complete(
struct insn *insn)
141 static inline insn_byte_t insn_vex_m_bits(
struct insn *insn)
149 static inline insn_byte_t insn_vex_p_bits(
struct insn *insn)
158 static inline int insn_last_prefix_id(
struct insn *insn)
160 if (insn_is_avx(insn))
161 return insn_vex_p_bits(insn);
170 static inline int insn_offset_rex_prefix(
struct insn *insn)
174 static inline int insn_offset_vex_prefix(
struct insn *insn)
176 return insn_offset_rex_prefix(insn) + insn->
rex_prefix.nbytes;
178 static inline int insn_offset_opcode(
struct insn *insn)
180 return insn_offset_vex_prefix(insn) + insn->
vex_prefix.nbytes;
182 static inline int insn_offset_modrm(
struct insn *insn)
184 return insn_offset_opcode(insn) + insn->
opcode.nbytes;
186 static inline int insn_offset_sib(
struct insn *insn)
188 return insn_offset_modrm(insn) + insn->
modrm.nbytes;
190 static inline int insn_offset_displacement(
struct insn *insn)
192 return insn_offset_sib(insn) + insn->
sib.nbytes;
194 static inline int insn_offset_immediate(
struct insn *insn)
196 return insn_offset_displacement(insn) + insn->
displacement.nbytes;