Lines Matching refs:ild
99 static inline uint8_t get_byte(const struct pt_ild *ild, uint8_t i) in get_byte() argument
101 return ild->itext[i]; in get_byte()
104 static inline uint8_t const *get_byte_ptr(const struct pt_ild *ild, uint8_t i) in get_byte_ptr() argument
106 return ild->itext + i; in get_byte_ptr()
109 static inline int mode_64b(const struct pt_ild *ild) in mode_64b() argument
111 return ild->mode == ptem_64bit; in mode_64b()
114 static inline int mode_32b(const struct pt_ild *ild) in mode_32b() argument
116 return ild->mode == ptem_32bit; in mode_32b()
125 pti_get_nominal_eosz_non64(const struct pt_ild *ild) in pti_get_nominal_eosz_non64() argument
127 if (mode_32b(ild)) { in pti_get_nominal_eosz_non64()
128 if (ild->u.s.osz) in pti_get_nominal_eosz_non64()
132 if (ild->u.s.osz) in pti_get_nominal_eosz_non64()
138 pti_get_nominal_eosz(const struct pt_ild *ild) in pti_get_nominal_eosz() argument
140 if (mode_64b(ild)) { in pti_get_nominal_eosz()
141 if (ild->u.s.rex_w) in pti_get_nominal_eosz()
143 if (ild->u.s.osz) in pti_get_nominal_eosz()
147 return pti_get_nominal_eosz_non64(ild); in pti_get_nominal_eosz()
151 pti_get_nominal_eosz_df64(const struct pt_ild *ild) in pti_get_nominal_eosz_df64() argument
153 if (mode_64b(ild)) { in pti_get_nominal_eosz_df64()
154 if (ild->u.s.rex_w) in pti_get_nominal_eosz_df64()
156 if (ild->u.s.osz) in pti_get_nominal_eosz_df64()
162 return pti_get_nominal_eosz_non64(ild); in pti_get_nominal_eosz_df64()
166 pti_get_nominal_easz_non64(const struct pt_ild *ild) in pti_get_nominal_easz_non64() argument
168 if (mode_32b(ild)) { in pti_get_nominal_easz_non64()
169 if (ild->u.s.asz) in pti_get_nominal_easz_non64()
173 if (ild->u.s.asz) in pti_get_nominal_easz_non64()
179 pti_get_nominal_easz(const struct pt_ild *ild) in pti_get_nominal_easz() argument
181 if (mode_64b(ild)) { in pti_get_nominal_easz()
182 if (ild->u.s.asz) in pti_get_nominal_easz()
186 return pti_get_nominal_easz_non64(ild); in pti_get_nominal_easz()
223 static int set_imm_bytes(struct pt_ild *ild) in set_imm_bytes() argument
232 if (!ild) in set_imm_bytes()
235 map = ild->map; in set_imm_bytes()
240 imm_code = map_map[map][ild->nominal_opcode]; in set_imm_bytes()
248 ild->imm1_bytes = 1; in set_imm_bytes()
252 ild->imm1_bytes = 1; in set_imm_bytes()
257 return resolve_z(&ild->imm1_bytes, pti_get_nominal_eosz(ild)); in set_imm_bytes()
261 return resolve_v(&ild->imm1_bytes, pti_get_nominal_eosz(ild)); in set_imm_bytes()
264 ild->imm1_bytes = 2; in set_imm_bytes()
269 return resolve_z(&ild->imm1_bytes, in set_imm_bytes()
270 pti_get_nominal_eosz_df64(ild)); in set_imm_bytes()
273 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) < 2) { in set_imm_bytes()
274 return resolve_z(&ild->imm1_bytes, in set_imm_bytes()
275 pti_get_nominal_eosz(ild)); in set_imm_bytes()
280 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) == 0) { in set_imm_bytes()
281 return resolve_z(&ild->imm1_bytes, in set_imm_bytes()
282 pti_get_nominal_eosz(ild)); in set_imm_bytes()
287 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) < 2) in set_imm_bytes()
288 ild->imm1_bytes = 1; in set_imm_bytes()
293 if (ild->map == PTI_MAP_0) { in set_imm_bytes()
295 ild->imm1_bytes = 2; in set_imm_bytes()
296 ild->imm2_bytes = 1; in set_imm_bytes()
304 if (ild->map == PTI_MAP_1) { in set_imm_bytes()
305 if (ild->u.s.osz || ild->u.s.last_f2f3 == 2) { in set_imm_bytes()
306 ild->imm1_bytes = 1; in set_imm_bytes()
307 ild->imm2_bytes = 1; in set_imm_bytes()
314 static int imm_dec(struct pt_ild *ild, uint8_t length) in imm_dec() argument
318 if (!ild) in imm_dec()
321 if (ild->map == PTI_MAP_AMD3DNOW) { in imm_dec()
322 if (ild->max_bytes <= length) in imm_dec()
325 ild->nominal_opcode = get_byte(ild, length); in imm_dec()
329 errcode = set_imm_bytes(ild); in imm_dec()
333 length += ild->imm1_bytes; in imm_dec()
334 length += ild->imm2_bytes; in imm_dec()
335 if (ild->max_bytes < length) in imm_dec()
341 static int compute_disp_dec(struct pt_ild *ild) in compute_disp_dec() argument
350 if (!ild) in compute_disp_dec()
353 if (0 < ild->disp_bytes) in compute_disp_dec()
356 map = ild->map; in compute_disp_dec()
361 disp_kind = map_map[map][ild->nominal_opcode]; in compute_disp_dec()
364 ild->disp_bytes = 0; in compute_disp_dec()
372 ild->disp_bytes = 1; in compute_disp_dec()
377 if (mode_64b(ild)) { in compute_disp_dec()
378 ild->disp_bytes = 4; in compute_disp_dec()
382 return resolve_z(&ild->disp_bytes, in compute_disp_dec()
383 pti_get_nominal_eosz(ild)); in compute_disp_dec()
387 return resolve_v(&ild->disp_bytes, pti_get_nominal_easz(ild)); in compute_disp_dec()
391 return resolve_z(&ild->disp_bytes, pti_get_nominal_eosz(ild)); in compute_disp_dec()
395 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) == 7) { in compute_disp_dec()
396 return resolve_z(&ild->disp_bytes, in compute_disp_dec()
397 pti_get_nominal_eosz(ild)); in compute_disp_dec()
406 static int disp_dec(struct pt_ild *ild, uint8_t length) in disp_dec() argument
411 if (!ild) in disp_dec()
414 errcode = compute_disp_dec(ild); in disp_dec()
418 disp_bytes = ild->disp_bytes; in disp_dec()
420 return imm_dec(ild, length); in disp_dec()
422 if (length + disp_bytes > ild->max_bytes) in disp_dec()
427 ild->disp_pos = length; in disp_dec()
429 return imm_dec(ild, length + disp_bytes); in disp_dec()
432 static int sib_dec(struct pt_ild *ild, uint8_t length) in sib_dec() argument
436 if (!ild) in sib_dec()
439 if (ild->max_bytes <= length) in sib_dec()
442 sib = get_byte(ild, length); in sib_dec()
443 if ((sib & 0x07) == 0x05 && pti_get_modrm_mod(ild) == 0) in sib_dec()
444 ild->disp_bytes = 4; in sib_dec()
446 return disp_dec(ild, length + 1); in sib_dec()
449 static int modrm_dec(struct pt_ild *ild, uint8_t length) in modrm_dec() argument
458 if (!ild) in modrm_dec()
461 map = pti_get_map(ild); in modrm_dec()
465 has_modrm = has_modrm_2d[map][ild->nominal_opcode]; in modrm_dec()
468 return disp_dec(ild, length); in modrm_dec()
471 if (length >= ild->max_bytes) in modrm_dec()
474 ild->modrm_byte = get_byte(ild, length); in modrm_dec()
479 uint8_t eamode = eamode_table[ild->u.s.asz][ild->mode]; in modrm_dec()
480 uint8_t mod = (uint8_t) pti_get_modrm_mod(ild); in modrm_dec()
481 uint8_t rm = (uint8_t) pti_get_modrm_rm(ild); in modrm_dec()
484 ild->disp_bytes = has_disp_regular[eamode][mod][rm]; in modrm_dec()
488 return sib_dec(ild, length + 1); in modrm_dec()
491 return disp_dec(ild, length + 1); in modrm_dec()
494 static inline int get_next_as_opcode(struct pt_ild *ild, uint8_t length) in get_next_as_opcode() argument
496 if (!ild) in get_next_as_opcode()
499 if (ild->max_bytes <= length) in get_next_as_opcode()
502 ild->nominal_opcode = get_byte(ild, length); in get_next_as_opcode()
504 return modrm_dec(ild, length + 1); in get_next_as_opcode()
507 static int opcode_dec(struct pt_ild *ild, uint8_t length) in opcode_dec() argument
511 if (!ild) in opcode_dec()
515 b = get_byte(ild, length); in opcode_dec()
517 ild->map = PTI_MAP_0; in opcode_dec()
518 ild->nominal_opcode = b; in opcode_dec()
520 return modrm_dec(ild, length + 1); in opcode_dec()
525 if (ild->max_bytes <= length) in opcode_dec()
529 m = get_byte(ild, length); in opcode_dec()
531 ild->map = PTI_MAP_2; in opcode_dec()
533 return get_next_as_opcode(ild, length + 1); in opcode_dec()
535 ild->map = PTI_MAP_3; in opcode_dec()
536 ild->imm1_bytes = 1; in opcode_dec()
538 return get_next_as_opcode(ild, length + 1); in opcode_dec()
540 ild->map = PTI_MAP_INVALID; in opcode_dec()
542 return get_next_as_opcode(ild, length + 1); in opcode_dec()
544 ild->map = PTI_MAP_AMD3DNOW; in opcode_dec()
545 ild->imm1_bytes = 1; in opcode_dec()
548 ild->nominal_opcode = 0x0F; in opcode_dec()
550 return modrm_dec(ild, length + 1); in opcode_dec()
552 ild->nominal_opcode = m; in opcode_dec()
553 ild->map = PTI_MAP_1; in opcode_dec()
555 return modrm_dec(ild, length + 1); in opcode_dec()
559 typedef int (*prefix_decoder)(struct pt_ild *ild, uint8_t length, uint8_t rex);
562 static inline int prefix_decode(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_decode() argument
566 if (!ild) in prefix_decode()
569 if (ild->max_bytes <= length) in prefix_decode()
572 byte = get_byte(ild, length); in prefix_decode()
574 return prefix_table[byte](ild, length, rex); in prefix_decode()
577 static inline int prefix_next(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_next() argument
579 return prefix_decode(ild, length + 1, rex); in prefix_next()
582 static int prefix_osz(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_osz() argument
586 if (!ild) in prefix_osz()
589 ild->u.s.osz = 1; in prefix_osz()
591 return prefix_next(ild, length, 0); in prefix_osz()
594 static int prefix_asz(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_asz() argument
598 if (!ild) in prefix_asz()
601 ild->u.s.asz = 1; in prefix_asz()
603 return prefix_next(ild, length, 0); in prefix_asz()
606 static int prefix_lock(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_lock() argument
610 if (!ild) in prefix_lock()
613 ild->u.s.lock = 1; in prefix_lock()
615 return prefix_next(ild, length, 0); in prefix_lock()
618 static int prefix_f2(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_f2() argument
622 if (!ild) in prefix_f2()
625 ild->u.s.f2 = 1; in prefix_f2()
626 ild->u.s.last_f2f3 = 2; in prefix_f2()
628 return prefix_next(ild, length, 0); in prefix_f2()
631 static int prefix_f3(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_f3() argument
635 if (!ild) in prefix_f3()
638 ild->u.s.f3 = 1; in prefix_f3()
639 ild->u.s.last_f2f3 = 3; in prefix_f3()
641 return prefix_next(ild, length, 0); in prefix_f3()
644 static int prefix_ignore(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_ignore() argument
648 return prefix_next(ild, length, 0); in prefix_ignore()
651 static int prefix_done(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_done() argument
653 if (!ild) in prefix_done()
657 ild->u.s.rex_r = 1; in prefix_done()
659 ild->u.s.rex_w = 1; in prefix_done()
661 return opcode_dec(ild, length); in prefix_done()
664 static int prefix_rex(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_rex() argument
668 if (!ild) in prefix_rex()
671 if (mode_64b(ild)) in prefix_rex()
672 return prefix_next(ild, length, get_byte(ild, length)); in prefix_rex()
674 return opcode_dec(ild, length); in prefix_rex()
677 static inline int prefix_vex_done(struct pt_ild *ild, uint8_t length) in prefix_vex_done() argument
679 if (!ild) in prefix_vex_done()
682 ild->nominal_opcode = get_byte(ild, length); in prefix_vex_done()
684 return modrm_dec(ild, length + 1); in prefix_vex_done()
687 static int prefix_vex_c5(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_vex_c5() argument
694 if (!ild) in prefix_vex_c5()
697 max_bytes = ild->max_bytes; in prefix_vex_c5()
703 p1 = get_byte(ild, length + 1); in prefix_vex_c5()
706 if (!mode_64b(ild) && !bits_match(p1, 0xc0, 0xc0)) in prefix_vex_c5()
707 return opcode_dec(ild, length); in prefix_vex_c5()
716 ild->u.s.vex = 1; in prefix_vex_c5()
718 ild->u.s.rex_r = 1; in prefix_vex_c5()
720 ild->map = PTI_MAP_1; in prefix_vex_c5()
724 return prefix_vex_done(ild, length); in prefix_vex_c5()
727 static int prefix_vex_c4(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_vex_c4() argument
734 if (!ild) in prefix_vex_c4()
737 max_bytes = ild->max_bytes; in prefix_vex_c4()
743 p1 = get_byte(ild, length + 1); in prefix_vex_c4()
746 if (!mode_64b(ild) && !bits_match(p1, 0xc0, 0xc0)) in prefix_vex_c4()
747 return opcode_dec(ild, length); in prefix_vex_c4()
756 p2 = get_byte(ild, length + 2); in prefix_vex_c4()
758 ild->u.s.vex = 1; in prefix_vex_c4()
760 ild->u.s.rex_r = 1; in prefix_vex_c4()
762 ild->u.s.rex_w = 1; in prefix_vex_c4()
768 ild->map = map; in prefix_vex_c4()
770 ild->imm1_bytes = 1; in prefix_vex_c4()
774 return prefix_vex_done(ild, length); in prefix_vex_c4()
777 static int prefix_evex(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_evex() argument
784 if (!ild) in prefix_evex()
787 max_bytes = ild->max_bytes; in prefix_evex()
793 p1 = get_byte(ild, length + 1); in prefix_evex()
796 if (!mode_64b(ild) && !bits_match(p1, 0xc0, 0xc0)) in prefix_evex()
797 return opcode_dec(ild, length); in prefix_evex()
806 p2 = get_byte(ild, length + 2); in prefix_evex()
808 ild->u.s.vex = 1; in prefix_evex()
810 ild->u.s.rex_r = 1; in prefix_evex()
812 ild->u.s.rex_w = 1; in prefix_evex()
815 ild->map = map; in prefix_evex()
818 ild->imm1_bytes = 1; in prefix_evex()
822 return prefix_vex_done(ild, length); in prefix_evex()
855 static int decode(struct pt_ild *ild) in decode() argument
857 return prefix_decode(ild, 0, 0); in decode()
860 static int set_branch_target(struct pt_insn_ext *iext, const struct pt_ild *ild) in set_branch_target() argument
862 if (!iext || !ild) in set_branch_target()
867 if (ild->disp_bytes == 1) { in set_branch_target()
869 get_byte_ptr(ild, ild->disp_pos); in set_branch_target()
872 } else if (ild->disp_bytes == 2) { in set_branch_target()
874 get_byte_ptr(ild, ild->disp_pos); in set_branch_target()
877 } else if (ild->disp_bytes == 4) { in set_branch_target()
879 get_byte_ptr(ild, ild->disp_pos); in set_branch_target()
898 static int pt_instruction_length_decode(struct pt_ild *ild) in pt_instruction_length_decode() argument
900 if (!ild) in pt_instruction_length_decode()
903 ild->u.i = 0; in pt_instruction_length_decode()
904 ild->imm1_bytes = 0; in pt_instruction_length_decode()
905 ild->imm2_bytes = 0; in pt_instruction_length_decode()
906 ild->disp_bytes = 0; in pt_instruction_length_decode()
907 ild->modrm_byte = 0; in pt_instruction_length_decode()
908 ild->map = PTI_MAP_INVALID; in pt_instruction_length_decode()
910 if (!ild->mode) in pt_instruction_length_decode()
913 return decode(ild); in pt_instruction_length_decode()
917 const struct pt_ild *ild) in pt_instruction_decode() argument
921 if (!iext || !ild) in pt_instruction_decode()
929 opcode = ild->nominal_opcode; in pt_instruction_decode()
930 map = ild->map; in pt_instruction_decode()
934 if (ild->u.s.vex) in pt_instruction_decode()
943 return set_branch_target(iext, ild); in pt_instruction_decode()
952 return set_branch_target(iext, ild); in pt_instruction_decode()
957 switch (ild->nominal_opcode) { in pt_instruction_decode()
967 uint8_t reg = pti_get_modrm_reg(ild); in pt_instruction_decode()
990 return set_branch_target(iext, ild); in pt_instruction_decode()
1038 return set_branch_target(iext, ild); in pt_instruction_decode()
1055 return set_branch_target(iext, ild); in pt_instruction_decode()
1064 return set_branch_target(iext, ild); in pt_instruction_decode()
1073 return set_branch_target(iext, ild); in pt_instruction_decode()
1082 return set_branch_target(iext, ild); in pt_instruction_decode()
1091 return set_branch_target(iext, ild); in pt_instruction_decode()
1097 if (pti_get_modrm_reg(ild) == 3) in pt_instruction_decode()
1098 if (!ild->u.s.rex_r) in pt_instruction_decode()
1161 switch (ild->modrm_byte) { in pt_instruction_decode()
1185 pti_get_modrm_mod(ild) != 3 && in pt_instruction_decode()
1186 pti_get_modrm_reg(ild) == 6) in pt_instruction_decode()
1192 if (map == PTI_MAP_1 && ild->u.s.f3 && !ild->u.s.osz && in pt_instruction_decode()
1193 pti_get_modrm_reg(ild) == 4) { in pt_instruction_decode()
1206 struct pt_ild ild; in pt_ild_decode() local
1212 ild.mode = insn->mode; in pt_ild_decode()
1213 ild.itext = insn->raw; in pt_ild_decode()
1214 ild.max_bytes = insn->size; in pt_ild_decode()
1216 size = pt_instruction_length_decode(&ild); in pt_ild_decode()
1222 return pt_instruction_decode(insn, iext, &ild); in pt_ild_decode()