Lines Matching refs:decoder

72 #define INTEL_PT_STATE_ERR1	(decoder->pkt_state)
160 static void intel_pt_setup_period(struct intel_pt_decoder *decoder) in intel_pt_setup_period() argument
162 if (decoder->period_type == INTEL_PT_PERIOD_TICKS) { in intel_pt_setup_period()
165 period = intel_pt_lower_power_of_2(decoder->period); in intel_pt_setup_period()
166 decoder->period_mask = ~(period - 1); in intel_pt_setup_period()
167 decoder->period_ticks = period; in intel_pt_setup_period()
180 struct intel_pt_decoder *decoder; in intel_pt_decoder_new() local
185 decoder = zalloc(sizeof(struct intel_pt_decoder)); in intel_pt_decoder_new()
186 if (!decoder) in intel_pt_decoder_new()
189 decoder->get_trace = params->get_trace; in intel_pt_decoder_new()
190 decoder->walk_insn = params->walk_insn; in intel_pt_decoder_new()
191 decoder->data = params->data; in intel_pt_decoder_new()
192 decoder->return_compression = params->return_compression; in intel_pt_decoder_new()
194 decoder->sign_bit = (uint64_t)1 << 47; in intel_pt_decoder_new()
195 decoder->sign_bits = ~(((uint64_t)1 << 48) - 1); in intel_pt_decoder_new()
197 decoder->period = params->period; in intel_pt_decoder_new()
198 decoder->period_type = params->period_type; in intel_pt_decoder_new()
200 decoder->max_non_turbo_ratio = params->max_non_turbo_ratio; in intel_pt_decoder_new()
201 decoder->max_non_turbo_ratio_fp = params->max_non_turbo_ratio; in intel_pt_decoder_new()
203 intel_pt_setup_period(decoder); in intel_pt_decoder_new()
205 decoder->mtc_shift = params->mtc_period; in intel_pt_decoder_new()
206 decoder->ctc_rem_mask = (1 << decoder->mtc_shift) - 1; in intel_pt_decoder_new()
208 decoder->tsc_ctc_ratio_n = params->tsc_ctc_ratio_n; in intel_pt_decoder_new()
209 decoder->tsc_ctc_ratio_d = params->tsc_ctc_ratio_d; in intel_pt_decoder_new()
211 if (!decoder->tsc_ctc_ratio_n) in intel_pt_decoder_new()
212 decoder->tsc_ctc_ratio_d = 0; in intel_pt_decoder_new()
214 if (decoder->tsc_ctc_ratio_d) { in intel_pt_decoder_new()
215 if (!(decoder->tsc_ctc_ratio_n % decoder->tsc_ctc_ratio_d)) in intel_pt_decoder_new()
216 decoder->tsc_ctc_mult = decoder->tsc_ctc_ratio_n / in intel_pt_decoder_new()
217 decoder->tsc_ctc_ratio_d; in intel_pt_decoder_new()
224 decoder->tsc_slip = multdiv(2 << decoder->mtc_shift, in intel_pt_decoder_new()
225 decoder->tsc_ctc_ratio_n, in intel_pt_decoder_new()
226 decoder->tsc_ctc_ratio_d); in intel_pt_decoder_new()
229 if (decoder->tsc_slip < 0x100) in intel_pt_decoder_new()
230 decoder->tsc_slip = 0x100; in intel_pt_decoder_new()
232 intel_pt_log("timestamp: mtc_shift %u\n", decoder->mtc_shift); in intel_pt_decoder_new()
233 intel_pt_log("timestamp: tsc_ctc_ratio_n %u\n", decoder->tsc_ctc_ratio_n); in intel_pt_decoder_new()
234 intel_pt_log("timestamp: tsc_ctc_ratio_d %u\n", decoder->tsc_ctc_ratio_d); in intel_pt_decoder_new()
235 intel_pt_log("timestamp: tsc_ctc_mult %u\n", decoder->tsc_ctc_mult); in intel_pt_decoder_new()
236 intel_pt_log("timestamp: tsc_slip %#x\n", decoder->tsc_slip); in intel_pt_decoder_new()
238 return decoder; in intel_pt_decoder_new()
312 void intel_pt_decoder_free(struct intel_pt_decoder *decoder) in intel_pt_decoder_free() argument
314 intel_pt_free_stack(&decoder->stack); in intel_pt_decoder_free()
315 free(decoder); in intel_pt_decoder_free()
365 static uint64_t intel_pt_calc_ip(struct intel_pt_decoder *decoder, in intel_pt_calc_ip() argument
387 if (ip & decoder->sign_bit) in intel_pt_calc_ip()
388 return ip | decoder->sign_bits; in intel_pt_calc_ip()
393 static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) in intel_pt_set_last_ip() argument
395 decoder->last_ip = intel_pt_calc_ip(decoder, &decoder->packet, in intel_pt_set_last_ip()
396 decoder->last_ip); in intel_pt_set_last_ip()
399 static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) in intel_pt_set_ip() argument
401 intel_pt_set_last_ip(decoder); in intel_pt_set_ip()
402 decoder->ip = decoder->last_ip; in intel_pt_set_ip()
405 static void intel_pt_decoder_log_packet(struct intel_pt_decoder *decoder) in intel_pt_decoder_log_packet() argument
407 intel_pt_log_packet(&decoder->packet, decoder->pkt_len, decoder->pos, in intel_pt_decoder_log_packet()
408 decoder->buf); in intel_pt_decoder_log_packet()
411 static int intel_pt_bug(struct intel_pt_decoder *decoder) in intel_pt_bug() argument
414 decoder->pkt_state = INTEL_PT_STATE_NO_PSB; in intel_pt_bug()
418 static inline void intel_pt_clear_tx_flags(struct intel_pt_decoder *decoder) in intel_pt_clear_tx_flags() argument
420 decoder->tx_flags = 0; in intel_pt_clear_tx_flags()
423 static inline void intel_pt_update_in_tx(struct intel_pt_decoder *decoder) in intel_pt_update_in_tx() argument
425 decoder->tx_flags = decoder->packet.payload & INTEL_PT_IN_TX; in intel_pt_update_in_tx()
428 static int intel_pt_bad_packet(struct intel_pt_decoder *decoder) in intel_pt_bad_packet() argument
430 intel_pt_clear_tx_flags(decoder); in intel_pt_bad_packet()
431 decoder->have_tma = false; in intel_pt_bad_packet()
432 decoder->pkt_len = 1; in intel_pt_bad_packet()
433 decoder->pkt_step = 1; in intel_pt_bad_packet()
434 intel_pt_decoder_log_packet(decoder); in intel_pt_bad_packet()
435 if (decoder->pkt_state != INTEL_PT_STATE_NO_PSB) { in intel_pt_bad_packet()
437 decoder->pkt_state = INTEL_PT_STATE_ERR1; in intel_pt_bad_packet()
442 static int intel_pt_get_data(struct intel_pt_decoder *decoder) in intel_pt_get_data() argument
447 decoder->pkt_step = 0; in intel_pt_get_data()
450 ret = decoder->get_trace(&buffer, decoder->data); in intel_pt_get_data()
453 decoder->buf = buffer.buf; in intel_pt_get_data()
454 decoder->len = buffer.len; in intel_pt_get_data()
455 if (!decoder->len) { in intel_pt_get_data()
460 decoder->ip = 0; in intel_pt_get_data()
461 decoder->pkt_state = INTEL_PT_STATE_NO_PSB; in intel_pt_get_data()
462 decoder->ref_timestamp = buffer.ref_timestamp; in intel_pt_get_data()
463 decoder->timestamp = 0; in intel_pt_get_data()
464 decoder->have_tma = false; in intel_pt_get_data()
465 decoder->state.trace_nr = buffer.trace_nr; in intel_pt_get_data()
467 decoder->ref_timestamp); in intel_pt_get_data()
474 static int intel_pt_get_next_data(struct intel_pt_decoder *decoder) in intel_pt_get_next_data() argument
476 if (!decoder->next_buf) in intel_pt_get_next_data()
477 return intel_pt_get_data(decoder); in intel_pt_get_next_data()
479 decoder->buf = decoder->next_buf; in intel_pt_get_next_data()
480 decoder->len = decoder->next_len; in intel_pt_get_next_data()
481 decoder->next_buf = 0; in intel_pt_get_next_data()
482 decoder->next_len = 0; in intel_pt_get_next_data()
486 static int intel_pt_get_split_packet(struct intel_pt_decoder *decoder) in intel_pt_get_split_packet() argument
488 unsigned char *buf = decoder->temp_buf; in intel_pt_get_split_packet()
492 old_len = decoder->len; in intel_pt_get_split_packet()
493 len = decoder->len; in intel_pt_get_split_packet()
494 memcpy(buf, decoder->buf, len); in intel_pt_get_split_packet()
496 ret = intel_pt_get_data(decoder); in intel_pt_get_split_packet()
498 decoder->pos += old_len; in intel_pt_get_split_packet()
503 if (n > decoder->len) in intel_pt_get_split_packet()
504 n = decoder->len; in intel_pt_get_split_packet()
505 memcpy(buf + len, decoder->buf, n); in intel_pt_get_split_packet()
508 ret = intel_pt_get_packet(buf, len, &decoder->packet); in intel_pt_get_split_packet()
510 decoder->next_buf = decoder->buf; in intel_pt_get_split_packet()
511 decoder->next_len = decoder->len; in intel_pt_get_split_packet()
512 decoder->buf = buf; in intel_pt_get_split_packet()
513 decoder->len = old_len; in intel_pt_get_split_packet()
514 return intel_pt_bad_packet(decoder); in intel_pt_get_split_packet()
517 decoder->next_buf = decoder->buf + (ret - old_len); in intel_pt_get_split_packet()
518 decoder->next_len = decoder->len - (ret - old_len); in intel_pt_get_split_packet()
520 decoder->buf = buf; in intel_pt_get_split_packet()
521 decoder->len = ret; in intel_pt_get_split_packet()
527 struct intel_pt_decoder *decoder; member
538 static int intel_pt_pkt_lookahead(struct intel_pt_decoder *decoder, in intel_pt_pkt_lookahead() argument
542 const unsigned char *buf = decoder->buf; in intel_pt_pkt_lookahead()
543 size_t len = decoder->len; in intel_pt_pkt_lookahead()
546 pkt_info.decoder = decoder; in intel_pt_pkt_lookahead()
547 pkt_info.pos = decoder->pos; in intel_pt_pkt_lookahead()
548 pkt_info.pkt_len = decoder->pkt_step; in intel_pt_pkt_lookahead()
549 pkt_info.last_packet_type = decoder->last_packet_type; in intel_pt_pkt_lookahead()
593 struct intel_pt_decoder *decoder = pkt_info->decoder; in intel_pt_calc_cyc_cb() local
624 data->ctc_delta += mtc_delta << decoder->mtc_shift; in intel_pt_calc_cyc_cb()
627 if (decoder->tsc_ctc_mult) { in intel_pt_calc_cyc_cb()
629 data->ctc_delta * decoder->tsc_ctc_mult; in intel_pt_calc_cyc_cb()
633 decoder->tsc_ctc_ratio_n, in intel_pt_calc_cyc_cb()
634 decoder->tsc_ctc_ratio_d); in intel_pt_calc_cyc_cb()
651 data->timestamp - timestamp < decoder->tsc_slip) in intel_pt_calc_cyc_cb()
668 if (!decoder->tsc_ctc_ratio_d) in intel_pt_calc_cyc_cb()
673 ctc_rem = ctc & decoder->ctc_rem_mask; in intel_pt_calc_cyc_cb()
675 data->last_mtc = (ctc >> decoder->mtc_shift) & 0xff; in intel_pt_calc_cyc_cb()
678 if (decoder->tsc_ctc_mult) { in intel_pt_calc_cyc_cb()
679 data->ctc_timestamp -= ctc_rem * decoder->tsc_ctc_mult; in intel_pt_calc_cyc_cb()
682 multdiv(ctc_rem, decoder->tsc_ctc_ratio_n, in intel_pt_calc_cyc_cb()
683 decoder->tsc_ctc_ratio_d); in intel_pt_calc_cyc_cb()
700 data->cbr_cyc_to_tsc = decoder->max_non_turbo_ratio_fp / cbr; in intel_pt_calc_cyc_cb()
711 if (!data->cbr && decoder->cbr) { in intel_pt_calc_cyc_cb()
712 data->cbr = decoder->cbr; in intel_pt_calc_cyc_cb()
713 data->cbr_cyc_to_tsc = decoder->cbr_cyc_to_tsc; in intel_pt_calc_cyc_cb()
719 cyc_to_tsc = (double)(timestamp - decoder->timestamp) / data->cycle_cnt; in intel_pt_calc_cyc_cb()
728 decoder->calc_cyc_to_tsc = cyc_to_tsc; in intel_pt_calc_cyc_cb()
729 decoder->have_calc_cyc_to_tsc = true; in intel_pt_calc_cyc_cb()
742 static void intel_pt_calc_cyc_to_tsc(struct intel_pt_decoder *decoder, in intel_pt_calc_cyc_to_tsc() argument
748 .last_mtc = decoder->last_mtc, in intel_pt_calc_cyc_to_tsc()
749 .ctc_timestamp = decoder->ctc_timestamp, in intel_pt_calc_cyc_to_tsc()
750 .ctc_delta = decoder->ctc_delta, in intel_pt_calc_cyc_to_tsc()
751 .tsc_timestamp = decoder->tsc_timestamp, in intel_pt_calc_cyc_to_tsc()
752 .timestamp = decoder->timestamp, in intel_pt_calc_cyc_to_tsc()
753 .have_tma = decoder->have_tma, in intel_pt_calc_cyc_to_tsc()
758 intel_pt_pkt_lookahead(decoder, intel_pt_calc_cyc_cb, &data); in intel_pt_calc_cyc_to_tsc()
761 static int intel_pt_get_next_packet(struct intel_pt_decoder *decoder) in intel_pt_get_next_packet() argument
765 decoder->last_packet_type = decoder->packet.type; in intel_pt_get_next_packet()
768 decoder->pos += decoder->pkt_step; in intel_pt_get_next_packet()
769 decoder->buf += decoder->pkt_step; in intel_pt_get_next_packet()
770 decoder->len -= decoder->pkt_step; in intel_pt_get_next_packet()
772 if (!decoder->len) { in intel_pt_get_next_packet()
773 ret = intel_pt_get_next_data(decoder); in intel_pt_get_next_packet()
778 ret = intel_pt_get_packet(decoder->buf, decoder->len, in intel_pt_get_next_packet()
779 &decoder->packet); in intel_pt_get_next_packet()
781 decoder->len < INTEL_PT_PKT_MAX_SZ && !decoder->next_buf) { in intel_pt_get_next_packet()
782 ret = intel_pt_get_split_packet(decoder); in intel_pt_get_next_packet()
787 return intel_pt_bad_packet(decoder); in intel_pt_get_next_packet()
789 decoder->pkt_len = ret; in intel_pt_get_next_packet()
790 decoder->pkt_step = ret; in intel_pt_get_next_packet()
791 intel_pt_decoder_log_packet(decoder); in intel_pt_get_next_packet()
792 } while (decoder->packet.type == INTEL_PT_PAD); in intel_pt_get_next_packet()
797 static uint64_t intel_pt_next_period(struct intel_pt_decoder *decoder) in intel_pt_next_period() argument
801 timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; in intel_pt_next_period()
802 masked_timestamp = timestamp & decoder->period_mask; in intel_pt_next_period()
803 if (decoder->continuous_period) { in intel_pt_next_period()
804 if (masked_timestamp != decoder->last_masked_timestamp) in intel_pt_next_period()
808 masked_timestamp = timestamp & decoder->period_mask; in intel_pt_next_period()
809 if (masked_timestamp != decoder->last_masked_timestamp) { in intel_pt_next_period()
810 decoder->last_masked_timestamp = masked_timestamp; in intel_pt_next_period()
811 decoder->continuous_period = true; in intel_pt_next_period()
814 return decoder->period_ticks - (timestamp - masked_timestamp); in intel_pt_next_period()
817 static uint64_t intel_pt_next_sample(struct intel_pt_decoder *decoder) in intel_pt_next_sample() argument
819 switch (decoder->period_type) { in intel_pt_next_sample()
821 return decoder->period - decoder->period_insn_cnt; in intel_pt_next_sample()
823 return intel_pt_next_period(decoder); in intel_pt_next_sample()
831 static void intel_pt_sample_insn(struct intel_pt_decoder *decoder) in intel_pt_sample_insn() argument
835 switch (decoder->period_type) { in intel_pt_sample_insn()
837 decoder->period_insn_cnt = 0; in intel_pt_sample_insn()
840 timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; in intel_pt_sample_insn()
841 masked_timestamp = timestamp & decoder->period_mask; in intel_pt_sample_insn()
842 decoder->last_masked_timestamp = masked_timestamp; in intel_pt_sample_insn()
850 decoder->state.type |= INTEL_PT_INSTRUCTION; in intel_pt_sample_insn()
853 static int intel_pt_walk_insn(struct intel_pt_decoder *decoder, in intel_pt_walk_insn() argument
859 if (!decoder->mtc_insn) in intel_pt_walk_insn()
860 decoder->mtc_insn = true; in intel_pt_walk_insn()
862 max_insn_cnt = intel_pt_next_sample(decoder); in intel_pt_walk_insn()
864 err = decoder->walk_insn(intel_pt_insn, &insn_cnt, &decoder->ip, ip, in intel_pt_walk_insn()
865 max_insn_cnt, decoder->data); in intel_pt_walk_insn()
867 decoder->tot_insn_cnt += insn_cnt; in intel_pt_walk_insn()
868 decoder->timestamp_insn_cnt += insn_cnt; in intel_pt_walk_insn()
869 decoder->period_insn_cnt += insn_cnt; in intel_pt_walk_insn()
872 decoder->no_progress = 0; in intel_pt_walk_insn()
873 decoder->pkt_state = INTEL_PT_STATE_ERR2; in intel_pt_walk_insn()
875 decoder->ip); in intel_pt_walk_insn()
881 if (ip && decoder->ip == ip) { in intel_pt_walk_insn()
887 intel_pt_sample_insn(decoder); in intel_pt_walk_insn()
890 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_walk_insn()
891 decoder->state.from_ip = decoder->ip; in intel_pt_walk_insn()
892 decoder->state.to_ip = 0; in intel_pt_walk_insn()
893 decoder->ip += intel_pt_insn->length; in intel_pt_walk_insn()
902 err = intel_pt_push(&decoder->stack, decoder->ip + in intel_pt_walk_insn()
908 decoder->ret_addr = intel_pt_pop(&decoder->stack); in intel_pt_walk_insn()
912 int cnt = decoder->no_progress++; in intel_pt_walk_insn()
914 decoder->state.from_ip = decoder->ip; in intel_pt_walk_insn()
915 decoder->ip += intel_pt_insn->length + in intel_pt_walk_insn()
917 decoder->state.to_ip = decoder->ip; in intel_pt_walk_insn()
929 decoder->stuck_ip = decoder->state.to_ip; in intel_pt_walk_insn()
930 decoder->stuck_ip_prd = 1; in intel_pt_walk_insn()
931 decoder->stuck_ip_cnt = 1; in intel_pt_walk_insn()
933 decoder->state.to_ip == decoder->stuck_ip) { in intel_pt_walk_insn()
935 decoder->state.to_ip); in intel_pt_walk_insn()
936 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_insn()
939 } else if (!--decoder->stuck_ip_cnt) { in intel_pt_walk_insn()
940 decoder->stuck_ip_prd += 1; in intel_pt_walk_insn()
941 decoder->stuck_ip_cnt = decoder->stuck_ip_prd; in intel_pt_walk_insn()
942 decoder->stuck_ip = decoder->state.to_ip; in intel_pt_walk_insn()
948 decoder->no_progress = 0; in intel_pt_walk_insn()
950 decoder->state.insn_op = intel_pt_insn->op; in intel_pt_walk_insn()
951 decoder->state.insn_len = intel_pt_insn->length; in intel_pt_walk_insn()
953 if (decoder->tx_flags & INTEL_PT_IN_TX) in intel_pt_walk_insn()
954 decoder->state.flags |= INTEL_PT_IN_TX; in intel_pt_walk_insn()
959 static int intel_pt_walk_fup(struct intel_pt_decoder *decoder) in intel_pt_walk_fup() argument
965 ip = decoder->last_ip; in intel_pt_walk_fup()
968 err = intel_pt_walk_insn(decoder, &intel_pt_insn, ip); in intel_pt_walk_fup()
972 if (decoder->set_fup_tx_flags) { in intel_pt_walk_fup()
973 decoder->set_fup_tx_flags = false; in intel_pt_walk_fup()
974 decoder->tx_flags = decoder->fup_tx_flags; in intel_pt_walk_fup()
975 decoder->state.type = INTEL_PT_TRANSACTION; in intel_pt_walk_fup()
976 decoder->state.from_ip = decoder->ip; in intel_pt_walk_fup()
977 decoder->state.to_ip = 0; in intel_pt_walk_fup()
978 decoder->state.flags = decoder->fup_tx_flags; in intel_pt_walk_fup()
983 decoder->set_fup_tx_flags = false; in intel_pt_walk_fup()
989 decoder->ip); in intel_pt_walk_fup()
990 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_fup()
996 decoder->ip); in intel_pt_walk_fup()
997 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_fup()
1001 intel_pt_bug(decoder); in intel_pt_walk_fup()
1005 static int intel_pt_walk_tip(struct intel_pt_decoder *decoder) in intel_pt_walk_tip() argument
1010 err = intel_pt_walk_insn(decoder, &intel_pt_insn, 0); in intel_pt_walk_tip()
1017 if (decoder->pkt_state == INTEL_PT_STATE_TIP_PGD) { in intel_pt_walk_tip()
1018 decoder->pge = false; in intel_pt_walk_tip()
1019 decoder->continuous_period = false; in intel_pt_walk_tip()
1020 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tip()
1021 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tip()
1022 decoder->state.to_ip = 0; in intel_pt_walk_tip()
1023 if (decoder->packet.count != 0) in intel_pt_walk_tip()
1024 decoder->ip = decoder->last_ip; in intel_pt_walk_tip()
1026 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tip()
1027 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tip()
1028 if (decoder->packet.count == 0) { in intel_pt_walk_tip()
1029 decoder->state.to_ip = 0; in intel_pt_walk_tip()
1031 decoder->state.to_ip = decoder->last_ip; in intel_pt_walk_tip()
1032 decoder->ip = decoder->last_ip; in intel_pt_walk_tip()
1040 decoder->ip); in intel_pt_walk_tip()
1041 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_tip()
1045 return intel_pt_bug(decoder); in intel_pt_walk_tip()
1048 static int intel_pt_walk_tnt(struct intel_pt_decoder *decoder) in intel_pt_walk_tnt() argument
1054 err = intel_pt_walk_insn(decoder, &intel_pt_insn, 0); in intel_pt_walk_tnt()
1061 if (!decoder->return_compression) { in intel_pt_walk_tnt()
1063 decoder->ip); in intel_pt_walk_tnt()
1064 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1067 if (!decoder->ret_addr) { in intel_pt_walk_tnt()
1069 decoder->ip); in intel_pt_walk_tnt()
1070 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1073 if (!(decoder->tnt.payload & BIT63)) { in intel_pt_walk_tnt()
1075 decoder->ip); in intel_pt_walk_tnt()
1076 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1079 decoder->tnt.count -= 1; in intel_pt_walk_tnt()
1080 if (!decoder->tnt.count) in intel_pt_walk_tnt()
1081 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tnt()
1082 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1083 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1084 decoder->ip = decoder->ret_addr; in intel_pt_walk_tnt()
1085 decoder->state.to_ip = decoder->ip; in intel_pt_walk_tnt()
1091 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_tnt()
1094 if (decoder->packet.type != INTEL_PT_TIP || in intel_pt_walk_tnt()
1095 decoder->packet.count == 0) { in intel_pt_walk_tnt()
1097 decoder->ip); in intel_pt_walk_tnt()
1098 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1099 decoder->pkt_step = 0; in intel_pt_walk_tnt()
1102 intel_pt_set_last_ip(decoder); in intel_pt_walk_tnt()
1103 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1104 decoder->state.to_ip = decoder->last_ip; in intel_pt_walk_tnt()
1105 decoder->ip = decoder->last_ip; in intel_pt_walk_tnt()
1110 decoder->tnt.count -= 1; in intel_pt_walk_tnt()
1111 if (!decoder->tnt.count) in intel_pt_walk_tnt()
1112 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tnt()
1113 if (decoder->tnt.payload & BIT63) { in intel_pt_walk_tnt()
1114 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1115 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1116 decoder->ip += intel_pt_insn.length + in intel_pt_walk_tnt()
1118 decoder->state.to_ip = decoder->ip; in intel_pt_walk_tnt()
1122 if (decoder->state.type & INTEL_PT_INSTRUCTION) { in intel_pt_walk_tnt()
1123 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1124 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_walk_tnt()
1125 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1126 decoder->state.to_ip = 0; in intel_pt_walk_tnt()
1127 decoder->ip += intel_pt_insn.length; in intel_pt_walk_tnt()
1130 decoder->ip += intel_pt_insn.length; in intel_pt_walk_tnt()
1131 if (!decoder->tnt.count) in intel_pt_walk_tnt()
1133 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1137 return intel_pt_bug(decoder); in intel_pt_walk_tnt()
1141 static int intel_pt_mode_tsx(struct intel_pt_decoder *decoder, bool *no_tip) in intel_pt_mode_tsx() argument
1146 fup_tx_flags = decoder->packet.payload & in intel_pt_mode_tsx()
1148 err = intel_pt_get_next_packet(decoder); in intel_pt_mode_tsx()
1151 if (decoder->packet.type == INTEL_PT_FUP) { in intel_pt_mode_tsx()
1152 decoder->fup_tx_flags = fup_tx_flags; in intel_pt_mode_tsx()
1153 decoder->set_fup_tx_flags = true; in intel_pt_mode_tsx()
1154 if (!(decoder->fup_tx_flags & INTEL_PT_ABORT_TX)) in intel_pt_mode_tsx()
1158 decoder->pos); in intel_pt_mode_tsx()
1159 intel_pt_update_in_tx(decoder); in intel_pt_mode_tsx()
1164 static void intel_pt_calc_tsc_timestamp(struct intel_pt_decoder *decoder) in intel_pt_calc_tsc_timestamp() argument
1168 decoder->have_tma = false; in intel_pt_calc_tsc_timestamp()
1170 if (decoder->ref_timestamp) { in intel_pt_calc_tsc_timestamp()
1171 timestamp = decoder->packet.payload | in intel_pt_calc_tsc_timestamp()
1172 (decoder->ref_timestamp & (0xffULL << 56)); in intel_pt_calc_tsc_timestamp()
1173 if (timestamp < decoder->ref_timestamp) { in intel_pt_calc_tsc_timestamp()
1174 if (decoder->ref_timestamp - timestamp > (1ULL << 55)) in intel_pt_calc_tsc_timestamp()
1177 if (timestamp - decoder->ref_timestamp > (1ULL << 55)) in intel_pt_calc_tsc_timestamp()
1180 decoder->tsc_timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1181 decoder->timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1182 decoder->ref_timestamp = 0; in intel_pt_calc_tsc_timestamp()
1183 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_tsc_timestamp()
1184 } else if (decoder->timestamp) { in intel_pt_calc_tsc_timestamp()
1185 timestamp = decoder->packet.payload | in intel_pt_calc_tsc_timestamp()
1186 (decoder->timestamp & (0xffULL << 56)); in intel_pt_calc_tsc_timestamp()
1187 decoder->tsc_timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1188 if (timestamp < decoder->timestamp && in intel_pt_calc_tsc_timestamp()
1189 decoder->timestamp - timestamp < decoder->tsc_slip) { in intel_pt_calc_tsc_timestamp()
1192 timestamp = decoder->timestamp; in intel_pt_calc_tsc_timestamp()
1194 if (timestamp < decoder->timestamp) { in intel_pt_calc_tsc_timestamp()
1197 decoder->tsc_timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1199 decoder->timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1200 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_tsc_timestamp()
1203 if (decoder->last_packet_type == INTEL_PT_CYC) { in intel_pt_calc_tsc_timestamp()
1204 decoder->cyc_ref_timestamp = decoder->timestamp; in intel_pt_calc_tsc_timestamp()
1205 decoder->cycle_cnt = 0; in intel_pt_calc_tsc_timestamp()
1206 decoder->have_calc_cyc_to_tsc = false; in intel_pt_calc_tsc_timestamp()
1207 intel_pt_calc_cyc_to_tsc(decoder, false); in intel_pt_calc_tsc_timestamp()
1210 intel_pt_log_to("Setting timestamp", decoder->timestamp); in intel_pt_calc_tsc_timestamp()
1213 static int intel_pt_overflow(struct intel_pt_decoder *decoder) in intel_pt_overflow() argument
1216 intel_pt_clear_tx_flags(decoder); in intel_pt_overflow()
1217 decoder->have_tma = false; in intel_pt_overflow()
1218 decoder->cbr = 0; in intel_pt_overflow()
1219 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_overflow()
1220 decoder->overflow = true; in intel_pt_overflow()
1224 static void intel_pt_calc_tma(struct intel_pt_decoder *decoder) in intel_pt_calc_tma() argument
1226 uint32_t ctc = decoder->packet.payload; in intel_pt_calc_tma()
1227 uint32_t fc = decoder->packet.count; in intel_pt_calc_tma()
1228 uint32_t ctc_rem = ctc & decoder->ctc_rem_mask; in intel_pt_calc_tma()
1230 if (!decoder->tsc_ctc_ratio_d) in intel_pt_calc_tma()
1233 decoder->last_mtc = (ctc >> decoder->mtc_shift) & 0xff; in intel_pt_calc_tma()
1234 decoder->ctc_timestamp = decoder->tsc_timestamp - fc; in intel_pt_calc_tma()
1235 if (decoder->tsc_ctc_mult) { in intel_pt_calc_tma()
1236 decoder->ctc_timestamp -= ctc_rem * decoder->tsc_ctc_mult; in intel_pt_calc_tma()
1238 decoder->ctc_timestamp -= multdiv(ctc_rem, in intel_pt_calc_tma()
1239 decoder->tsc_ctc_ratio_n, in intel_pt_calc_tma()
1240 decoder->tsc_ctc_ratio_d); in intel_pt_calc_tma()
1242 decoder->ctc_delta = 0; in intel_pt_calc_tma()
1243 decoder->have_tma = true; in intel_pt_calc_tma()
1245 decoder->ctc_timestamp, decoder->last_mtc, ctc_rem); in intel_pt_calc_tma()
1248 static void intel_pt_calc_mtc_timestamp(struct intel_pt_decoder *decoder) in intel_pt_calc_mtc_timestamp() argument
1253 if (!decoder->have_tma) in intel_pt_calc_mtc_timestamp()
1256 mtc = decoder->packet.payload; in intel_pt_calc_mtc_timestamp()
1258 if (mtc > decoder->last_mtc) in intel_pt_calc_mtc_timestamp()
1259 mtc_delta = mtc - decoder->last_mtc; in intel_pt_calc_mtc_timestamp()
1261 mtc_delta = mtc + 256 - decoder->last_mtc; in intel_pt_calc_mtc_timestamp()
1263 decoder->ctc_delta += mtc_delta << decoder->mtc_shift; in intel_pt_calc_mtc_timestamp()
1265 if (decoder->tsc_ctc_mult) { in intel_pt_calc_mtc_timestamp()
1266 timestamp = decoder->ctc_timestamp + in intel_pt_calc_mtc_timestamp()
1267 decoder->ctc_delta * decoder->tsc_ctc_mult; in intel_pt_calc_mtc_timestamp()
1269 timestamp = decoder->ctc_timestamp + in intel_pt_calc_mtc_timestamp()
1270 multdiv(decoder->ctc_delta, in intel_pt_calc_mtc_timestamp()
1271 decoder->tsc_ctc_ratio_n, in intel_pt_calc_mtc_timestamp()
1272 decoder->tsc_ctc_ratio_d); in intel_pt_calc_mtc_timestamp()
1275 if (timestamp < decoder->timestamp) in intel_pt_calc_mtc_timestamp()
1277 timestamp, decoder->timestamp); in intel_pt_calc_mtc_timestamp()
1279 decoder->timestamp = timestamp; in intel_pt_calc_mtc_timestamp()
1281 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_mtc_timestamp()
1282 decoder->last_mtc = mtc; in intel_pt_calc_mtc_timestamp()
1284 if (decoder->last_packet_type == INTEL_PT_CYC) { in intel_pt_calc_mtc_timestamp()
1285 decoder->cyc_ref_timestamp = decoder->timestamp; in intel_pt_calc_mtc_timestamp()
1286 decoder->cycle_cnt = 0; in intel_pt_calc_mtc_timestamp()
1287 decoder->have_calc_cyc_to_tsc = false; in intel_pt_calc_mtc_timestamp()
1288 intel_pt_calc_cyc_to_tsc(decoder, true); in intel_pt_calc_mtc_timestamp()
1292 static void intel_pt_calc_cbr(struct intel_pt_decoder *decoder) in intel_pt_calc_cbr() argument
1294 unsigned int cbr = decoder->packet.payload; in intel_pt_calc_cbr()
1296 if (decoder->cbr == cbr) in intel_pt_calc_cbr()
1299 decoder->cbr = cbr; in intel_pt_calc_cbr()
1300 decoder->cbr_cyc_to_tsc = decoder->max_non_turbo_ratio_fp / cbr; in intel_pt_calc_cbr()
1303 static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) in intel_pt_calc_cyc_timestamp() argument
1305 uint64_t timestamp = decoder->cyc_ref_timestamp; in intel_pt_calc_cyc_timestamp()
1307 decoder->have_cyc = true; in intel_pt_calc_cyc_timestamp()
1309 decoder->cycle_cnt += decoder->packet.payload; in intel_pt_calc_cyc_timestamp()
1311 if (!decoder->cyc_ref_timestamp) in intel_pt_calc_cyc_timestamp()
1314 if (decoder->have_calc_cyc_to_tsc) in intel_pt_calc_cyc_timestamp()
1315 timestamp += decoder->cycle_cnt * decoder->calc_cyc_to_tsc; in intel_pt_calc_cyc_timestamp()
1316 else if (decoder->cbr) in intel_pt_calc_cyc_timestamp()
1317 timestamp += decoder->cycle_cnt * decoder->cbr_cyc_to_tsc; in intel_pt_calc_cyc_timestamp()
1321 if (timestamp < decoder->timestamp) in intel_pt_calc_cyc_timestamp()
1323 timestamp, decoder->timestamp); in intel_pt_calc_cyc_timestamp()
1325 decoder->timestamp = timestamp; in intel_pt_calc_cyc_timestamp()
1329 static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder) in intel_pt_walk_psbend() argument
1334 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_psbend()
1338 switch (decoder->packet.type) { in intel_pt_walk_psbend()
1349 decoder->have_tma = false; in intel_pt_walk_psbend()
1354 return intel_pt_overflow(decoder); in intel_pt_walk_psbend()
1357 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_psbend()
1361 intel_pt_calc_tma(decoder); in intel_pt_walk_psbend()
1365 intel_pt_calc_cbr(decoder); in intel_pt_walk_psbend()
1369 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_psbend()
1373 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_psbend()
1377 decoder->pge = true; in intel_pt_walk_psbend()
1378 intel_pt_set_last_ip(decoder); in intel_pt_walk_psbend()
1382 intel_pt_update_in_tx(decoder); in intel_pt_walk_psbend()
1386 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_psbend()
1387 if (decoder->period_type == INTEL_PT_PERIOD_MTC) in intel_pt_walk_psbend()
1388 decoder->state.type |= INTEL_PT_INSTRUCTION; in intel_pt_walk_psbend()
1401 static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder) in intel_pt_walk_fup_tip() argument
1405 if (decoder->tx_flags & INTEL_PT_ABORT_TX) { in intel_pt_walk_fup_tip()
1406 decoder->tx_flags = 0; in intel_pt_walk_fup_tip()
1407 decoder->state.flags &= ~INTEL_PT_IN_TX; in intel_pt_walk_fup_tip()
1408 decoder->state.flags |= INTEL_PT_ABORT_TX; in intel_pt_walk_fup_tip()
1410 decoder->state.flags |= INTEL_PT_ASYNC; in intel_pt_walk_fup_tip()
1414 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_fup_tip()
1418 switch (decoder->packet.type) { in intel_pt_walk_fup_tip()
1430 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_fup_tip()
1434 return intel_pt_overflow(decoder); in intel_pt_walk_fup_tip()
1437 decoder->state.from_ip = decoder->ip; in intel_pt_walk_fup_tip()
1438 decoder->state.to_ip = 0; in intel_pt_walk_fup_tip()
1439 if (decoder->packet.count != 0) { in intel_pt_walk_fup_tip()
1440 intel_pt_set_ip(decoder); in intel_pt_walk_fup_tip()
1442 decoder->ip); in intel_pt_walk_fup_tip()
1444 decoder->pge = false; in intel_pt_walk_fup_tip()
1445 decoder->continuous_period = false; in intel_pt_walk_fup_tip()
1449 decoder->pge = true; in intel_pt_walk_fup_tip()
1451 decoder->ip); in intel_pt_walk_fup_tip()
1452 decoder->state.from_ip = 0; in intel_pt_walk_fup_tip()
1453 if (decoder->packet.count == 0) { in intel_pt_walk_fup_tip()
1454 decoder->state.to_ip = 0; in intel_pt_walk_fup_tip()
1456 intel_pt_set_ip(decoder); in intel_pt_walk_fup_tip()
1457 decoder->state.to_ip = decoder->ip; in intel_pt_walk_fup_tip()
1462 decoder->state.from_ip = decoder->ip; in intel_pt_walk_fup_tip()
1463 if (decoder->packet.count == 0) { in intel_pt_walk_fup_tip()
1464 decoder->state.to_ip = 0; in intel_pt_walk_fup_tip()
1466 intel_pt_set_ip(decoder); in intel_pt_walk_fup_tip()
1467 decoder->state.to_ip = decoder->ip; in intel_pt_walk_fup_tip()
1472 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_fup_tip()
1476 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_fup_tip()
1477 if (decoder->period_type == INTEL_PT_PERIOD_MTC) in intel_pt_walk_fup_tip()
1478 decoder->state.type |= INTEL_PT_INSTRUCTION; in intel_pt_walk_fup_tip()
1482 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_fup_tip()
1486 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_fup_tip()
1495 return intel_pt_bug(decoder); in intel_pt_walk_fup_tip()
1500 static int intel_pt_walk_trace(struct intel_pt_decoder *decoder) in intel_pt_walk_trace() argument
1506 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_trace()
1510 switch (decoder->packet.type) { in intel_pt_walk_trace()
1512 if (!decoder->packet.count) in intel_pt_walk_trace()
1514 decoder->tnt = decoder->packet; in intel_pt_walk_trace()
1515 decoder->pkt_state = INTEL_PT_STATE_TNT; in intel_pt_walk_trace()
1516 err = intel_pt_walk_tnt(decoder); in intel_pt_walk_trace()
1522 if (decoder->packet.count != 0) in intel_pt_walk_trace()
1523 intel_pt_set_last_ip(decoder); in intel_pt_walk_trace()
1524 decoder->pkt_state = INTEL_PT_STATE_TIP_PGD; in intel_pt_walk_trace()
1525 return intel_pt_walk_tip(decoder); in intel_pt_walk_trace()
1528 decoder->pge = true; in intel_pt_walk_trace()
1529 if (decoder->packet.count == 0) { in intel_pt_walk_trace()
1531 decoder->pos); in intel_pt_walk_trace()
1534 intel_pt_set_ip(decoder); in intel_pt_walk_trace()
1535 decoder->state.from_ip = 0; in intel_pt_walk_trace()
1536 decoder->state.to_ip = decoder->ip; in intel_pt_walk_trace()
1541 return intel_pt_overflow(decoder); in intel_pt_walk_trace()
1544 if (decoder->packet.count != 0) in intel_pt_walk_trace()
1545 intel_pt_set_last_ip(decoder); in intel_pt_walk_trace()
1546 decoder->pkt_state = INTEL_PT_STATE_TIP; in intel_pt_walk_trace()
1547 return intel_pt_walk_tip(decoder); in intel_pt_walk_trace()
1550 if (decoder->packet.count == 0) { in intel_pt_walk_trace()
1552 decoder->pos); in intel_pt_walk_trace()
1556 intel_pt_set_last_ip(decoder); in intel_pt_walk_trace()
1557 err = intel_pt_walk_fup(decoder); in intel_pt_walk_trace()
1562 decoder->pkt_state = in intel_pt_walk_trace()
1565 decoder->pkt_state = INTEL_PT_STATE_FUP; in intel_pt_walk_trace()
1572 return intel_pt_walk_fup_tip(decoder); in intel_pt_walk_trace()
1575 decoder->pge = false; in intel_pt_walk_trace()
1576 decoder->continuous_period = false; in intel_pt_walk_trace()
1577 intel_pt_clear_tx_flags(decoder); in intel_pt_walk_trace()
1578 decoder->have_tma = false; in intel_pt_walk_trace()
1582 intel_pt_clear_stack(&decoder->stack); in intel_pt_walk_trace()
1583 err = intel_pt_walk_psbend(decoder); in intel_pt_walk_trace()
1591 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_trace()
1595 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_trace()
1596 if (decoder->period_type != INTEL_PT_PERIOD_MTC) in intel_pt_walk_trace()
1602 if (!decoder->mtc_insn) in intel_pt_walk_trace()
1604 decoder->mtc_insn = false; in intel_pt_walk_trace()
1606 if (!decoder->timestamp) in intel_pt_walk_trace()
1608 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_walk_trace()
1609 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
1610 decoder->state.to_ip = 0; in intel_pt_walk_trace()
1611 decoder->mtc_insn = false; in intel_pt_walk_trace()
1615 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_trace()
1619 intel_pt_calc_tma(decoder); in intel_pt_walk_trace()
1623 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_trace()
1627 intel_pt_calc_cbr(decoder); in intel_pt_walk_trace()
1631 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_trace()
1636 if (!decoder->pge) { in intel_pt_walk_trace()
1637 intel_pt_update_in_tx(decoder); in intel_pt_walk_trace()
1640 err = intel_pt_mode_tsx(decoder, &no_tip); in intel_pt_walk_trace()
1646 return intel_pt_bug(decoder); in intel_pt_walk_trace()
1655 return intel_pt_bug(decoder); in intel_pt_walk_trace()
1661 static int intel_pt_walk_psb(struct intel_pt_decoder *decoder) in intel_pt_walk_psb() argument
1666 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_psb()
1670 switch (decoder->packet.type) { in intel_pt_walk_psb()
1672 decoder->continuous_period = false; in intel_pt_walk_psb()
1679 decoder->pge = true; in intel_pt_walk_psb()
1680 if (decoder->last_ip || decoder->packet.count == 6 || in intel_pt_walk_psb()
1681 decoder->packet.count == 0) { in intel_pt_walk_psb()
1682 uint64_t current_ip = decoder->ip; in intel_pt_walk_psb()
1684 intel_pt_set_ip(decoder); in intel_pt_walk_psb()
1687 decoder->ip); in intel_pt_walk_psb()
1692 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_psb()
1696 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_psb()
1700 intel_pt_calc_tma(decoder); in intel_pt_walk_psb()
1704 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_psb()
1708 intel_pt_calc_cbr(decoder); in intel_pt_walk_psb()
1712 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_psb()
1716 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_psb()
1720 intel_pt_update_in_tx(decoder); in intel_pt_walk_psb()
1724 decoder->pge = false; in intel_pt_walk_psb()
1725 decoder->continuous_period = false; in intel_pt_walk_psb()
1726 intel_pt_clear_tx_flags(decoder); in intel_pt_walk_psb()
1728 decoder->have_tma = false; in intel_pt_walk_psb()
1730 if (decoder->ip) in intel_pt_walk_psb()
1731 decoder->pkt_state = INTEL_PT_STATE_ERR4; in intel_pt_walk_psb()
1733 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_psb()
1737 return intel_pt_bug(decoder); in intel_pt_walk_psb()
1740 return intel_pt_overflow(decoder); in intel_pt_walk_psb()
1755 static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) in intel_pt_walk_to_ip() argument
1760 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_to_ip()
1764 switch (decoder->packet.type) { in intel_pt_walk_to_ip()
1766 decoder->continuous_period = false; in intel_pt_walk_to_ip()
1769 decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD; in intel_pt_walk_to_ip()
1770 if (decoder->last_ip || decoder->packet.count == 6 || in intel_pt_walk_to_ip()
1771 decoder->packet.count == 0) in intel_pt_walk_to_ip()
1772 intel_pt_set_ip(decoder); in intel_pt_walk_to_ip()
1773 if (decoder->ip) in intel_pt_walk_to_ip()
1778 if (decoder->overflow) { in intel_pt_walk_to_ip()
1779 if (decoder->last_ip || in intel_pt_walk_to_ip()
1780 decoder->packet.count == 6 || in intel_pt_walk_to_ip()
1781 decoder->packet.count == 0) in intel_pt_walk_to_ip()
1782 intel_pt_set_ip(decoder); in intel_pt_walk_to_ip()
1783 if (decoder->ip) in intel_pt_walk_to_ip()
1786 if (decoder->packet.count) in intel_pt_walk_to_ip()
1787 intel_pt_set_last_ip(decoder); in intel_pt_walk_to_ip()
1791 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_to_ip()
1795 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_to_ip()
1799 intel_pt_calc_tma(decoder); in intel_pt_walk_to_ip()
1803 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_to_ip()
1807 intel_pt_calc_cbr(decoder); in intel_pt_walk_to_ip()
1811 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_to_ip()
1815 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_to_ip()
1819 intel_pt_update_in_tx(decoder); in intel_pt_walk_to_ip()
1823 return intel_pt_overflow(decoder); in intel_pt_walk_to_ip()
1826 return intel_pt_bug(decoder); in intel_pt_walk_to_ip()
1829 decoder->pge = false; in intel_pt_walk_to_ip()
1830 decoder->continuous_period = false; in intel_pt_walk_to_ip()
1831 intel_pt_clear_tx_flags(decoder); in intel_pt_walk_to_ip()
1832 decoder->have_tma = false; in intel_pt_walk_to_ip()
1836 err = intel_pt_walk_psb(decoder); in intel_pt_walk_to_ip()
1839 if (decoder->ip) { in intel_pt_walk_to_ip()
1841 decoder->state.type = 0; in intel_pt_walk_to_ip()
1857 static int intel_pt_sync_ip(struct intel_pt_decoder *decoder) in intel_pt_sync_ip() argument
1862 err = intel_pt_walk_to_ip(decoder); in intel_pt_sync_ip()
1866 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_sync_ip()
1867 decoder->overflow = false; in intel_pt_sync_ip()
1869 decoder->state.from_ip = 0; in intel_pt_sync_ip()
1870 decoder->state.to_ip = decoder->ip; in intel_pt_sync_ip()
1871 intel_pt_log_to("Setting IP", decoder->ip); in intel_pt_sync_ip()
1876 static int intel_pt_part_psb(struct intel_pt_decoder *decoder) in intel_pt_part_psb() argument
1878 const unsigned char *end = decoder->buf + decoder->len; in intel_pt_part_psb()
1882 if (i > decoder->len) in intel_pt_part_psb()
1890 static int intel_pt_rest_psb(struct intel_pt_decoder *decoder, int part_psb) in intel_pt_rest_psb() argument
1895 if (rest_psb > decoder->len || in intel_pt_rest_psb()
1896 memcmp(decoder->buf, psb + part_psb, rest_psb)) in intel_pt_rest_psb()
1902 static int intel_pt_get_split_psb(struct intel_pt_decoder *decoder, in intel_pt_get_split_psb() argument
1907 decoder->pos += decoder->len; in intel_pt_get_split_psb()
1908 decoder->len = 0; in intel_pt_get_split_psb()
1910 ret = intel_pt_get_next_data(decoder); in intel_pt_get_split_psb()
1914 rest_psb = intel_pt_rest_psb(decoder, part_psb); in intel_pt_get_split_psb()
1918 decoder->pos -= part_psb; in intel_pt_get_split_psb()
1919 decoder->next_buf = decoder->buf + rest_psb; in intel_pt_get_split_psb()
1920 decoder->next_len = decoder->len - rest_psb; in intel_pt_get_split_psb()
1921 memcpy(decoder->temp_buf, INTEL_PT_PSB_STR, INTEL_PT_PSB_LEN); in intel_pt_get_split_psb()
1922 decoder->buf = decoder->temp_buf; in intel_pt_get_split_psb()
1923 decoder->len = INTEL_PT_PSB_LEN; in intel_pt_get_split_psb()
1928 static int intel_pt_scan_for_psb(struct intel_pt_decoder *decoder) in intel_pt_scan_for_psb() argument
1935 if (!decoder->len) { in intel_pt_scan_for_psb()
1936 ret = intel_pt_get_next_data(decoder); in intel_pt_scan_for_psb()
1941 next = memmem(decoder->buf, decoder->len, INTEL_PT_PSB_STR, in intel_pt_scan_for_psb()
1946 part_psb = intel_pt_part_psb(decoder); in intel_pt_scan_for_psb()
1948 ret = intel_pt_get_split_psb(decoder, part_psb); in intel_pt_scan_for_psb()
1952 decoder->pos += decoder->len; in intel_pt_scan_for_psb()
1953 decoder->len = 0; in intel_pt_scan_for_psb()
1958 decoder->pkt_step = next - decoder->buf; in intel_pt_scan_for_psb()
1959 return intel_pt_get_next_packet(decoder); in intel_pt_scan_for_psb()
1963 static int intel_pt_sync(struct intel_pt_decoder *decoder) in intel_pt_sync() argument
1967 decoder->pge = false; in intel_pt_sync()
1968 decoder->continuous_period = false; in intel_pt_sync()
1969 decoder->last_ip = 0; in intel_pt_sync()
1970 decoder->ip = 0; in intel_pt_sync()
1971 intel_pt_clear_stack(&decoder->stack); in intel_pt_sync()
1973 err = intel_pt_scan_for_psb(decoder); in intel_pt_sync()
1977 decoder->pkt_state = INTEL_PT_STATE_NO_IP; in intel_pt_sync()
1979 err = intel_pt_walk_psb(decoder); in intel_pt_sync()
1983 if (decoder->ip) { in intel_pt_sync()
1984 decoder->state.type = 0; /* Do not have a sample */ in intel_pt_sync()
1985 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_sync()
1987 return intel_pt_sync_ip(decoder); in intel_pt_sync()
1993 static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder) in intel_pt_est_timestamp() argument
1995 uint64_t est = decoder->timestamp_insn_cnt << 1; in intel_pt_est_timestamp()
1997 if (!decoder->cbr || !decoder->max_non_turbo_ratio) in intel_pt_est_timestamp()
2000 est *= decoder->max_non_turbo_ratio; in intel_pt_est_timestamp()
2001 est /= decoder->cbr; in intel_pt_est_timestamp()
2003 return decoder->timestamp + est; in intel_pt_est_timestamp()
2006 const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder) in intel_pt_decode() argument
2011 decoder->state.type = INTEL_PT_BRANCH; in intel_pt_decode()
2012 decoder->state.flags = 0; in intel_pt_decode()
2014 switch (decoder->pkt_state) { in intel_pt_decode()
2016 err = intel_pt_sync(decoder); in intel_pt_decode()
2019 decoder->last_ip = 0; in intel_pt_decode()
2022 err = intel_pt_sync_ip(decoder); in intel_pt_decode()
2025 err = intel_pt_walk_trace(decoder); in intel_pt_decode()
2028 err = intel_pt_walk_tnt(decoder); in intel_pt_decode()
2030 err = intel_pt_walk_trace(decoder); in intel_pt_decode()
2034 err = intel_pt_walk_tip(decoder); in intel_pt_decode()
2037 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_decode()
2038 err = intel_pt_walk_fup(decoder); in intel_pt_decode()
2040 err = intel_pt_walk_fup_tip(decoder); in intel_pt_decode()
2042 decoder->pkt_state = INTEL_PT_STATE_FUP; in intel_pt_decode()
2045 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_decode()
2046 err = intel_pt_walk_fup(decoder); in intel_pt_decode()
2048 err = intel_pt_walk_trace(decoder); in intel_pt_decode()
2051 err = intel_pt_bug(decoder); in intel_pt_decode()
2056 decoder->state.err = err ? intel_pt_ext_err(err) : 0; in intel_pt_decode()
2057 decoder->state.timestamp = decoder->timestamp; in intel_pt_decode()
2058 decoder->state.est_timestamp = intel_pt_est_timestamp(decoder); in intel_pt_decode()
2059 decoder->state.cr3 = decoder->cr3; in intel_pt_decode()
2060 decoder->state.tot_insn_cnt = decoder->tot_insn_cnt; in intel_pt_decode()
2063 decoder->state.from_ip = decoder->ip; in intel_pt_decode()
2065 return &decoder->state; in intel_pt_decode()