Lines Matching refs:ild
60 static inline uint8_t get_byte(const struct pt_ild *ild, uint8_t i) in get_byte() argument
62 return ild->itext[i]; in get_byte()
65 static inline uint8_t const *get_byte_ptr(const struct pt_ild *ild, uint8_t i) in get_byte_ptr() argument
67 return ild->itext + i; in get_byte_ptr()
70 static inline int mode_64b(const struct pt_ild *ild) in mode_64b() argument
72 return ild->mode == ptem_64bit; in mode_64b()
75 static inline int mode_32b(const struct pt_ild *ild) in mode_32b() argument
77 return ild->mode == ptem_32bit; in mode_32b()
86 pti_get_nominal_eosz_non64(const struct pt_ild *ild) in pti_get_nominal_eosz_non64() argument
88 if (mode_32b(ild)) { in pti_get_nominal_eosz_non64()
89 if (ild->u.s.osz) in pti_get_nominal_eosz_non64()
93 if (ild->u.s.osz) in pti_get_nominal_eosz_non64()
99 pti_get_nominal_eosz(const struct pt_ild *ild) in pti_get_nominal_eosz() argument
101 if (mode_64b(ild)) { in pti_get_nominal_eosz()
102 if (ild->u.s.rex_w) in pti_get_nominal_eosz()
104 if (ild->u.s.osz) in pti_get_nominal_eosz()
108 return pti_get_nominal_eosz_non64(ild); in pti_get_nominal_eosz()
112 pti_get_nominal_eosz_df64(const struct pt_ild *ild) in pti_get_nominal_eosz_df64() argument
114 if (mode_64b(ild)) { in pti_get_nominal_eosz_df64()
115 if (ild->u.s.rex_w) in pti_get_nominal_eosz_df64()
117 if (ild->u.s.osz) in pti_get_nominal_eosz_df64()
123 return pti_get_nominal_eosz_non64(ild); in pti_get_nominal_eosz_df64()
127 pti_get_nominal_easz_non64(const struct pt_ild *ild) in pti_get_nominal_easz_non64() argument
129 if (mode_32b(ild)) { in pti_get_nominal_easz_non64()
130 if (ild->u.s.asz) in pti_get_nominal_easz_non64()
134 if (ild->u.s.asz) in pti_get_nominal_easz_non64()
140 pti_get_nominal_easz(const struct pt_ild *ild) in pti_get_nominal_easz() argument
142 if (mode_64b(ild)) { in pti_get_nominal_easz()
143 if (ild->u.s.asz) in pti_get_nominal_easz()
147 return pti_get_nominal_easz_non64(ild); in pti_get_nominal_easz()
184 static int set_imm_bytes(struct pt_ild *ild) in set_imm_bytes() argument
193 if (!ild) in set_imm_bytes()
196 map = ild->map; in set_imm_bytes()
201 imm_code = map_map[map][ild->nominal_opcode]; in set_imm_bytes()
209 ild->imm1_bytes = 1; in set_imm_bytes()
213 ild->imm1_bytes = 1; in set_imm_bytes()
218 return resolve_z(&ild->imm1_bytes, pti_get_nominal_eosz(ild)); in set_imm_bytes()
222 return resolve_v(&ild->imm1_bytes, pti_get_nominal_eosz(ild)); in set_imm_bytes()
225 ild->imm1_bytes = 2; in set_imm_bytes()
230 return resolve_z(&ild->imm1_bytes, in set_imm_bytes()
231 pti_get_nominal_eosz_df64(ild)); in set_imm_bytes()
234 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) < 2) { in set_imm_bytes()
235 return resolve_z(&ild->imm1_bytes, in set_imm_bytes()
236 pti_get_nominal_eosz(ild)); in set_imm_bytes()
241 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) == 0) { in set_imm_bytes()
242 return resolve_z(&ild->imm1_bytes, in set_imm_bytes()
243 pti_get_nominal_eosz(ild)); in set_imm_bytes()
248 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) < 2) in set_imm_bytes()
249 ild->imm1_bytes = 1; in set_imm_bytes()
254 if (ild->map == PTI_MAP_0) { in set_imm_bytes()
256 ild->imm1_bytes = 2; in set_imm_bytes()
257 ild->imm2_bytes = 1; in set_imm_bytes()
265 if (ild->map == PTI_MAP_1) { in set_imm_bytes()
266 if (ild->u.s.osz || ild->u.s.last_f2f3 == 2) { in set_imm_bytes()
267 ild->imm1_bytes = 1; in set_imm_bytes()
268 ild->imm2_bytes = 1; in set_imm_bytes()
275 static int imm_dec(struct pt_ild *ild, uint8_t length) in imm_dec() argument
279 if (!ild) in imm_dec()
282 if (ild->map == PTI_MAP_AMD3DNOW) { in imm_dec()
283 if (ild->max_bytes <= length) in imm_dec()
286 ild->nominal_opcode = get_byte(ild, length); in imm_dec()
290 errcode = set_imm_bytes(ild); in imm_dec()
294 length += ild->imm1_bytes; in imm_dec()
295 length += ild->imm2_bytes; in imm_dec()
296 if (ild->max_bytes < length) in imm_dec()
302 static int compute_disp_dec(struct pt_ild *ild) in compute_disp_dec() argument
311 if (!ild) in compute_disp_dec()
314 if (0 < ild->disp_bytes) in compute_disp_dec()
317 map = ild->map; in compute_disp_dec()
322 disp_kind = map_map[map][ild->nominal_opcode]; in compute_disp_dec()
325 ild->disp_bytes = 0; in compute_disp_dec()
333 ild->disp_bytes = 1; in compute_disp_dec()
338 if (mode_64b(ild)) { in compute_disp_dec()
339 ild->disp_bytes = 4; in compute_disp_dec()
343 return resolve_z(&ild->disp_bytes, in compute_disp_dec()
344 pti_get_nominal_eosz(ild)); in compute_disp_dec()
348 return resolve_v(&ild->disp_bytes, pti_get_nominal_easz(ild)); in compute_disp_dec()
352 return resolve_z(&ild->disp_bytes, pti_get_nominal_eosz(ild)); in compute_disp_dec()
356 if (ild->map == PTI_MAP_0 && pti_get_modrm_reg(ild) == 7) { in compute_disp_dec()
357 return resolve_z(&ild->disp_bytes, in compute_disp_dec()
358 pti_get_nominal_eosz(ild)); in compute_disp_dec()
367 static int disp_dec(struct pt_ild *ild, uint8_t length) in disp_dec() argument
372 if (!ild) in disp_dec()
375 errcode = compute_disp_dec(ild); in disp_dec()
379 disp_bytes = ild->disp_bytes; in disp_dec()
381 return imm_dec(ild, length); in disp_dec()
383 if (length + disp_bytes > ild->max_bytes) in disp_dec()
388 ild->disp_pos = length; in disp_dec()
390 return imm_dec(ild, length + disp_bytes); in disp_dec()
393 static int sib_dec(struct pt_ild *ild, uint8_t length) in sib_dec() argument
397 if (!ild) in sib_dec()
400 if (ild->max_bytes <= length) in sib_dec()
403 sib = get_byte(ild, length); in sib_dec()
404 if ((sib & 0x07) == 0x05 && pti_get_modrm_mod(ild) == 0) in sib_dec()
405 ild->disp_bytes = 4; in sib_dec()
407 return disp_dec(ild, length + 1); in sib_dec()
410 static int modrm_dec(struct pt_ild *ild, uint8_t length) in modrm_dec() argument
419 if (!ild) in modrm_dec()
422 map = pti_get_map(ild); in modrm_dec()
426 has_modrm = has_modrm_2d[map][ild->nominal_opcode]; in modrm_dec()
429 return disp_dec(ild, length); in modrm_dec()
432 if (length >= ild->max_bytes) in modrm_dec()
435 ild->modrm_byte = get_byte(ild, length); in modrm_dec()
440 uint8_t eamode = eamode_table[ild->u.s.asz][ild->mode]; in modrm_dec()
441 uint8_t mod = (uint8_t) pti_get_modrm_mod(ild); in modrm_dec()
442 uint8_t rm = (uint8_t) pti_get_modrm_rm(ild); in modrm_dec()
445 ild->disp_bytes = disp_default[eamode][mod][rm]; in modrm_dec()
449 return sib_dec(ild, length + 1); in modrm_dec()
452 return disp_dec(ild, length + 1); in modrm_dec()
455 static inline int get_next_as_opcode(struct pt_ild *ild, uint8_t length) in get_next_as_opcode() argument
457 if (!ild) in get_next_as_opcode()
460 if (ild->max_bytes <= length) in get_next_as_opcode()
463 ild->nominal_opcode = get_byte(ild, length); in get_next_as_opcode()
465 return modrm_dec(ild, length + 1); in get_next_as_opcode()
468 static int opcode_dec(struct pt_ild *ild, uint8_t length) in opcode_dec() argument
472 if (!ild) in opcode_dec()
476 b = get_byte(ild, length); in opcode_dec()
478 ild->map = PTI_MAP_0; in opcode_dec()
479 ild->nominal_opcode = b; in opcode_dec()
481 return modrm_dec(ild, length + 1); in opcode_dec()
486 if (ild->max_bytes <= length) in opcode_dec()
490 m = get_byte(ild, length); in opcode_dec()
492 ild->map = PTI_MAP_2; in opcode_dec()
494 return get_next_as_opcode(ild, length + 1); in opcode_dec()
496 ild->map = PTI_MAP_3; in opcode_dec()
497 ild->imm1_bytes = 1; in opcode_dec()
499 return get_next_as_opcode(ild, length + 1); in opcode_dec()
501 ild->map = PTI_MAP_INVALID; in opcode_dec()
503 return get_next_as_opcode(ild, length + 1); in opcode_dec()
505 ild->map = PTI_MAP_AMD3DNOW; in opcode_dec()
506 ild->imm1_bytes = 1; in opcode_dec()
509 ild->nominal_opcode = 0x0F; in opcode_dec()
511 return modrm_dec(ild, length + 1); in opcode_dec()
513 ild->nominal_opcode = m; in opcode_dec()
514 ild->map = PTI_MAP_1; in opcode_dec()
516 return modrm_dec(ild, length + 1); in opcode_dec()
520 typedef int (*prefix_decoder)(struct pt_ild *ild, uint8_t length, uint8_t rex);
522 static int prefix_osz(struct pt_ild *ild, uint8_t length, uint8_t rex);
523 static int prefix_asz(struct pt_ild *ild, uint8_t length, uint8_t rex);
524 static int prefix_lock(struct pt_ild *ild, uint8_t length, uint8_t rex);
525 static int prefix_f2(struct pt_ild *ild, uint8_t length, uint8_t rex);
526 static int prefix_f3(struct pt_ild *ild, uint8_t length, uint8_t rex);
527 static int prefix_rex(struct pt_ild *ild, uint8_t length, uint8_t rex);
528 static int prefix_vex_c4(struct pt_ild *ild, uint8_t length, uint8_t rex);
529 static int prefix_vex_c5(struct pt_ild *ild, uint8_t length, uint8_t rex);
530 static int prefix_evex(struct pt_ild *ild, uint8_t length, uint8_t rex);
531 static int prefix_ignore(struct pt_ild *ild, uint8_t length, uint8_t rex);
532 static int prefix_done(struct pt_ild *ild, uint8_t length, uint8_t rex);
808 static inline int prefix_decode(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_decode() argument
812 if (!ild) in prefix_decode()
815 if (ild->max_bytes <= length) in prefix_decode()
818 byte = get_byte(ild, length); in prefix_decode()
820 return prefix_table[byte](ild, length, rex); in prefix_decode()
823 static inline int prefix_next(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_next() argument
825 return prefix_decode(ild, length + 1, rex); in prefix_next()
828 static int prefix_osz(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_osz() argument
832 if (!ild) in prefix_osz()
835 ild->u.s.osz = 1; in prefix_osz()
837 return prefix_next(ild, length, 0); in prefix_osz()
840 static int prefix_asz(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_asz() argument
844 if (!ild) in prefix_asz()
847 ild->u.s.asz = 1; in prefix_asz()
849 return prefix_next(ild, length, 0); in prefix_asz()
852 static int prefix_lock(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_lock() argument
856 if (!ild) in prefix_lock()
859 ild->u.s.lock = 1; in prefix_lock()
861 return prefix_next(ild, length, 0); in prefix_lock()
864 static int prefix_f2(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_f2() argument
868 if (!ild) in prefix_f2()
871 ild->u.s.f2 = 1; in prefix_f2()
872 ild->u.s.last_f2f3 = 2; in prefix_f2()
874 return prefix_next(ild, length, 0); in prefix_f2()
877 static int prefix_f3(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_f3() argument
881 if (!ild) in prefix_f3()
884 ild->u.s.f3 = 1; in prefix_f3()
885 ild->u.s.last_f2f3 = 3; in prefix_f3()
887 return prefix_next(ild, length, 0); in prefix_f3()
890 static int prefix_ignore(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_ignore() argument
894 return prefix_next(ild, length, 0); in prefix_ignore()
897 static int prefix_done(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_done() argument
899 if (!ild) in prefix_done()
903 ild->u.s.rex_r = 1; in prefix_done()
905 ild->u.s.rex_w = 1; in prefix_done()
907 return opcode_dec(ild, length); in prefix_done()
910 static int prefix_rex(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_rex() argument
914 if (!ild) in prefix_rex()
917 if (mode_64b(ild)) in prefix_rex()
918 return prefix_next(ild, length, get_byte(ild, length)); in prefix_rex()
920 return opcode_dec(ild, length); in prefix_rex()
923 static inline int prefix_vex_done(struct pt_ild *ild, uint8_t length) in prefix_vex_done() argument
925 if (!ild) in prefix_vex_done()
928 ild->nominal_opcode = get_byte(ild, length); in prefix_vex_done()
930 return modrm_dec(ild, length + 1); in prefix_vex_done()
933 static int prefix_vex_c5(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_vex_c5() argument
940 if (!ild) in prefix_vex_c5()
943 max_bytes = ild->max_bytes; in prefix_vex_c5()
949 p1 = get_byte(ild, length + 1); in prefix_vex_c5()
952 if (!mode_64b(ild) && !bits_match(p1, 0xc0, 0xc0)) in prefix_vex_c5()
953 return opcode_dec(ild, length); in prefix_vex_c5()
962 ild->u.s.vex = 1; in prefix_vex_c5()
964 ild->u.s.rex_r = 1; in prefix_vex_c5()
966 ild->map = PTI_MAP_1; in prefix_vex_c5()
970 return prefix_vex_done(ild, length); in prefix_vex_c5()
973 static int prefix_vex_c4(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_vex_c4() argument
980 if (!ild) in prefix_vex_c4()
983 max_bytes = ild->max_bytes; in prefix_vex_c4()
989 p1 = get_byte(ild, length + 1); in prefix_vex_c4()
992 if (!mode_64b(ild) && !bits_match(p1, 0xc0, 0xc0)) in prefix_vex_c4()
993 return opcode_dec(ild, length); in prefix_vex_c4()
1002 p2 = get_byte(ild, length + 2); in prefix_vex_c4()
1004 ild->u.s.vex = 1; in prefix_vex_c4()
1006 ild->u.s.rex_r = 1; in prefix_vex_c4()
1008 ild->u.s.rex_w = 1; in prefix_vex_c4()
1014 ild->map = map; in prefix_vex_c4()
1016 ild->imm1_bytes = 1; in prefix_vex_c4()
1020 return prefix_vex_done(ild, length); in prefix_vex_c4()
1023 static int prefix_evex(struct pt_ild *ild, uint8_t length, uint8_t rex) in prefix_evex() argument
1030 if (!ild) in prefix_evex()
1033 max_bytes = ild->max_bytes; in prefix_evex()
1039 p1 = get_byte(ild, length + 1); in prefix_evex()
1042 if (!mode_64b(ild) && !bits_match(p1, 0xc0, 0xc0)) in prefix_evex()
1043 return opcode_dec(ild, length); in prefix_evex()
1052 p2 = get_byte(ild, length + 2); in prefix_evex()
1054 ild->u.s.vex = 1; in prefix_evex()
1056 ild->u.s.rex_r = 1; in prefix_evex()
1058 ild->u.s.rex_w = 1; in prefix_evex()
1061 ild->map = map; in prefix_evex()
1064 ild->imm1_bytes = 1; in prefix_evex()
1068 return prefix_vex_done(ild, length); in prefix_evex()
1071 static int decode(struct pt_ild *ild) in decode() argument
1073 return prefix_decode(ild, 0, 0); in decode()
1076 static int set_branch_target(struct pt_insn_ext *iext, const struct pt_ild *ild) in set_branch_target() argument
1078 if (!iext || !ild) in set_branch_target()
1083 if (ild->disp_bytes == 1) { in set_branch_target()
1085 get_byte_ptr(ild, ild->disp_pos); in set_branch_target()
1088 } else if (ild->disp_bytes == 2) { in set_branch_target()
1090 get_byte_ptr(ild, ild->disp_pos); in set_branch_target()
1093 } else if (ild->disp_bytes == 4) { in set_branch_target()
1095 get_byte_ptr(ild, ild->disp_pos); in set_branch_target()
1104 static int pt_instruction_length_decode(struct pt_ild *ild) in pt_instruction_length_decode() argument
1106 if (!ild) in pt_instruction_length_decode()
1109 ild->u.i = 0; in pt_instruction_length_decode()
1110 ild->imm1_bytes = 0; in pt_instruction_length_decode()
1111 ild->imm2_bytes = 0; in pt_instruction_length_decode()
1112 ild->disp_bytes = 0; in pt_instruction_length_decode()
1113 ild->modrm_byte = 0; in pt_instruction_length_decode()
1114 ild->map = PTI_MAP_INVALID; in pt_instruction_length_decode()
1116 if (!ild->mode) in pt_instruction_length_decode()
1119 return decode(ild); in pt_instruction_length_decode()
1123 const struct pt_ild *ild) in pt_instruction_decode() argument
1127 if (!iext || !ild) in pt_instruction_decode()
1135 opcode = ild->nominal_opcode; in pt_instruction_decode()
1136 map = ild->map; in pt_instruction_decode()
1140 if (ild->u.s.vex) in pt_instruction_decode()
1149 return set_branch_target(iext, ild); in pt_instruction_decode()
1158 return set_branch_target(iext, ild); in pt_instruction_decode()
1163 switch (ild->nominal_opcode) { in pt_instruction_decode()
1173 uint8_t reg = pti_get_modrm_reg(ild); in pt_instruction_decode()
1196 return set_branch_target(iext, ild); in pt_instruction_decode()
1244 return set_branch_target(iext, ild); in pt_instruction_decode()
1261 return set_branch_target(iext, ild); in pt_instruction_decode()
1270 return set_branch_target(iext, ild); in pt_instruction_decode()
1279 return set_branch_target(iext, ild); in pt_instruction_decode()
1288 return set_branch_target(iext, ild); in pt_instruction_decode()
1297 return set_branch_target(iext, ild); in pt_instruction_decode()
1303 if (pti_get_modrm_reg(ild) == 3) in pt_instruction_decode()
1304 if (!ild->u.s.rex_r) in pt_instruction_decode()
1367 switch (ild->modrm_byte) { in pt_instruction_decode()
1391 pti_get_modrm_mod(ild) != 3 && in pt_instruction_decode()
1392 pti_get_modrm_reg(ild) == 6) in pt_instruction_decode()
1398 if (map == PTI_MAP_1 && ild->u.s.f3 && !ild->u.s.osz && in pt_instruction_decode()
1399 pti_get_modrm_reg(ild) == 4) { in pt_instruction_decode()
1412 struct pt_ild ild; in pt_ild_decode() local
1418 ild.mode = insn->mode; in pt_ild_decode()
1419 ild.itext = insn->raw; in pt_ild_decode()
1420 ild.max_bytes = insn->size; in pt_ild_decode()
1422 size = pt_instruction_length_decode(&ild); in pt_ild_decode()
1428 return pt_instruction_decode(insn, iext, &ild); in pt_ild_decode()