Lines Matching refs:insn

30 #define validate_next(t, insn, n)	\  argument
31 ((insn)->next_byte + sizeof(t) + n <= (insn)->end_kaddr)
33 #define __get_next(t, insn) \ argument
34 ({ t r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); r; })
36 #define __peek_nbyte_next(t, insn, n) \ argument
37 ({ t r = *(t*)((insn)->next_byte + n); r; })
39 #define get_next(t, insn) \ argument
40 ({ if (unlikely(!validate_next(t, insn, 0))) goto err_out; __get_next(t, insn); })
42 #define peek_nbyte_next(t, insn, n) \ argument
43 ({ if (unlikely(!validate_next(t, insn, n))) goto err_out; __peek_nbyte_next(t, insn, n); })
45 #define peek_next(t, insn) peek_nbyte_next(t, insn, 0) argument
53 void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64) in insn_init() argument
62 memset(insn, 0, sizeof(*insn)); in insn_init()
63 insn->kaddr = kaddr; in insn_init()
64 insn->end_kaddr = kaddr + buf_len; in insn_init()
65 insn->next_byte = kaddr; in insn_init()
66 insn->x86_64 = x86_64 ? 1 : 0; in insn_init()
67 insn->opnd_bytes = 4; in insn_init()
69 insn->addr_bytes = 8; in insn_init()
71 insn->addr_bytes = 4; in insn_init()
82 void insn_get_prefixes(struct insn *insn) in insn_get_prefixes() argument
84 struct insn_field *prefixes = &insn->prefixes; in insn_get_prefixes()
94 b = peek_next(insn_byte_t, insn); in insn_get_prefixes()
107 if (insn->x86_64) in insn_get_prefixes()
108 insn->addr_bytes ^= 12; in insn_get_prefixes()
110 insn->addr_bytes ^= 6; in insn_get_prefixes()
113 insn->opnd_bytes ^= 6; in insn_get_prefixes()
117 insn->next_byte++; in insn_get_prefixes()
119 b = peek_next(insn_byte_t, insn); in insn_get_prefixes()
123 if (lb && lb != insn->prefixes.bytes[3]) { in insn_get_prefixes()
124 if (unlikely(insn->prefixes.bytes[3])) { in insn_get_prefixes()
126 b = insn->prefixes.bytes[3]; in insn_get_prefixes()
131 insn->prefixes.bytes[3] = lb; in insn_get_prefixes()
135 if (insn->x86_64) { in insn_get_prefixes()
136 b = peek_next(insn_byte_t, insn); in insn_get_prefixes()
139 insn->rex_prefix.value = b; in insn_get_prefixes()
140 insn->rex_prefix.nbytes = 1; in insn_get_prefixes()
141 insn->next_byte++; in insn_get_prefixes()
144 insn->opnd_bytes = 8; in insn_get_prefixes()
147 insn->rex_prefix.got = 1; in insn_get_prefixes()
150 b = peek_next(insn_byte_t, insn); in insn_get_prefixes()
153 insn_byte_t b2 = peek_nbyte_next(insn_byte_t, insn, 1); in insn_get_prefixes()
154 if (!insn->x86_64) { in insn_get_prefixes()
163 insn->vex_prefix.bytes[0] = b; in insn_get_prefixes()
164 insn->vex_prefix.bytes[1] = b2; in insn_get_prefixes()
166 b2 = peek_nbyte_next(insn_byte_t, insn, 2); in insn_get_prefixes()
167 insn->vex_prefix.bytes[2] = b2; in insn_get_prefixes()
168 insn->vex_prefix.nbytes = 3; in insn_get_prefixes()
169 insn->next_byte += 3; in insn_get_prefixes()
170 if (insn->x86_64 && X86_VEX_W(b2)) in insn_get_prefixes()
172 insn->opnd_bytes = 8; in insn_get_prefixes()
179 insn->vex_prefix.bytes[2] = b2 & 0x7f; in insn_get_prefixes()
180 insn->vex_prefix.nbytes = 2; in insn_get_prefixes()
181 insn->next_byte += 2; in insn_get_prefixes()
185 insn->vex_prefix.got = 1; in insn_get_prefixes()
203 void insn_get_opcode(struct insn *insn) in insn_get_opcode() argument
205 struct insn_field *opcode = &insn->opcode; in insn_get_opcode()
210 if (!insn->prefixes.got) in insn_get_opcode()
211 insn_get_prefixes(insn); in insn_get_opcode()
214 op = get_next(insn_byte_t, insn); in insn_get_opcode()
219 if (insn_is_avx(insn)) { in insn_get_opcode()
221 m = insn_vex_m_bits(insn); in insn_get_opcode()
222 p = insn_vex_p_bits(insn); in insn_get_opcode()
223 insn->attr = inat_get_avx_attribute(op, m, p); in insn_get_opcode()
224 if (!inat_accept_vex(insn->attr) && !inat_is_group(insn->attr)) in insn_get_opcode()
225 insn->attr = 0; /* This instruction is bad */ in insn_get_opcode()
229 insn->attr = inat_get_opcode_attribute(op); in insn_get_opcode()
230 while (inat_is_escape(insn->attr)) { in insn_get_opcode()
232 op = get_next(insn_byte_t, insn); in insn_get_opcode()
234 pfx_id = insn_last_prefix_id(insn); in insn_get_opcode()
235 insn->attr = inat_get_escape_attribute(op, pfx_id, insn->attr); in insn_get_opcode()
237 if (inat_must_vex(insn->attr)) in insn_get_opcode()
238 insn->attr = 0; /* This instruction is bad */ in insn_get_opcode()
254 void insn_get_modrm(struct insn *insn) in insn_get_modrm() argument
256 struct insn_field *modrm = &insn->modrm; in insn_get_modrm()
260 if (!insn->opcode.got) in insn_get_modrm()
261 insn_get_opcode(insn); in insn_get_modrm()
263 if (inat_has_modrm(insn->attr)) { in insn_get_modrm()
264 mod = get_next(insn_byte_t, insn); in insn_get_modrm()
267 if (inat_is_group(insn->attr)) { in insn_get_modrm()
268 pfx_id = insn_last_prefix_id(insn); in insn_get_modrm()
269 insn->attr = inat_get_group_attribute(mod, pfx_id, in insn_get_modrm()
270 insn->attr); in insn_get_modrm()
271 if (insn_is_avx(insn) && !inat_accept_vex(insn->attr)) in insn_get_modrm()
272 insn->attr = 0; /* This is bad */ in insn_get_modrm()
276 if (insn->x86_64 && inat_is_force64(insn->attr)) in insn_get_modrm()
277 insn->opnd_bytes = 8; in insn_get_modrm()
292 int insn_rip_relative(struct insn *insn) in insn_rip_relative() argument
294 struct insn_field *modrm = &insn->modrm; in insn_rip_relative()
296 if (!insn->x86_64) in insn_rip_relative()
299 insn_get_modrm(insn); in insn_rip_relative()
314 void insn_get_sib(struct insn *insn) in insn_get_sib() argument
318 if (insn->sib.got) in insn_get_sib()
320 if (!insn->modrm.got) in insn_get_sib()
321 insn_get_modrm(insn); in insn_get_sib()
322 if (insn->modrm.nbytes) { in insn_get_sib()
323 modrm = (insn_byte_t)insn->modrm.value; in insn_get_sib()
324 if (insn->addr_bytes != 2 && in insn_get_sib()
326 insn->sib.value = get_next(insn_byte_t, insn); in insn_get_sib()
327 insn->sib.nbytes = 1; in insn_get_sib()
330 insn->sib.got = 1; in insn_get_sib()
345 void insn_get_displacement(struct insn *insn) in insn_get_displacement() argument
349 if (insn->displacement.got) in insn_get_displacement()
351 if (!insn->sib.got) in insn_get_displacement()
352 insn_get_sib(insn); in insn_get_displacement()
353 if (insn->modrm.nbytes) { in insn_get_displacement()
371 mod = X86_MODRM_MOD(insn->modrm.value); in insn_get_displacement()
372 rm = X86_MODRM_RM(insn->modrm.value); in insn_get_displacement()
373 base = X86_SIB_BASE(insn->sib.value); in insn_get_displacement()
377 insn->displacement.value = get_next(char, insn); in insn_get_displacement()
378 insn->displacement.nbytes = 1; in insn_get_displacement()
379 } else if (insn->addr_bytes == 2) { in insn_get_displacement()
381 insn->displacement.value = in insn_get_displacement()
382 get_next(short, insn); in insn_get_displacement()
383 insn->displacement.nbytes = 2; in insn_get_displacement()
388 insn->displacement.value = get_next(int, insn); in insn_get_displacement()
389 insn->displacement.nbytes = 4; in insn_get_displacement()
394 insn->displacement.got = 1; in insn_get_displacement()
401 static int __get_moffset(struct insn *insn) in __get_moffset() argument
403 switch (insn->addr_bytes) { in __get_moffset()
405 insn->moffset1.value = get_next(short, insn); in __get_moffset()
406 insn->moffset1.nbytes = 2; in __get_moffset()
409 insn->moffset1.value = get_next(int, insn); in __get_moffset()
410 insn->moffset1.nbytes = 4; in __get_moffset()
413 insn->moffset1.value = get_next(int, insn); in __get_moffset()
414 insn->moffset1.nbytes = 4; in __get_moffset()
415 insn->moffset2.value = get_next(int, insn); in __get_moffset()
416 insn->moffset2.nbytes = 4; in __get_moffset()
421 insn->moffset1.got = insn->moffset2.got = 1; in __get_moffset()
430 static int __get_immv32(struct insn *insn) in __get_immv32() argument
432 switch (insn->opnd_bytes) { in __get_immv32()
434 insn->immediate.value = get_next(short, insn); in __get_immv32()
435 insn->immediate.nbytes = 2; in __get_immv32()
439 insn->immediate.value = get_next(int, insn); in __get_immv32()
440 insn->immediate.nbytes = 4; in __get_immv32()
453 static int __get_immv(struct insn *insn) in __get_immv() argument
455 switch (insn->opnd_bytes) { in __get_immv()
457 insn->immediate1.value = get_next(short, insn); in __get_immv()
458 insn->immediate1.nbytes = 2; in __get_immv()
461 insn->immediate1.value = get_next(int, insn); in __get_immv()
462 insn->immediate1.nbytes = 4; in __get_immv()
465 insn->immediate1.value = get_next(int, insn); in __get_immv()
466 insn->immediate1.nbytes = 4; in __get_immv()
467 insn->immediate2.value = get_next(int, insn); in __get_immv()
468 insn->immediate2.nbytes = 4; in __get_immv()
473 insn->immediate1.got = insn->immediate2.got = 1; in __get_immv()
481 static int __get_immptr(struct insn *insn) in __get_immptr() argument
483 switch (insn->opnd_bytes) { in __get_immptr()
485 insn->immediate1.value = get_next(short, insn); in __get_immptr()
486 insn->immediate1.nbytes = 2; in __get_immptr()
489 insn->immediate1.value = get_next(int, insn); in __get_immptr()
490 insn->immediate1.nbytes = 4; in __get_immptr()
498 insn->immediate2.value = get_next(unsigned short, insn); in __get_immptr()
499 insn->immediate2.nbytes = 2; in __get_immptr()
500 insn->immediate1.got = insn->immediate2.got = 1; in __get_immptr()
516 void insn_get_immediate(struct insn *insn) in insn_get_immediate() argument
518 if (insn->immediate.got) in insn_get_immediate()
520 if (!insn->displacement.got) in insn_get_immediate()
521 insn_get_displacement(insn); in insn_get_immediate()
523 if (inat_has_moffset(insn->attr)) { in insn_get_immediate()
524 if (!__get_moffset(insn)) in insn_get_immediate()
529 if (!inat_has_immediate(insn->attr)) in insn_get_immediate()
533 switch (inat_immediate_size(insn->attr)) { in insn_get_immediate()
535 insn->immediate.value = get_next(char, insn); in insn_get_immediate()
536 insn->immediate.nbytes = 1; in insn_get_immediate()
539 insn->immediate.value = get_next(short, insn); in insn_get_immediate()
540 insn->immediate.nbytes = 2; in insn_get_immediate()
543 insn->immediate.value = get_next(int, insn); in insn_get_immediate()
544 insn->immediate.nbytes = 4; in insn_get_immediate()
547 insn->immediate1.value = get_next(int, insn); in insn_get_immediate()
548 insn->immediate1.nbytes = 4; in insn_get_immediate()
549 insn->immediate2.value = get_next(int, insn); in insn_get_immediate()
550 insn->immediate2.nbytes = 4; in insn_get_immediate()
553 if (!__get_immptr(insn)) in insn_get_immediate()
557 if (!__get_immv32(insn)) in insn_get_immediate()
561 if (!__get_immv(insn)) in insn_get_immediate()
568 if (inat_has_second_immediate(insn->attr)) { in insn_get_immediate()
569 insn->immediate2.value = get_next(char, insn); in insn_get_immediate()
570 insn->immediate2.nbytes = 1; in insn_get_immediate()
573 insn->immediate.got = 1; in insn_get_immediate()
586 void insn_get_length(struct insn *insn) in insn_get_length() argument
588 if (insn->length) in insn_get_length()
590 if (!insn->immediate.got) in insn_get_length()
591 insn_get_immediate(insn); in insn_get_length()
592 insn->length = (unsigned char)((unsigned long)insn->next_byte in insn_get_length()
593 - (unsigned long)insn->kaddr); in insn_get_length()