• Home
  • Raw
  • Download

Lines Matching full:decoder

22 #include "intel-pt-insn-decoder.h"
23 #include "intel-pt-pkt-decoder.h"
24 #include "intel-pt-decoder.h"
95 #define INTEL_PT_STATE_ERR1 (decoder->pkt_state)
224 static void intel_pt_setup_period(struct intel_pt_decoder *decoder) in intel_pt_setup_period() argument
226 if (decoder->period_type == INTEL_PT_PERIOD_TICKS) { in intel_pt_setup_period()
229 period = intel_pt_lower_power_of_2(decoder->period); in intel_pt_setup_period()
230 decoder->period_mask = ~(period - 1); in intel_pt_setup_period()
231 decoder->period_ticks = period; in intel_pt_setup_period()
244 struct intel_pt_decoder *decoder; in intel_pt_decoder_new() local
249 decoder = zalloc(sizeof(struct intel_pt_decoder)); in intel_pt_decoder_new()
250 if (!decoder) in intel_pt_decoder_new()
253 decoder->get_trace = params->get_trace; in intel_pt_decoder_new()
254 decoder->walk_insn = params->walk_insn; in intel_pt_decoder_new()
255 decoder->pgd_ip = params->pgd_ip; in intel_pt_decoder_new()
256 decoder->lookahead = params->lookahead; in intel_pt_decoder_new()
257 decoder->data = params->data; in intel_pt_decoder_new()
258 decoder->return_compression = params->return_compression; in intel_pt_decoder_new()
259 decoder->branch_enable = params->branch_enable; in intel_pt_decoder_new()
260 decoder->hop = params->quick >= 1; in intel_pt_decoder_new()
261 decoder->leap = params->quick >= 2; in intel_pt_decoder_new()
263 decoder->flags = params->flags; in intel_pt_decoder_new()
265 decoder->ctl = params->ctl; in intel_pt_decoder_new()
266 decoder->period = params->period; in intel_pt_decoder_new()
267 decoder->period_type = params->period_type; in intel_pt_decoder_new()
269 decoder->max_non_turbo_ratio = params->max_non_turbo_ratio; in intel_pt_decoder_new()
270 decoder->max_non_turbo_ratio_fp = params->max_non_turbo_ratio; in intel_pt_decoder_new()
272 decoder->cyc_threshold = intel_pt_cyc_threshold(decoder->ctl); in intel_pt_decoder_new()
274 intel_pt_setup_period(decoder); in intel_pt_decoder_new()
276 decoder->mtc_shift = params->mtc_period; in intel_pt_decoder_new()
277 decoder->ctc_rem_mask = (1 << decoder->mtc_shift) - 1; in intel_pt_decoder_new()
279 decoder->tsc_ctc_ratio_n = params->tsc_ctc_ratio_n; in intel_pt_decoder_new()
280 decoder->tsc_ctc_ratio_d = params->tsc_ctc_ratio_d; in intel_pt_decoder_new()
282 if (!decoder->tsc_ctc_ratio_n) in intel_pt_decoder_new()
283 decoder->tsc_ctc_ratio_d = 0; in intel_pt_decoder_new()
285 if (decoder->tsc_ctc_ratio_d) { in intel_pt_decoder_new()
286 if (!(decoder->tsc_ctc_ratio_n % decoder->tsc_ctc_ratio_d)) in intel_pt_decoder_new()
287 decoder->tsc_ctc_mult = decoder->tsc_ctc_ratio_n / in intel_pt_decoder_new()
288 decoder->tsc_ctc_ratio_d; in intel_pt_decoder_new()
297 decoder->tsc_slip = 0x10000; in intel_pt_decoder_new()
299 intel_pt_log("timestamp: mtc_shift %u\n", decoder->mtc_shift); in intel_pt_decoder_new()
300 intel_pt_log("timestamp: tsc_ctc_ratio_n %u\n", decoder->tsc_ctc_ratio_n); in intel_pt_decoder_new()
301 intel_pt_log("timestamp: tsc_ctc_ratio_d %u\n", decoder->tsc_ctc_ratio_d); in intel_pt_decoder_new()
302 intel_pt_log("timestamp: tsc_ctc_mult %u\n", decoder->tsc_ctc_mult); in intel_pt_decoder_new()
303 intel_pt_log("timestamp: tsc_slip %#x\n", decoder->tsc_slip); in intel_pt_decoder_new()
305 if (decoder->hop) in intel_pt_decoder_new()
308 return decoder; in intel_pt_decoder_new()
382 void intel_pt_decoder_free(struct intel_pt_decoder *decoder) in intel_pt_decoder_free() argument
384 intel_pt_free_stack(&decoder->stack); in intel_pt_decoder_free()
385 free(decoder); in intel_pt_decoder_free()
469 static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) in intel_pt_set_last_ip() argument
471 decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip); in intel_pt_set_last_ip()
472 decoder->have_last_ip = true; in intel_pt_set_last_ip()
475 static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) in intel_pt_set_ip() argument
477 intel_pt_set_last_ip(decoder); in intel_pt_set_ip()
478 decoder->ip = decoder->last_ip; in intel_pt_set_ip()
481 static void intel_pt_decoder_log_packet(struct intel_pt_decoder *decoder) in intel_pt_decoder_log_packet() argument
483 intel_pt_log_packet(&decoder->packet, decoder->pkt_len, decoder->pos, in intel_pt_decoder_log_packet()
484 decoder->buf); in intel_pt_decoder_log_packet()
487 static int intel_pt_bug(struct intel_pt_decoder *decoder) in intel_pt_bug() argument
490 decoder->pkt_state = INTEL_PT_STATE_NO_PSB; in intel_pt_bug()
494 static inline void intel_pt_clear_tx_flags(struct intel_pt_decoder *decoder) in intel_pt_clear_tx_flags() argument
496 decoder->tx_flags = 0; in intel_pt_clear_tx_flags()
499 static inline void intel_pt_update_in_tx(struct intel_pt_decoder *decoder) in intel_pt_update_in_tx() argument
501 decoder->tx_flags = decoder->packet.payload & INTEL_PT_IN_TX; in intel_pt_update_in_tx()
504 static int intel_pt_bad_packet(struct intel_pt_decoder *decoder) in intel_pt_bad_packet() argument
506 intel_pt_clear_tx_flags(decoder); in intel_pt_bad_packet()
507 decoder->have_tma = false; in intel_pt_bad_packet()
508 decoder->pkt_len = 1; in intel_pt_bad_packet()
509 decoder->pkt_step = 1; in intel_pt_bad_packet()
510 intel_pt_decoder_log_packet(decoder); in intel_pt_bad_packet()
511 if (decoder->pkt_state != INTEL_PT_STATE_NO_PSB) { in intel_pt_bad_packet()
513 decoder->pkt_state = INTEL_PT_STATE_ERR1; in intel_pt_bad_packet()
518 static inline void intel_pt_update_sample_time(struct intel_pt_decoder *decoder) in intel_pt_update_sample_time() argument
520 decoder->sample_timestamp = decoder->timestamp; in intel_pt_update_sample_time()
521 decoder->sample_insn_cnt = decoder->timestamp_insn_cnt; in intel_pt_update_sample_time()
524 static void intel_pt_reposition(struct intel_pt_decoder *decoder) in intel_pt_reposition() argument
526 decoder->ip = 0; in intel_pt_reposition()
527 decoder->pkt_state = INTEL_PT_STATE_NO_PSB; in intel_pt_reposition()
528 decoder->timestamp = 0; in intel_pt_reposition()
529 decoder->have_tma = false; in intel_pt_reposition()
532 static int intel_pt_get_data(struct intel_pt_decoder *decoder, bool reposition) in intel_pt_get_data() argument
537 decoder->pkt_step = 0; in intel_pt_get_data()
540 ret = decoder->get_trace(&buffer, decoder->data); in intel_pt_get_data()
543 decoder->buf = buffer.buf; in intel_pt_get_data()
544 decoder->len = buffer.len; in intel_pt_get_data()
545 if (!decoder->len) { in intel_pt_get_data()
549 decoder->buf_timestamp = buffer.ref_timestamp; in intel_pt_get_data()
551 intel_pt_reposition(decoder); in intel_pt_get_data()
552 decoder->ref_timestamp = buffer.ref_timestamp; in intel_pt_get_data()
553 decoder->state.trace_nr = buffer.trace_nr; in intel_pt_get_data()
555 decoder->ref_timestamp); in intel_pt_get_data()
562 static int intel_pt_get_next_data(struct intel_pt_decoder *decoder, in intel_pt_get_next_data() argument
565 if (!decoder->next_buf) in intel_pt_get_next_data()
566 return intel_pt_get_data(decoder, reposition); in intel_pt_get_next_data()
568 decoder->buf = decoder->next_buf; in intel_pt_get_next_data()
569 decoder->len = decoder->next_len; in intel_pt_get_next_data()
570 decoder->next_buf = 0; in intel_pt_get_next_data()
571 decoder->next_len = 0; in intel_pt_get_next_data()
575 static int intel_pt_get_split_packet(struct intel_pt_decoder *decoder) in intel_pt_get_split_packet() argument
577 unsigned char *buf = decoder->temp_buf; in intel_pt_get_split_packet()
581 old_len = decoder->len; in intel_pt_get_split_packet()
582 len = decoder->len; in intel_pt_get_split_packet()
583 memcpy(buf, decoder->buf, len); in intel_pt_get_split_packet()
585 ret = intel_pt_get_data(decoder, false); in intel_pt_get_split_packet()
587 decoder->pos += old_len; in intel_pt_get_split_packet()
592 if (n > decoder->len) in intel_pt_get_split_packet()
593 n = decoder->len; in intel_pt_get_split_packet()
594 memcpy(buf + len, decoder->buf, n); in intel_pt_get_split_packet()
597 decoder->prev_pkt_ctx = decoder->pkt_ctx; in intel_pt_get_split_packet()
598 ret = intel_pt_get_packet(buf, len, &decoder->packet, &decoder->pkt_ctx); in intel_pt_get_split_packet()
600 decoder->next_buf = decoder->buf; in intel_pt_get_split_packet()
601 decoder->next_len = decoder->len; in intel_pt_get_split_packet()
602 decoder->buf = buf; in intel_pt_get_split_packet()
603 decoder->len = old_len; in intel_pt_get_split_packet()
604 return intel_pt_bad_packet(decoder); in intel_pt_get_split_packet()
607 decoder->next_buf = decoder->buf + (ret - old_len); in intel_pt_get_split_packet()
608 decoder->next_len = decoder->len - (ret - old_len); in intel_pt_get_split_packet()
610 decoder->buf = buf; in intel_pt_get_split_packet()
611 decoder->len = ret; in intel_pt_get_split_packet()
617 struct intel_pt_decoder *decoder; member
628 static int intel_pt_pkt_lookahead(struct intel_pt_decoder *decoder, in intel_pt_pkt_lookahead() argument
632 const unsigned char *buf = decoder->buf; in intel_pt_pkt_lookahead()
633 enum intel_pt_pkt_ctx pkt_ctx = decoder->pkt_ctx; in intel_pt_pkt_lookahead()
634 size_t len = decoder->len; in intel_pt_pkt_lookahead()
637 pkt_info.decoder = decoder; in intel_pt_pkt_lookahead()
638 pkt_info.pos = decoder->pos; in intel_pt_pkt_lookahead()
639 pkt_info.pkt_len = decoder->pkt_step; in intel_pt_pkt_lookahead()
640 pkt_info.last_packet_type = decoder->last_packet_type; in intel_pt_pkt_lookahead()
706 struct intel_pt_decoder *decoder = pkt_info->decoder; in intel_pt_calc_cyc_cb() local
739 if (decoder->mtc_shift > 8 && data->fixup_last_mtc) { in intel_pt_calc_cyc_cb()
741 intel_pt_fixup_last_mtc(mtc, decoder->mtc_shift, in intel_pt_calc_cyc_cb()
748 data->ctc_delta += mtc_delta << decoder->mtc_shift; in intel_pt_calc_cyc_cb()
751 if (decoder->tsc_ctc_mult) { in intel_pt_calc_cyc_cb()
753 data->ctc_delta * decoder->tsc_ctc_mult; in intel_pt_calc_cyc_cb()
757 decoder->tsc_ctc_ratio_n, in intel_pt_calc_cyc_cb()
758 decoder->tsc_ctc_ratio_d); in intel_pt_calc_cyc_cb()
781 data->timestamp - timestamp < decoder->tsc_slip) in intel_pt_calc_cyc_cb()
798 if (!decoder->tsc_ctc_ratio_d) in intel_pt_calc_cyc_cb()
803 ctc_rem = ctc & decoder->ctc_rem_mask; in intel_pt_calc_cyc_cb()
805 data->last_mtc = (ctc >> decoder->mtc_shift) & 0xff; in intel_pt_calc_cyc_cb()
808 if (decoder->tsc_ctc_mult) { in intel_pt_calc_cyc_cb()
809 data->ctc_timestamp -= ctc_rem * decoder->tsc_ctc_mult; in intel_pt_calc_cyc_cb()
812 multdiv(ctc_rem, decoder->tsc_ctc_ratio_n, in intel_pt_calc_cyc_cb()
813 decoder->tsc_ctc_ratio_d); in intel_pt_calc_cyc_cb()
831 data->cbr_cyc_to_tsc = decoder->max_non_turbo_ratio_fp / cbr; in intel_pt_calc_cyc_cb()
847 if (!data->cbr && decoder->cbr) { in intel_pt_calc_cyc_cb()
848 data->cbr = decoder->cbr; in intel_pt_calc_cyc_cb()
849 data->cbr_cyc_to_tsc = decoder->cbr_cyc_to_tsc; in intel_pt_calc_cyc_cb()
855 cyc_to_tsc = (double)(timestamp - decoder->timestamp) / data->cycle_cnt; in intel_pt_calc_cyc_cb()
864 decoder->calc_cyc_to_tsc = cyc_to_tsc; in intel_pt_calc_cyc_cb()
865 decoder->have_calc_cyc_to_tsc = true; in intel_pt_calc_cyc_cb()
878 static void intel_pt_calc_cyc_to_tsc(struct intel_pt_decoder *decoder, in intel_pt_calc_cyc_to_tsc() argument
884 .last_mtc = decoder->last_mtc, in intel_pt_calc_cyc_to_tsc()
885 .ctc_timestamp = decoder->ctc_timestamp, in intel_pt_calc_cyc_to_tsc()
886 .ctc_delta = decoder->ctc_delta, in intel_pt_calc_cyc_to_tsc()
887 .tsc_timestamp = decoder->tsc_timestamp, in intel_pt_calc_cyc_to_tsc()
888 .timestamp = decoder->timestamp, in intel_pt_calc_cyc_to_tsc()
889 .have_tma = decoder->have_tma, in intel_pt_calc_cyc_to_tsc()
890 .fixup_last_mtc = decoder->fixup_last_mtc, in intel_pt_calc_cyc_to_tsc()
903 intel_pt_pkt_lookahead(decoder, intel_pt_calc_cyc_cb, &data); in intel_pt_calc_cyc_to_tsc()
906 static int intel_pt_get_next_packet(struct intel_pt_decoder *decoder) in intel_pt_get_next_packet() argument
910 decoder->last_packet_type = decoder->packet.type; in intel_pt_get_next_packet()
913 decoder->pos += decoder->pkt_step; in intel_pt_get_next_packet()
914 decoder->buf += decoder->pkt_step; in intel_pt_get_next_packet()
915 decoder->len -= decoder->pkt_step; in intel_pt_get_next_packet()
917 if (!decoder->len) { in intel_pt_get_next_packet()
918 ret = intel_pt_get_next_data(decoder, false); in intel_pt_get_next_packet()
923 decoder->prev_pkt_ctx = decoder->pkt_ctx; in intel_pt_get_next_packet()
924 ret = intel_pt_get_packet(decoder->buf, decoder->len, in intel_pt_get_next_packet()
925 &decoder->packet, &decoder->pkt_ctx); in intel_pt_get_next_packet()
927 decoder->len < INTEL_PT_PKT_MAX_SZ && !decoder->next_buf) { in intel_pt_get_next_packet()
928 ret = intel_pt_get_split_packet(decoder); in intel_pt_get_next_packet()
933 return intel_pt_bad_packet(decoder); in intel_pt_get_next_packet()
935 decoder->pkt_len = ret; in intel_pt_get_next_packet()
936 decoder->pkt_step = ret; in intel_pt_get_next_packet()
937 intel_pt_decoder_log_packet(decoder); in intel_pt_get_next_packet()
938 } while (decoder->packet.type == INTEL_PT_PAD); in intel_pt_get_next_packet()
943 static uint64_t intel_pt_next_period(struct intel_pt_decoder *decoder) in intel_pt_next_period() argument
947 timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; in intel_pt_next_period()
948 masked_timestamp = timestamp & decoder->period_mask; in intel_pt_next_period()
949 if (decoder->continuous_period) { in intel_pt_next_period()
950 if (masked_timestamp > decoder->last_masked_timestamp) in intel_pt_next_period()
954 masked_timestamp = timestamp & decoder->period_mask; in intel_pt_next_period()
955 if (masked_timestamp > decoder->last_masked_timestamp) { in intel_pt_next_period()
956 decoder->last_masked_timestamp = masked_timestamp; in intel_pt_next_period()
957 decoder->continuous_period = true; in intel_pt_next_period()
961 if (masked_timestamp < decoder->last_masked_timestamp) in intel_pt_next_period()
962 return decoder->period_ticks; in intel_pt_next_period()
964 return decoder->period_ticks - (timestamp - masked_timestamp); in intel_pt_next_period()
967 static uint64_t intel_pt_next_sample(struct intel_pt_decoder *decoder) in intel_pt_next_sample() argument
969 switch (decoder->period_type) { in intel_pt_next_sample()
971 return decoder->period - decoder->period_insn_cnt; in intel_pt_next_sample()
973 return intel_pt_next_period(decoder); in intel_pt_next_sample()
981 static void intel_pt_sample_insn(struct intel_pt_decoder *decoder) in intel_pt_sample_insn() argument
985 switch (decoder->period_type) { in intel_pt_sample_insn()
987 decoder->period_insn_cnt = 0; in intel_pt_sample_insn()
990 timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; in intel_pt_sample_insn()
991 masked_timestamp = timestamp & decoder->period_mask; in intel_pt_sample_insn()
992 if (masked_timestamp > decoder->last_masked_timestamp) in intel_pt_sample_insn()
993 decoder->last_masked_timestamp = masked_timestamp; in intel_pt_sample_insn()
995 decoder->last_masked_timestamp += decoder->period_ticks; in intel_pt_sample_insn()
1003 decoder->state.type |= INTEL_PT_INSTRUCTION; in intel_pt_sample_insn()
1006 static int intel_pt_walk_insn(struct intel_pt_decoder *decoder, in intel_pt_walk_insn() argument
1012 if (!decoder->mtc_insn) in intel_pt_walk_insn()
1013 decoder->mtc_insn = true; in intel_pt_walk_insn()
1015 max_insn_cnt = intel_pt_next_sample(decoder); in intel_pt_walk_insn()
1017 err = decoder->walk_insn(intel_pt_insn, &insn_cnt, &decoder->ip, ip, in intel_pt_walk_insn()
1018 max_insn_cnt, decoder->data); in intel_pt_walk_insn()
1020 decoder->tot_insn_cnt += insn_cnt; in intel_pt_walk_insn()
1021 decoder->timestamp_insn_cnt += insn_cnt; in intel_pt_walk_insn()
1022 decoder->sample_insn_cnt += insn_cnt; in intel_pt_walk_insn()
1023 decoder->period_insn_cnt += insn_cnt; in intel_pt_walk_insn()
1026 decoder->no_progress = 0; in intel_pt_walk_insn()
1027 decoder->pkt_state = INTEL_PT_STATE_ERR2; in intel_pt_walk_insn()
1029 decoder->ip); in intel_pt_walk_insn()
1035 if (ip && decoder->ip == ip) { in intel_pt_walk_insn()
1041 intel_pt_sample_insn(decoder); in intel_pt_walk_insn()
1044 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_walk_insn()
1045 decoder->state.from_ip = decoder->ip; in intel_pt_walk_insn()
1046 decoder->state.to_ip = 0; in intel_pt_walk_insn()
1047 decoder->ip += intel_pt_insn->length; in intel_pt_walk_insn()
1056 err = intel_pt_push(&decoder->stack, decoder->ip + in intel_pt_walk_insn()
1062 decoder->ret_addr = intel_pt_pop(&decoder->stack); in intel_pt_walk_insn()
1066 int cnt = decoder->no_progress++; in intel_pt_walk_insn()
1068 decoder->state.from_ip = decoder->ip; in intel_pt_walk_insn()
1069 decoder->ip += intel_pt_insn->length + in intel_pt_walk_insn()
1071 decoder->state.to_ip = decoder->ip; in intel_pt_walk_insn()
1076 * decoder error results in the decoder erroneously setting the in intel_pt_walk_insn()
1083 decoder->stuck_ip = decoder->state.to_ip; in intel_pt_walk_insn()
1084 decoder->stuck_ip_prd = 1; in intel_pt_walk_insn()
1085 decoder->stuck_ip_cnt = 1; in intel_pt_walk_insn()
1087 decoder->state.to_ip == decoder->stuck_ip) { in intel_pt_walk_insn()
1089 decoder->state.to_ip); in intel_pt_walk_insn()
1090 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_insn()
1093 } else if (!--decoder->stuck_ip_cnt) { in intel_pt_walk_insn()
1094 decoder->stuck_ip_prd += 1; in intel_pt_walk_insn()
1095 decoder->stuck_ip_cnt = decoder->stuck_ip_prd; in intel_pt_walk_insn()
1096 decoder->stuck_ip = decoder->state.to_ip; in intel_pt_walk_insn()
1102 decoder->no_progress = 0; in intel_pt_walk_insn()
1104 decoder->state.insn_op = intel_pt_insn->op; in intel_pt_walk_insn()
1105 decoder->state.insn_len = intel_pt_insn->length; in intel_pt_walk_insn()
1106 memcpy(decoder->state.insn, intel_pt_insn->buf, in intel_pt_walk_insn()
1109 if (decoder->tx_flags & INTEL_PT_IN_TX) in intel_pt_walk_insn()
1110 decoder->state.flags |= INTEL_PT_IN_TX; in intel_pt_walk_insn()
1115 static bool intel_pt_fup_event(struct intel_pt_decoder *decoder) in intel_pt_fup_event() argument
1119 if (decoder->set_fup_tx_flags) { in intel_pt_fup_event()
1120 decoder->set_fup_tx_flags = false; in intel_pt_fup_event()
1121 decoder->tx_flags = decoder->fup_tx_flags; in intel_pt_fup_event()
1122 decoder->state.type = INTEL_PT_TRANSACTION; in intel_pt_fup_event()
1123 if (decoder->fup_tx_flags & INTEL_PT_ABORT_TX) in intel_pt_fup_event()
1124 decoder->state.type |= INTEL_PT_BRANCH; in intel_pt_fup_event()
1125 decoder->state.from_ip = decoder->ip; in intel_pt_fup_event()
1126 decoder->state.to_ip = 0; in intel_pt_fup_event()
1127 decoder->state.flags = decoder->fup_tx_flags; in intel_pt_fup_event()
1130 if (decoder->set_fup_ptw) { in intel_pt_fup_event()
1131 decoder->set_fup_ptw = false; in intel_pt_fup_event()
1132 decoder->state.type = INTEL_PT_PTW; in intel_pt_fup_event()
1133 decoder->state.flags |= INTEL_PT_FUP_IP; in intel_pt_fup_event()
1134 decoder->state.from_ip = decoder->ip; in intel_pt_fup_event()
1135 decoder->state.to_ip = 0; in intel_pt_fup_event()
1136 decoder->state.ptw_payload = decoder->fup_ptw_payload; in intel_pt_fup_event()
1139 if (decoder->set_fup_mwait) { in intel_pt_fup_event()
1140 decoder->set_fup_mwait = false; in intel_pt_fup_event()
1141 decoder->state.type = INTEL_PT_MWAIT_OP; in intel_pt_fup_event()
1142 decoder->state.from_ip = decoder->ip; in intel_pt_fup_event()
1143 decoder->state.to_ip = 0; in intel_pt_fup_event()
1144 decoder->state.mwait_payload = decoder->fup_mwait_payload; in intel_pt_fup_event()
1147 if (decoder->set_fup_pwre) { in intel_pt_fup_event()
1148 decoder->set_fup_pwre = false; in intel_pt_fup_event()
1149 decoder->state.type |= INTEL_PT_PWR_ENTRY; in intel_pt_fup_event()
1150 decoder->state.type &= ~INTEL_PT_BRANCH; in intel_pt_fup_event()
1151 decoder->state.from_ip = decoder->ip; in intel_pt_fup_event()
1152 decoder->state.to_ip = 0; in intel_pt_fup_event()
1153 decoder->state.pwre_payload = decoder->fup_pwre_payload; in intel_pt_fup_event()
1156 if (decoder->set_fup_exstop) { in intel_pt_fup_event()
1157 decoder->set_fup_exstop = false; in intel_pt_fup_event()
1158 decoder->state.type |= INTEL_PT_EX_STOP; in intel_pt_fup_event()
1159 decoder->state.type &= ~INTEL_PT_BRANCH; in intel_pt_fup_event()
1160 decoder->state.flags |= INTEL_PT_FUP_IP; in intel_pt_fup_event()
1161 decoder->state.from_ip = decoder->ip; in intel_pt_fup_event()
1162 decoder->state.to_ip = 0; in intel_pt_fup_event()
1165 if (decoder->set_fup_bep) { in intel_pt_fup_event()
1166 decoder->set_fup_bep = false; in intel_pt_fup_event()
1167 decoder->state.type |= INTEL_PT_BLK_ITEMS; in intel_pt_fup_event()
1168 decoder->state.type &= ~INTEL_PT_BRANCH; in intel_pt_fup_event()
1169 decoder->state.from_ip = decoder->ip; in intel_pt_fup_event()
1170 decoder->state.to_ip = 0; in intel_pt_fup_event()
1176 static inline bool intel_pt_fup_with_nlip(struct intel_pt_decoder *decoder, in intel_pt_fup_with_nlip() argument
1180 return decoder->flags & INTEL_PT_FUP_WITH_NLIP && !err && in intel_pt_fup_with_nlip()
1182 ip == decoder->ip + intel_pt_insn->length; in intel_pt_fup_with_nlip()
1185 static int intel_pt_walk_fup(struct intel_pt_decoder *decoder) in intel_pt_walk_fup() argument
1191 ip = decoder->last_ip; in intel_pt_walk_fup()
1194 err = intel_pt_walk_insn(decoder, &intel_pt_insn, ip); in intel_pt_walk_fup()
1198 intel_pt_fup_with_nlip(decoder, &intel_pt_insn, ip, err)) { in intel_pt_walk_fup()
1199 bool no_tip = decoder->pkt_state != INTEL_PT_STATE_FUP; in intel_pt_walk_fup()
1201 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_fup()
1202 if (intel_pt_fup_event(decoder) && no_tip) in intel_pt_walk_fup()
1206 decoder->set_fup_tx_flags = false; in intel_pt_walk_fup()
1212 decoder->ip); in intel_pt_walk_fup()
1213 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_fup()
1219 decoder->ip); in intel_pt_walk_fup()
1220 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_fup()
1224 intel_pt_bug(decoder); in intel_pt_walk_fup()
1228 static int intel_pt_walk_tip(struct intel_pt_decoder *decoder) in intel_pt_walk_tip() argument
1233 err = intel_pt_walk_insn(decoder, &intel_pt_insn, 0); in intel_pt_walk_tip()
1235 decoder->pgd_ip && in intel_pt_walk_tip()
1236 decoder->pkt_state == INTEL_PT_STATE_TIP_PGD && in intel_pt_walk_tip()
1237 (decoder->state.type & INTEL_PT_BRANCH) && in intel_pt_walk_tip()
1238 decoder->pgd_ip(decoder->state.to_ip, decoder->data)) { in intel_pt_walk_tip()
1240 decoder->no_progress = 0; in intel_pt_walk_tip()
1241 decoder->pge = false; in intel_pt_walk_tip()
1242 decoder->continuous_period = false; in intel_pt_walk_tip()
1243 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tip()
1244 decoder->state.type |= INTEL_PT_TRACE_END; in intel_pt_walk_tip()
1253 if (decoder->pkt_state == INTEL_PT_STATE_TIP_PGD) { in intel_pt_walk_tip()
1254 decoder->pge = false; in intel_pt_walk_tip()
1255 decoder->continuous_period = false; in intel_pt_walk_tip()
1256 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tip()
1257 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tip()
1258 if (decoder->packet.count == 0) { in intel_pt_walk_tip()
1259 decoder->state.to_ip = 0; in intel_pt_walk_tip()
1261 decoder->state.to_ip = decoder->last_ip; in intel_pt_walk_tip()
1262 decoder->ip = decoder->last_ip; in intel_pt_walk_tip()
1264 decoder->state.type |= INTEL_PT_TRACE_END; in intel_pt_walk_tip()
1266 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tip()
1267 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tip()
1268 if (decoder->packet.count == 0) { in intel_pt_walk_tip()
1269 decoder->state.to_ip = 0; in intel_pt_walk_tip()
1271 decoder->state.to_ip = decoder->last_ip; in intel_pt_walk_tip()
1272 decoder->ip = decoder->last_ip; in intel_pt_walk_tip()
1279 uint64_t to_ip = decoder->ip + intel_pt_insn.length + in intel_pt_walk_tip()
1282 if (decoder->pgd_ip && in intel_pt_walk_tip()
1283 decoder->pkt_state == INTEL_PT_STATE_TIP_PGD && in intel_pt_walk_tip()
1284 decoder->pgd_ip(to_ip, decoder->data)) { in intel_pt_walk_tip()
1286 decoder->pge = false; in intel_pt_walk_tip()
1287 decoder->continuous_period = false; in intel_pt_walk_tip()
1288 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tip()
1289 decoder->ip = to_ip; in intel_pt_walk_tip()
1290 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tip()
1291 decoder->state.to_ip = to_ip; in intel_pt_walk_tip()
1292 decoder->state.type |= INTEL_PT_TRACE_END; in intel_pt_walk_tip()
1296 decoder->ip); in intel_pt_walk_tip()
1297 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_walk_tip()
1301 return intel_pt_bug(decoder); in intel_pt_walk_tip()
1304 static int intel_pt_walk_tnt(struct intel_pt_decoder *decoder) in intel_pt_walk_tnt() argument
1310 err = intel_pt_walk_insn(decoder, &intel_pt_insn, 0); in intel_pt_walk_tnt()
1317 if (!decoder->return_compression) { in intel_pt_walk_tnt()
1319 decoder->ip); in intel_pt_walk_tnt()
1320 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1323 if (!decoder->ret_addr) { in intel_pt_walk_tnt()
1325 decoder->ip); in intel_pt_walk_tnt()
1326 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1329 if (!(decoder->tnt.payload & BIT63)) { in intel_pt_walk_tnt()
1331 decoder->ip); in intel_pt_walk_tnt()
1332 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1335 decoder->tnt.count -= 1; in intel_pt_walk_tnt()
1336 if (decoder->tnt.count) in intel_pt_walk_tnt()
1337 decoder->pkt_state = INTEL_PT_STATE_TNT_CONT; in intel_pt_walk_tnt()
1339 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tnt()
1340 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1341 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1342 decoder->ip = decoder->ret_addr; in intel_pt_walk_tnt()
1343 decoder->state.to_ip = decoder->ip; in intel_pt_walk_tnt()
1349 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_tnt()
1352 if (decoder->packet.type != INTEL_PT_TIP || in intel_pt_walk_tnt()
1353 decoder->packet.count == 0) { in intel_pt_walk_tnt()
1355 decoder->ip); in intel_pt_walk_tnt()
1356 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_tnt()
1357 decoder->pkt_step = 0; in intel_pt_walk_tnt()
1360 intel_pt_set_last_ip(decoder); in intel_pt_walk_tnt()
1361 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1362 decoder->state.to_ip = decoder->last_ip; in intel_pt_walk_tnt()
1363 decoder->ip = decoder->last_ip; in intel_pt_walk_tnt()
1368 decoder->tnt.count -= 1; in intel_pt_walk_tnt()
1369 if (decoder->tnt.count) in intel_pt_walk_tnt()
1370 decoder->pkt_state = INTEL_PT_STATE_TNT_CONT; in intel_pt_walk_tnt()
1372 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_walk_tnt()
1373 if (decoder->tnt.payload & BIT63) { in intel_pt_walk_tnt()
1374 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1375 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1376 decoder->ip += intel_pt_insn.length + in intel_pt_walk_tnt()
1378 decoder->state.to_ip = decoder->ip; in intel_pt_walk_tnt()
1382 if (decoder->state.type & INTEL_PT_INSTRUCTION) { in intel_pt_walk_tnt()
1383 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1384 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_walk_tnt()
1385 decoder->state.from_ip = decoder->ip; in intel_pt_walk_tnt()
1386 decoder->state.to_ip = 0; in intel_pt_walk_tnt()
1387 decoder->ip += intel_pt_insn.length; in intel_pt_walk_tnt()
1390 decoder->sample_cyc = false; in intel_pt_walk_tnt()
1391 decoder->ip += intel_pt_insn.length; in intel_pt_walk_tnt()
1392 if (!decoder->tnt.count) { in intel_pt_walk_tnt()
1393 intel_pt_update_sample_time(decoder); in intel_pt_walk_tnt()
1396 decoder->tnt.payload <<= 1; in intel_pt_walk_tnt()
1400 return intel_pt_bug(decoder); in intel_pt_walk_tnt()
1404 static int intel_pt_mode_tsx(struct intel_pt_decoder *decoder, bool *no_tip) in intel_pt_mode_tsx() argument
1409 fup_tx_flags = decoder->packet.payload & in intel_pt_mode_tsx()
1411 err = intel_pt_get_next_packet(decoder); in intel_pt_mode_tsx()
1414 if (decoder->packet.type == INTEL_PT_FUP) { in intel_pt_mode_tsx()
1415 decoder->fup_tx_flags = fup_tx_flags; in intel_pt_mode_tsx()
1416 decoder->set_fup_tx_flags = true; in intel_pt_mode_tsx()
1417 if (!(decoder->fup_tx_flags & INTEL_PT_ABORT_TX)) in intel_pt_mode_tsx()
1421 decoder->pos); in intel_pt_mode_tsx()
1422 intel_pt_update_in_tx(decoder); in intel_pt_mode_tsx()
1442 static void intel_pt_calc_tsc_timestamp(struct intel_pt_decoder *decoder) in intel_pt_calc_tsc_timestamp() argument
1446 decoder->have_tma = false; in intel_pt_calc_tsc_timestamp()
1448 if (decoder->ref_timestamp) { in intel_pt_calc_tsc_timestamp()
1449 timestamp = intel_pt_8b_tsc(decoder->packet.payload, in intel_pt_calc_tsc_timestamp()
1450 decoder->ref_timestamp); in intel_pt_calc_tsc_timestamp()
1451 decoder->tsc_timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1452 decoder->timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1453 decoder->ref_timestamp = 0; in intel_pt_calc_tsc_timestamp()
1454 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_tsc_timestamp()
1455 } else if (decoder->timestamp) { in intel_pt_calc_tsc_timestamp()
1456 timestamp = decoder->packet.payload | in intel_pt_calc_tsc_timestamp()
1457 (decoder->timestamp & (0xffULL << 56)); in intel_pt_calc_tsc_timestamp()
1458 decoder->tsc_timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1459 if (timestamp < decoder->timestamp && in intel_pt_calc_tsc_timestamp()
1460 decoder->timestamp - timestamp < decoder->tsc_slip) { in intel_pt_calc_tsc_timestamp()
1463 timestamp = decoder->timestamp; in intel_pt_calc_tsc_timestamp()
1465 if (timestamp < decoder->timestamp) { in intel_pt_calc_tsc_timestamp()
1468 decoder->tsc_timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1470 decoder->timestamp = timestamp; in intel_pt_calc_tsc_timestamp()
1471 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_tsc_timestamp()
1474 if (decoder->last_packet_type == INTEL_PT_CYC) { in intel_pt_calc_tsc_timestamp()
1475 decoder->cyc_ref_timestamp = decoder->timestamp; in intel_pt_calc_tsc_timestamp()
1476 decoder->cycle_cnt = 0; in intel_pt_calc_tsc_timestamp()
1477 decoder->have_calc_cyc_to_tsc = false; in intel_pt_calc_tsc_timestamp()
1478 intel_pt_calc_cyc_to_tsc(decoder, false); in intel_pt_calc_tsc_timestamp()
1481 intel_pt_log_to("Setting timestamp", decoder->timestamp); in intel_pt_calc_tsc_timestamp()
1484 static int intel_pt_overflow(struct intel_pt_decoder *decoder) in intel_pt_overflow() argument
1487 intel_pt_clear_tx_flags(decoder); in intel_pt_overflow()
1488 decoder->timestamp_insn_cnt = 0; in intel_pt_overflow()
1489 decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; in intel_pt_overflow()
1490 decoder->overflow = true; in intel_pt_overflow()
1494 static inline void intel_pt_mtc_cyc_cnt_pge(struct intel_pt_decoder *decoder) in intel_pt_mtc_cyc_cnt_pge() argument
1496 if (decoder->have_cyc) in intel_pt_mtc_cyc_cnt_pge()
1499 decoder->cyc_cnt_timestamp = decoder->timestamp; in intel_pt_mtc_cyc_cnt_pge()
1500 decoder->base_cyc_cnt = decoder->tot_cyc_cnt; in intel_pt_mtc_cyc_cnt_pge()
1503 static inline void intel_pt_mtc_cyc_cnt_cbr(struct intel_pt_decoder *decoder) in intel_pt_mtc_cyc_cnt_cbr() argument
1505 decoder->tsc_to_cyc = decoder->cbr / decoder->max_non_turbo_ratio_fp; in intel_pt_mtc_cyc_cnt_cbr()
1507 if (decoder->pge) in intel_pt_mtc_cyc_cnt_cbr()
1508 intel_pt_mtc_cyc_cnt_pge(decoder); in intel_pt_mtc_cyc_cnt_cbr()
1511 static inline void intel_pt_mtc_cyc_cnt_upd(struct intel_pt_decoder *decoder) in intel_pt_mtc_cyc_cnt_upd() argument
1515 if (decoder->have_cyc) in intel_pt_mtc_cyc_cnt_upd()
1518 decoder->sample_cyc = true; in intel_pt_mtc_cyc_cnt_upd()
1520 if (!decoder->pge || decoder->timestamp <= decoder->cyc_cnt_timestamp) in intel_pt_mtc_cyc_cnt_upd()
1523 tsc_delta = decoder->timestamp - decoder->cyc_cnt_timestamp; in intel_pt_mtc_cyc_cnt_upd()
1524 tot_cyc_cnt = tsc_delta * decoder->tsc_to_cyc + decoder->base_cyc_cnt; in intel_pt_mtc_cyc_cnt_upd()
1526 if (tot_cyc_cnt > decoder->tot_cyc_cnt) in intel_pt_mtc_cyc_cnt_upd()
1527 decoder->tot_cyc_cnt = tot_cyc_cnt; in intel_pt_mtc_cyc_cnt_upd()
1530 static void intel_pt_calc_tma(struct intel_pt_decoder *decoder) in intel_pt_calc_tma() argument
1532 uint32_t ctc = decoder->packet.payload; in intel_pt_calc_tma()
1533 uint32_t fc = decoder->packet.count; in intel_pt_calc_tma()
1534 uint32_t ctc_rem = ctc & decoder->ctc_rem_mask; in intel_pt_calc_tma()
1536 if (!decoder->tsc_ctc_ratio_d) in intel_pt_calc_tma()
1539 if (decoder->pge && !decoder->in_psb) in intel_pt_calc_tma()
1540 intel_pt_mtc_cyc_cnt_pge(decoder); in intel_pt_calc_tma()
1542 intel_pt_mtc_cyc_cnt_upd(decoder); in intel_pt_calc_tma()
1544 decoder->last_mtc = (ctc >> decoder->mtc_shift) & 0xff; in intel_pt_calc_tma()
1545 decoder->ctc_timestamp = decoder->tsc_timestamp - fc; in intel_pt_calc_tma()
1546 if (decoder->tsc_ctc_mult) { in intel_pt_calc_tma()
1547 decoder->ctc_timestamp -= ctc_rem * decoder->tsc_ctc_mult; in intel_pt_calc_tma()
1549 decoder->ctc_timestamp -= multdiv(ctc_rem, in intel_pt_calc_tma()
1550 decoder->tsc_ctc_ratio_n, in intel_pt_calc_tma()
1551 decoder->tsc_ctc_ratio_d); in intel_pt_calc_tma()
1553 decoder->ctc_delta = 0; in intel_pt_calc_tma()
1554 decoder->have_tma = true; in intel_pt_calc_tma()
1555 decoder->fixup_last_mtc = true; in intel_pt_calc_tma()
1557 decoder->ctc_timestamp, decoder->last_mtc, ctc_rem); in intel_pt_calc_tma()
1560 static void intel_pt_calc_mtc_timestamp(struct intel_pt_decoder *decoder) in intel_pt_calc_mtc_timestamp() argument
1565 if (!decoder->have_tma) in intel_pt_calc_mtc_timestamp()
1568 mtc = decoder->packet.payload; in intel_pt_calc_mtc_timestamp()
1570 if (decoder->mtc_shift > 8 && decoder->fixup_last_mtc) { in intel_pt_calc_mtc_timestamp()
1571 decoder->fixup_last_mtc = false; in intel_pt_calc_mtc_timestamp()
1572 intel_pt_fixup_last_mtc(mtc, decoder->mtc_shift, in intel_pt_calc_mtc_timestamp()
1573 &decoder->last_mtc); in intel_pt_calc_mtc_timestamp()
1576 if (mtc > decoder->last_mtc) in intel_pt_calc_mtc_timestamp()
1577 mtc_delta = mtc - decoder->last_mtc; in intel_pt_calc_mtc_timestamp()
1579 mtc_delta = mtc + 256 - decoder->last_mtc; in intel_pt_calc_mtc_timestamp()
1581 decoder->ctc_delta += mtc_delta << decoder->mtc_shift; in intel_pt_calc_mtc_timestamp()
1583 if (decoder->tsc_ctc_mult) { in intel_pt_calc_mtc_timestamp()
1584 timestamp = decoder->ctc_timestamp + in intel_pt_calc_mtc_timestamp()
1585 decoder->ctc_delta * decoder->tsc_ctc_mult; in intel_pt_calc_mtc_timestamp()
1587 timestamp = decoder->ctc_timestamp + in intel_pt_calc_mtc_timestamp()
1588 multdiv(decoder->ctc_delta, in intel_pt_calc_mtc_timestamp()
1589 decoder->tsc_ctc_ratio_n, in intel_pt_calc_mtc_timestamp()
1590 decoder->tsc_ctc_ratio_d); in intel_pt_calc_mtc_timestamp()
1593 if (timestamp < decoder->timestamp) in intel_pt_calc_mtc_timestamp()
1595 timestamp, decoder->timestamp); in intel_pt_calc_mtc_timestamp()
1597 decoder->timestamp = timestamp; in intel_pt_calc_mtc_timestamp()
1599 intel_pt_mtc_cyc_cnt_upd(decoder); in intel_pt_calc_mtc_timestamp()
1601 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_mtc_timestamp()
1602 decoder->last_mtc = mtc; in intel_pt_calc_mtc_timestamp()
1604 if (decoder->last_packet_type == INTEL_PT_CYC) { in intel_pt_calc_mtc_timestamp()
1605 decoder->cyc_ref_timestamp = decoder->timestamp; in intel_pt_calc_mtc_timestamp()
1606 decoder->cycle_cnt = 0; in intel_pt_calc_mtc_timestamp()
1607 decoder->have_calc_cyc_to_tsc = false; in intel_pt_calc_mtc_timestamp()
1608 intel_pt_calc_cyc_to_tsc(decoder, true); in intel_pt_calc_mtc_timestamp()
1611 intel_pt_log_to("Setting timestamp", decoder->timestamp); in intel_pt_calc_mtc_timestamp()
1614 static void intel_pt_calc_cbr(struct intel_pt_decoder *decoder) in intel_pt_calc_cbr() argument
1616 unsigned int cbr = decoder->packet.payload & 0xff; in intel_pt_calc_cbr()
1618 decoder->cbr_payload = decoder->packet.payload; in intel_pt_calc_cbr()
1620 if (decoder->cbr == cbr) in intel_pt_calc_cbr()
1623 decoder->cbr = cbr; in intel_pt_calc_cbr()
1624 decoder->cbr_cyc_to_tsc = decoder->max_non_turbo_ratio_fp / cbr; in intel_pt_calc_cbr()
1626 intel_pt_mtc_cyc_cnt_cbr(decoder); in intel_pt_calc_cbr()
1629 static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) in intel_pt_calc_cyc_timestamp() argument
1631 uint64_t timestamp = decoder->cyc_ref_timestamp; in intel_pt_calc_cyc_timestamp()
1633 decoder->have_cyc = true; in intel_pt_calc_cyc_timestamp()
1635 decoder->cycle_cnt += decoder->packet.payload; in intel_pt_calc_cyc_timestamp()
1636 if (decoder->pge) in intel_pt_calc_cyc_timestamp()
1637 decoder->tot_cyc_cnt += decoder->packet.payload; in intel_pt_calc_cyc_timestamp()
1638 decoder->sample_cyc = true; in intel_pt_calc_cyc_timestamp()
1640 if (!decoder->cyc_ref_timestamp) in intel_pt_calc_cyc_timestamp()
1643 if (decoder->have_calc_cyc_to_tsc) in intel_pt_calc_cyc_timestamp()
1644 timestamp += decoder->cycle_cnt * decoder->calc_cyc_to_tsc; in intel_pt_calc_cyc_timestamp()
1645 else if (decoder->cbr) in intel_pt_calc_cyc_timestamp()
1646 timestamp += decoder->cycle_cnt * decoder->cbr_cyc_to_tsc; in intel_pt_calc_cyc_timestamp()
1650 if (timestamp < decoder->timestamp) in intel_pt_calc_cyc_timestamp()
1652 timestamp, decoder->timestamp); in intel_pt_calc_cyc_timestamp()
1654 decoder->timestamp = timestamp; in intel_pt_calc_cyc_timestamp()
1656 decoder->timestamp_insn_cnt = 0; in intel_pt_calc_cyc_timestamp()
1658 intel_pt_log_to("Setting timestamp", decoder->timestamp); in intel_pt_calc_cyc_timestamp()
1661 static void intel_pt_bbp(struct intel_pt_decoder *decoder) in intel_pt_bbp() argument
1663 if (decoder->prev_pkt_ctx == INTEL_PT_NO_CTX) { in intel_pt_bbp()
1664 memset(decoder->state.items.mask, 0, sizeof(decoder->state.items.mask)); in intel_pt_bbp()
1665 decoder->state.items.is_32_bit = false; in intel_pt_bbp()
1667 decoder->blk_type = decoder->packet.payload; in intel_pt_bbp()
1668 decoder->blk_type_pos = intel_pt_blk_type_pos(decoder->blk_type); in intel_pt_bbp()
1669 if (decoder->blk_type == INTEL_PT_GP_REGS) in intel_pt_bbp()
1670 decoder->state.items.is_32_bit = decoder->packet.count; in intel_pt_bbp()
1671 if (decoder->blk_type_pos < 0) { in intel_pt_bbp()
1673 decoder->blk_type); in intel_pt_bbp()
1674 } else if (decoder->state.items.mask[decoder->blk_type_pos]) { in intel_pt_bbp()
1676 decoder->blk_type); in intel_pt_bbp()
1680 static void intel_pt_bip(struct intel_pt_decoder *decoder) in intel_pt_bip() argument
1682 uint32_t id = decoder->packet.count; in intel_pt_bip()
1684 int pos = decoder->blk_type_pos; in intel_pt_bip()
1688 id, decoder->blk_type); in intel_pt_bip()
1692 if (decoder->state.items.mask[pos] & bit) { in intel_pt_bip()
1694 id, decoder->blk_type); in intel_pt_bip()
1697 decoder->state.items.mask[pos] |= bit; in intel_pt_bip()
1698 decoder->state.items.val[pos][id] = decoder->packet.payload; in intel_pt_bip()
1702 static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder) in intel_pt_walk_psbend() argument
1706 decoder->in_psb = true; in intel_pt_walk_psbend()
1709 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_psbend()
1713 switch (decoder->packet.type) { in intel_pt_walk_psbend()
1736 decoder->have_tma = false; in intel_pt_walk_psbend()
1742 err = intel_pt_overflow(decoder); in intel_pt_walk_psbend()
1746 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_psbend()
1750 intel_pt_calc_tma(decoder); in intel_pt_walk_psbend()
1754 intel_pt_calc_cbr(decoder); in intel_pt_walk_psbend()
1758 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_psbend()
1762 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_psbend()
1766 decoder->pge = true; in intel_pt_walk_psbend()
1767 if (decoder->packet.count) { in intel_pt_walk_psbend()
1768 intel_pt_set_last_ip(decoder); in intel_pt_walk_psbend()
1769 if (decoder->hop) { in intel_pt_walk_psbend()
1771 decoder->ip = decoder->last_ip; in intel_pt_walk_psbend()
1772 decoder->hop_psb_fup = true; in intel_pt_walk_psbend()
1778 intel_pt_update_in_tx(decoder); in intel_pt_walk_psbend()
1782 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_psbend()
1783 if (decoder->period_type == INTEL_PT_PERIOD_MTC) in intel_pt_walk_psbend()
1784 decoder->state.type |= INTEL_PT_INSTRUCTION; in intel_pt_walk_psbend()
1788 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_psbend()
1799 decoder->in_psb = false; in intel_pt_walk_psbend()
1804 static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder) in intel_pt_walk_fup_tip() argument
1808 if (decoder->tx_flags & INTEL_PT_ABORT_TX) { in intel_pt_walk_fup_tip()
1809 decoder->tx_flags = 0; in intel_pt_walk_fup_tip()
1810 decoder->state.flags &= ~INTEL_PT_IN_TX; in intel_pt_walk_fup_tip()
1811 decoder->state.flags |= INTEL_PT_ABORT_TX; in intel_pt_walk_fup_tip()
1813 decoder->state.flags |= INTEL_PT_ASYNC; in intel_pt_walk_fup_tip()
1817 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_fup_tip()
1821 switch (decoder->packet.type) { in intel_pt_walk_fup_tip()
1843 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_fup_tip()
1844 decoder->pkt_step = 0; in intel_pt_walk_fup_tip()
1848 intel_pt_calc_cbr(decoder); in intel_pt_walk_fup_tip()
1852 return intel_pt_overflow(decoder); in intel_pt_walk_fup_tip()
1855 decoder->state.from_ip = decoder->ip; in intel_pt_walk_fup_tip()
1856 if (decoder->packet.count == 0) { in intel_pt_walk_fup_tip()
1857 decoder->state.to_ip = 0; in intel_pt_walk_fup_tip()
1859 intel_pt_set_ip(decoder); in intel_pt_walk_fup_tip()
1860 decoder->state.to_ip = decoder->ip; in intel_pt_walk_fup_tip()
1862 decoder->pge = false; in intel_pt_walk_fup_tip()
1863 decoder->continuous_period = false; in intel_pt_walk_fup_tip()
1864 decoder->state.type |= INTEL_PT_TRACE_END; in intel_pt_walk_fup_tip()
1868 decoder->pge = true; in intel_pt_walk_fup_tip()
1870 decoder->ip); in intel_pt_walk_fup_tip()
1871 decoder->state.from_ip = 0; in intel_pt_walk_fup_tip()
1872 if (decoder->packet.count == 0) { in intel_pt_walk_fup_tip()
1873 decoder->state.to_ip = 0; in intel_pt_walk_fup_tip()
1875 intel_pt_set_ip(decoder); in intel_pt_walk_fup_tip()
1876 decoder->state.to_ip = decoder->ip; in intel_pt_walk_fup_tip()
1878 decoder->state.type |= INTEL_PT_TRACE_BEGIN; in intel_pt_walk_fup_tip()
1879 intel_pt_mtc_cyc_cnt_pge(decoder); in intel_pt_walk_fup_tip()
1883 decoder->state.from_ip = decoder->ip; in intel_pt_walk_fup_tip()
1884 if (decoder->packet.count == 0) { in intel_pt_walk_fup_tip()
1885 decoder->state.to_ip = 0; in intel_pt_walk_fup_tip()
1887 intel_pt_set_ip(decoder); in intel_pt_walk_fup_tip()
1888 decoder->state.to_ip = decoder->ip; in intel_pt_walk_fup_tip()
1893 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_fup_tip()
1897 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_fup_tip()
1898 if (decoder->period_type == INTEL_PT_PERIOD_MTC) in intel_pt_walk_fup_tip()
1899 decoder->state.type |= INTEL_PT_INSTRUCTION; in intel_pt_walk_fup_tip()
1903 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_fup_tip()
1907 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_fup_tip()
1916 return intel_pt_bug(decoder); in intel_pt_walk_fup_tip()
1921 static int intel_pt_resample(struct intel_pt_decoder *decoder) in intel_pt_resample() argument
1923 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_resample()
1924 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_resample()
1925 decoder->state.from_ip = decoder->ip; in intel_pt_resample()
1926 decoder->state.to_ip = 0; in intel_pt_resample()
1935 static int intel_pt_scan_for_psb(struct intel_pt_decoder *decoder);
1938 static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, int *err) in intel_pt_hop_trace() argument
1941 if (decoder->leap && !decoder->in_psb && decoder->packet.type != INTEL_PT_PSB) { in intel_pt_hop_trace()
1942 *err = intel_pt_scan_for_psb(decoder); in intel_pt_hop_trace()
1947 switch (decoder->packet.type) { in intel_pt_hop_trace()
1952 if (!decoder->packet.count) in intel_pt_hop_trace()
1954 intel_pt_set_ip(decoder); in intel_pt_hop_trace()
1955 decoder->state.type |= INTEL_PT_TRACE_END; in intel_pt_hop_trace()
1956 decoder->state.from_ip = 0; in intel_pt_hop_trace()
1957 decoder->state.to_ip = decoder->ip; in intel_pt_hop_trace()
1961 if (!decoder->packet.count) in intel_pt_hop_trace()
1963 intel_pt_set_ip(decoder); in intel_pt_hop_trace()
1964 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_hop_trace()
1965 decoder->state.from_ip = decoder->ip; in intel_pt_hop_trace()
1966 decoder->state.to_ip = 0; in intel_pt_hop_trace()
1970 if (!decoder->packet.count) in intel_pt_hop_trace()
1972 intel_pt_set_ip(decoder); in intel_pt_hop_trace()
1973 if (intel_pt_fup_event(decoder)) in intel_pt_hop_trace()
1975 if (!decoder->branch_enable) in intel_pt_hop_trace()
1978 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_hop_trace()
1979 decoder->state.from_ip = decoder->ip; in intel_pt_hop_trace()
1980 decoder->state.to_ip = 0; in intel_pt_hop_trace()
1983 *err = intel_pt_walk_fup_tip(decoder); in intel_pt_hop_trace()
1985 decoder->pkt_state = INTEL_PT_STATE_RESAMPLE; in intel_pt_hop_trace()
1989 decoder->last_ip = 0; in intel_pt_hop_trace()
1990 decoder->have_last_ip = true; in intel_pt_hop_trace()
1991 decoder->hop_psb_fup = false; in intel_pt_hop_trace()
1992 *err = intel_pt_walk_psbend(decoder); in intel_pt_hop_trace()
1997 if (decoder->hop_psb_fup) { in intel_pt_hop_trace()
1998 decoder->hop_psb_fup = false; in intel_pt_hop_trace()
1999 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_hop_trace()
2000 decoder->state.from_ip = decoder->ip; in intel_pt_hop_trace()
2001 decoder->state.to_ip = 0; in intel_pt_hop_trace()
2004 if (decoder->cbr != decoder->cbr_seen) { in intel_pt_hop_trace()
2005 decoder->state.type = 0; in intel_pt_hop_trace()
2042 static int intel_pt_walk_trace(struct intel_pt_decoder *decoder) in intel_pt_walk_trace() argument
2049 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_trace()
2053 if (decoder->cyc_threshold) { in intel_pt_walk_trace()
2054 if (decoder->sample_cyc && last_packet_type != INTEL_PT_CYC) in intel_pt_walk_trace()
2055 decoder->sample_cyc = false; in intel_pt_walk_trace()
2056 last_packet_type = decoder->packet.type; in intel_pt_walk_trace()
2059 if (decoder->hop) { in intel_pt_walk_trace()
2060 switch (intel_pt_hop_trace(decoder, &no_tip, &err)) { in intel_pt_walk_trace()
2072 switch (decoder->packet.type) { in intel_pt_walk_trace()
2074 if (!decoder->packet.count) in intel_pt_walk_trace()
2076 decoder->tnt = decoder->packet; in intel_pt_walk_trace()
2077 decoder->pkt_state = INTEL_PT_STATE_TNT; in intel_pt_walk_trace()
2078 err = intel_pt_walk_tnt(decoder); in intel_pt_walk_trace()
2084 if (decoder->packet.count != 0) in intel_pt_walk_trace()
2085 intel_pt_set_last_ip(decoder); in intel_pt_walk_trace()
2086 decoder->pkt_state = INTEL_PT_STATE_TIP_PGD; in intel_pt_walk_trace()
2087 return intel_pt_walk_tip(decoder); in intel_pt_walk_trace()
2090 decoder->pge = true; in intel_pt_walk_trace()
2091 intel_pt_mtc_cyc_cnt_pge(decoder); in intel_pt_walk_trace()
2092 if (decoder->packet.count == 0) { in intel_pt_walk_trace()
2094 decoder->pos); in intel_pt_walk_trace()
2097 intel_pt_set_ip(decoder); in intel_pt_walk_trace()
2098 decoder->state.from_ip = 0; in intel_pt_walk_trace()
2099 decoder->state.to_ip = decoder->ip; in intel_pt_walk_trace()
2100 decoder->state.type |= INTEL_PT_TRACE_BEGIN; in intel_pt_walk_trace()
2105 if (decoder->hop) in intel_pt_walk_trace()
2106 decoder->pkt_state = INTEL_PT_STATE_RESAMPLE; in intel_pt_walk_trace()
2111 return intel_pt_overflow(decoder); in intel_pt_walk_trace()
2114 if (decoder->packet.count != 0) in intel_pt_walk_trace()
2115 intel_pt_set_last_ip(decoder); in intel_pt_walk_trace()
2116 decoder->pkt_state = INTEL_PT_STATE_TIP; in intel_pt_walk_trace()
2117 return intel_pt_walk_tip(decoder); in intel_pt_walk_trace()
2120 if (decoder->packet.count == 0) { in intel_pt_walk_trace()
2122 decoder->pos); in intel_pt_walk_trace()
2126 intel_pt_set_last_ip(decoder); in intel_pt_walk_trace()
2127 if (!decoder->branch_enable) { in intel_pt_walk_trace()
2128 decoder->ip = decoder->last_ip; in intel_pt_walk_trace()
2129 if (intel_pt_fup_event(decoder)) in intel_pt_walk_trace()
2134 if (decoder->set_fup_mwait) in intel_pt_walk_trace()
2137 decoder->pkt_state = INTEL_PT_STATE_FUP_NO_TIP; in intel_pt_walk_trace()
2139 decoder->pkt_state = INTEL_PT_STATE_FUP; in intel_pt_walk_trace()
2140 err = intel_pt_walk_fup(decoder); in intel_pt_walk_trace()
2147 return intel_pt_walk_fup_tip(decoder); in intel_pt_walk_trace()
2150 decoder->pge = false; in intel_pt_walk_trace()
2151 decoder->continuous_period = false; in intel_pt_walk_trace()
2152 intel_pt_clear_tx_flags(decoder); in intel_pt_walk_trace()
2153 decoder->have_tma = false; in intel_pt_walk_trace()
2157 decoder->last_ip = 0; in intel_pt_walk_trace()
2158 decoder->have_last_ip = true; in intel_pt_walk_trace()
2159 intel_pt_clear_stack(&decoder->stack); in intel_pt_walk_trace()
2160 err = intel_pt_walk_psbend(decoder); in intel_pt_walk_trace()
2170 if (decoder->cbr != decoder->cbr_seen) { in intel_pt_walk_trace()
2171 decoder->state.type = 0; in intel_pt_walk_trace()
2177 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_trace()
2181 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_trace()
2182 if (decoder->period_type != INTEL_PT_PERIOD_MTC) in intel_pt_walk_trace()
2188 if (!decoder->mtc_insn) in intel_pt_walk_trace()
2190 decoder->mtc_insn = false; in intel_pt_walk_trace()
2192 if (!decoder->timestamp) in intel_pt_walk_trace()
2194 decoder->state.type = INTEL_PT_INSTRUCTION; in intel_pt_walk_trace()
2195 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
2196 decoder->state.to_ip = 0; in intel_pt_walk_trace()
2197 decoder->mtc_insn = false; in intel_pt_walk_trace()
2201 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_trace()
2205 intel_pt_calc_tma(decoder); in intel_pt_walk_trace()
2209 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_trace()
2213 intel_pt_calc_cbr(decoder); in intel_pt_walk_trace()
2214 if (decoder->cbr != decoder->cbr_seen) { in intel_pt_walk_trace()
2215 decoder->state.type = 0; in intel_pt_walk_trace()
2221 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_trace()
2226 if (!decoder->pge || decoder->in_psb) { in intel_pt_walk_trace()
2227 intel_pt_update_in_tx(decoder); in intel_pt_walk_trace()
2230 err = intel_pt_mode_tsx(decoder, &no_tip); in intel_pt_walk_trace()
2236 return intel_pt_bug(decoder); in intel_pt_walk_trace()
2245 decoder->fup_ptw_payload = decoder->packet.payload; in intel_pt_walk_trace()
2246 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_trace()
2249 if (decoder->packet.type == INTEL_PT_FUP) { in intel_pt_walk_trace()
2250 decoder->set_fup_ptw = true; in intel_pt_walk_trace()
2254 decoder->pos); in intel_pt_walk_trace()
2259 decoder->state.type = INTEL_PT_PTW; in intel_pt_walk_trace()
2260 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
2261 decoder->state.to_ip = 0; in intel_pt_walk_trace()
2262 decoder->state.ptw_payload = decoder->packet.payload; in intel_pt_walk_trace()
2266 decoder->fup_mwait_payload = decoder->packet.payload; in intel_pt_walk_trace()
2267 decoder->set_fup_mwait = true; in intel_pt_walk_trace()
2271 if (decoder->set_fup_mwait) { in intel_pt_walk_trace()
2272 decoder->fup_pwre_payload = in intel_pt_walk_trace()
2273 decoder->packet.payload; in intel_pt_walk_trace()
2274 decoder->set_fup_pwre = true; in intel_pt_walk_trace()
2277 decoder->state.type = INTEL_PT_PWR_ENTRY; in intel_pt_walk_trace()
2278 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
2279 decoder->state.to_ip = 0; in intel_pt_walk_trace()
2280 decoder->state.pwrx_payload = decoder->packet.payload; in intel_pt_walk_trace()
2284 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_trace()
2287 if (decoder->packet.type == INTEL_PT_FUP) { in intel_pt_walk_trace()
2288 decoder->set_fup_exstop = true; in intel_pt_walk_trace()
2292 decoder->pos); in intel_pt_walk_trace()
2297 decoder->state.type = INTEL_PT_EX_STOP; in intel_pt_walk_trace()
2298 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
2299 decoder->state.to_ip = 0; in intel_pt_walk_trace()
2303 decoder->state.type = INTEL_PT_PWR_EXIT; in intel_pt_walk_trace()
2304 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
2305 decoder->state.to_ip = 0; in intel_pt_walk_trace()
2306 decoder->state.pwrx_payload = decoder->packet.payload; in intel_pt_walk_trace()
2310 intel_pt_bbp(decoder); in intel_pt_walk_trace()
2314 intel_pt_bip(decoder); in intel_pt_walk_trace()
2318 decoder->state.type = INTEL_PT_BLK_ITEMS; in intel_pt_walk_trace()
2319 decoder->state.from_ip = decoder->ip; in intel_pt_walk_trace()
2320 decoder->state.to_ip = 0; in intel_pt_walk_trace()
2324 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_trace()
2327 if (decoder->packet.type == INTEL_PT_FUP) { in intel_pt_walk_trace()
2328 decoder->set_fup_bep = true; in intel_pt_walk_trace()
2332 decoder->pos); in intel_pt_walk_trace()
2337 return intel_pt_bug(decoder); in intel_pt_walk_trace()
2342 static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder) in intel_pt_have_ip() argument
2344 return decoder->packet.count && in intel_pt_have_ip()
2345 (decoder->have_last_ip || decoder->packet.count == 3 || in intel_pt_have_ip()
2346 decoder->packet.count == 6); in intel_pt_have_ip()
2350 static int intel_pt_walk_psb(struct intel_pt_decoder *decoder) in intel_pt_walk_psb() argument
2354 decoder->in_psb = true; in intel_pt_walk_psb()
2357 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_psb()
2361 switch (decoder->packet.type) { in intel_pt_walk_psb()
2363 decoder->continuous_period = false; in intel_pt_walk_psb()
2383 decoder->pge = true; in intel_pt_walk_psb()
2384 if (intel_pt_have_ip(decoder)) { in intel_pt_walk_psb()
2385 uint64_t current_ip = decoder->ip; in intel_pt_walk_psb()
2387 intel_pt_set_ip(decoder); in intel_pt_walk_psb()
2390 decoder->ip); in intel_pt_walk_psb()
2395 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_psb()
2399 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_psb()
2403 intel_pt_calc_tma(decoder); in intel_pt_walk_psb()
2407 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_psb()
2411 intel_pt_calc_cbr(decoder); in intel_pt_walk_psb()
2415 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_psb()
2419 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_psb()
2423 intel_pt_update_in_tx(decoder); in intel_pt_walk_psb()
2427 decoder->pge = false; in intel_pt_walk_psb()
2428 decoder->continuous_period = false; in intel_pt_walk_psb()
2429 intel_pt_clear_tx_flags(decoder); in intel_pt_walk_psb()
2433 decoder->have_tma = false; in intel_pt_walk_psb()
2435 if (decoder->ip) in intel_pt_walk_psb()
2436 decoder->pkt_state = INTEL_PT_STATE_ERR4; in intel_pt_walk_psb()
2438 decoder->pkt_state = INTEL_PT_STATE_ERR3; in intel_pt_walk_psb()
2443 err = intel_pt_bug(decoder); in intel_pt_walk_psb()
2447 err = intel_pt_overflow(decoder); in intel_pt_walk_psb()
2463 decoder->in_psb = false; in intel_pt_walk_psb()
2468 static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) in intel_pt_walk_to_ip() argument
2473 err = intel_pt_get_next_packet(decoder); in intel_pt_walk_to_ip()
2477 switch (decoder->packet.type) { in intel_pt_walk_to_ip()
2479 decoder->continuous_period = false; in intel_pt_walk_to_ip()
2480 decoder->pge = false; in intel_pt_walk_to_ip()
2481 if (intel_pt_have_ip(decoder)) in intel_pt_walk_to_ip()
2482 intel_pt_set_ip(decoder); in intel_pt_walk_to_ip()
2483 if (!decoder->ip) in intel_pt_walk_to_ip()
2485 decoder->state.type |= INTEL_PT_TRACE_END; in intel_pt_walk_to_ip()
2489 decoder->pge = true; in intel_pt_walk_to_ip()
2490 intel_pt_mtc_cyc_cnt_pge(decoder); in intel_pt_walk_to_ip()
2491 if (intel_pt_have_ip(decoder)) in intel_pt_walk_to_ip()
2492 intel_pt_set_ip(decoder); in intel_pt_walk_to_ip()
2493 if (!decoder->ip) in intel_pt_walk_to_ip()
2495 decoder->state.type |= INTEL_PT_TRACE_BEGIN; in intel_pt_walk_to_ip()
2499 decoder->pge = true; in intel_pt_walk_to_ip()
2500 if (intel_pt_have_ip(decoder)) in intel_pt_walk_to_ip()
2501 intel_pt_set_ip(decoder); in intel_pt_walk_to_ip()
2502 if (!decoder->ip) in intel_pt_walk_to_ip()
2507 if (intel_pt_have_ip(decoder)) in intel_pt_walk_to_ip()
2508 intel_pt_set_ip(decoder); in intel_pt_walk_to_ip()
2509 if (decoder->ip) in intel_pt_walk_to_ip()
2514 intel_pt_calc_mtc_timestamp(decoder); in intel_pt_walk_to_ip()
2518 intel_pt_calc_tsc_timestamp(decoder); in intel_pt_walk_to_ip()
2522 intel_pt_calc_tma(decoder); in intel_pt_walk_to_ip()
2526 intel_pt_calc_cyc_timestamp(decoder); in intel_pt_walk_to_ip()
2530 intel_pt_calc_cbr(decoder); in intel_pt_walk_to_ip()
2534 decoder->cr3 = decoder->packet.payload & (BIT63 - 1); in intel_pt_walk_to_ip()
2538 decoder->exec_mode = decoder->packet.payload; in intel_pt_walk_to_ip()
2542 intel_pt_update_in_tx(decoder); in intel_pt_walk_to_ip()
2546 return intel_pt_overflow(decoder); in intel_pt_walk_to_ip()
2549 return intel_pt_bug(decoder); in intel_pt_walk_to_ip()
2552 decoder->pge = false; in intel_pt_walk_to_ip()
2553 decoder->continuous_period = false; in intel_pt_walk_to_ip()
2554 intel_pt_clear_tx_flags(decoder); in intel_pt_walk_to_ip()
2555 decoder->have_tma = false; in intel_pt_walk_to_ip()
2559 decoder->last_ip = 0; in intel_pt_walk_to_ip()
2560 decoder->have_last_ip = true; in intel_pt_walk_to_ip()
2561 intel_pt_clear_stack(&decoder->stack); in intel_pt_walk_to_ip()
2562 err = intel_pt_walk_psb(decoder); in intel_pt_walk_to_ip()
2565 if (decoder->ip) { in intel_pt_walk_to_ip()
2567 decoder->state.type = 0; in intel_pt_walk_to_ip()
2594 static int intel_pt_sync_ip(struct intel_pt_decoder *decoder) in intel_pt_sync_ip() argument
2598 decoder->set_fup_tx_flags = false; in intel_pt_sync_ip()
2599 decoder->set_fup_ptw = false; in intel_pt_sync_ip()
2600 decoder->set_fup_mwait = false; in intel_pt_sync_ip()
2601 decoder->set_fup_pwre = false; in intel_pt_sync_ip()
2602 decoder->set_fup_exstop = false; in intel_pt_sync_ip()
2603 decoder->set_fup_bep = false; in intel_pt_sync_ip()
2605 if (!decoder->branch_enable) { in intel_pt_sync_ip()
2606 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_sync_ip()
2607 decoder->overflow = false; in intel_pt_sync_ip()
2608 decoder->state.type = 0; /* Do not have a sample */ in intel_pt_sync_ip()
2613 err = intel_pt_walk_to_ip(decoder); in intel_pt_sync_ip()
2618 if (decoder->hop) in intel_pt_sync_ip()
2619 decoder->pkt_state = INTEL_PT_STATE_RESAMPLE; in intel_pt_sync_ip()
2621 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_sync_ip()
2622 decoder->overflow = false; in intel_pt_sync_ip()
2624 decoder->state.from_ip = 0; in intel_pt_sync_ip()
2625 decoder->state.to_ip = decoder->ip; in intel_pt_sync_ip()
2626 intel_pt_log_to("Setting IP", decoder->ip); in intel_pt_sync_ip()
2631 static int intel_pt_part_psb(struct intel_pt_decoder *decoder) in intel_pt_part_psb() argument
2633 const unsigned char *end = decoder->buf + decoder->len; in intel_pt_part_psb()
2637 if (i > decoder->len) in intel_pt_part_psb()
2645 static int intel_pt_rest_psb(struct intel_pt_decoder *decoder, int part_psb) in intel_pt_rest_psb() argument
2650 if (rest_psb > decoder->len || in intel_pt_rest_psb()
2651 memcmp(decoder->buf, psb + part_psb, rest_psb)) in intel_pt_rest_psb()
2657 static int intel_pt_get_split_psb(struct intel_pt_decoder *decoder, in intel_pt_get_split_psb() argument
2662 decoder->pos += decoder->len; in intel_pt_get_split_psb()
2663 decoder->len = 0; in intel_pt_get_split_psb()
2665 ret = intel_pt_get_next_data(decoder, false); in intel_pt_get_split_psb()
2669 rest_psb = intel_pt_rest_psb(decoder, part_psb); in intel_pt_get_split_psb()
2673 decoder->pos -= part_psb; in intel_pt_get_split_psb()
2674 decoder->next_buf = decoder->buf + rest_psb; in intel_pt_get_split_psb()
2675 decoder->next_len = decoder->len - rest_psb; in intel_pt_get_split_psb()
2676 memcpy(decoder->temp_buf, INTEL_PT_PSB_STR, INTEL_PT_PSB_LEN); in intel_pt_get_split_psb()
2677 decoder->buf = decoder->temp_buf; in intel_pt_get_split_psb()
2678 decoder->len = INTEL_PT_PSB_LEN; in intel_pt_get_split_psb()
2683 static int intel_pt_scan_for_psb(struct intel_pt_decoder *decoder) in intel_pt_scan_for_psb() argument
2690 if (!decoder->len) { in intel_pt_scan_for_psb()
2691 ret = intel_pt_get_next_data(decoder, false); in intel_pt_scan_for_psb()
2696 next = memmem(decoder->buf, decoder->len, INTEL_PT_PSB_STR, in intel_pt_scan_for_psb()
2701 part_psb = intel_pt_part_psb(decoder); in intel_pt_scan_for_psb()
2703 ret = intel_pt_get_split_psb(decoder, part_psb); in intel_pt_scan_for_psb()
2707 decoder->pos += decoder->len; in intel_pt_scan_for_psb()
2708 decoder->len = 0; in intel_pt_scan_for_psb()
2713 decoder->pkt_step = next - decoder->buf; in intel_pt_scan_for_psb()
2714 return intel_pt_get_next_packet(decoder); in intel_pt_scan_for_psb()
2718 static int intel_pt_sync(struct intel_pt_decoder *decoder) in intel_pt_sync() argument
2722 decoder->pge = false; in intel_pt_sync()
2723 decoder->continuous_period = false; in intel_pt_sync()
2724 decoder->have_last_ip = false; in intel_pt_sync()
2725 decoder->last_ip = 0; in intel_pt_sync()
2726 decoder->ip = 0; in intel_pt_sync()
2727 intel_pt_clear_stack(&decoder->stack); in intel_pt_sync()
2730 err = intel_pt_scan_for_psb(decoder); in intel_pt_sync()
2734 decoder->have_last_ip = true; in intel_pt_sync()
2735 decoder->pkt_state = INTEL_PT_STATE_NO_IP; in intel_pt_sync()
2737 err = intel_pt_walk_psb(decoder); in intel_pt_sync()
2741 if (decoder->ip) { in intel_pt_sync()
2742 decoder->state.type = 0; /* Do not have a sample */ in intel_pt_sync()
2747 if (decoder->hop) in intel_pt_sync()
2748 decoder->pkt_state = INTEL_PT_STATE_RESAMPLE; in intel_pt_sync()
2750 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; in intel_pt_sync()
2751 } else if (decoder->leap) { in intel_pt_sync()
2758 return intel_pt_sync_ip(decoder); in intel_pt_sync()
2764 static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder) in intel_pt_est_timestamp() argument
2766 uint64_t est = decoder->sample_insn_cnt << 1; in intel_pt_est_timestamp()
2768 if (!decoder->cbr || !decoder->max_non_turbo_ratio) in intel_pt_est_timestamp()
2771 est *= decoder->max_non_turbo_ratio; in intel_pt_est_timestamp()
2772 est /= decoder->cbr; in intel_pt_est_timestamp()
2774 return decoder->sample_timestamp + est; in intel_pt_est_timestamp()
2777 const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder) in intel_pt_decode() argument
2782 decoder->state.type = INTEL_PT_BRANCH; in intel_pt_decode()
2783 decoder->state.flags = 0; in intel_pt_decode()
2785 switch (decoder->pkt_state) { in intel_pt_decode()
2787 err = intel_pt_sync(decoder); in intel_pt_decode()
2790 decoder->have_last_ip = false; in intel_pt_decode()
2791 decoder->last_ip = 0; in intel_pt_decode()
2792 decoder->ip = 0; in intel_pt_decode()
2795 err = intel_pt_sync_ip(decoder); in intel_pt_decode()
2798 err = intel_pt_walk_trace(decoder); in intel_pt_decode()
2802 err = intel_pt_walk_tnt(decoder); in intel_pt_decode()
2804 err = intel_pt_walk_trace(decoder); in intel_pt_decode()
2808 err = intel_pt_walk_tip(decoder); in intel_pt_decode()
2811 err = intel_pt_walk_fup(decoder); in intel_pt_decode()
2813 err = intel_pt_walk_fup_tip(decoder); in intel_pt_decode()
2816 err = intel_pt_walk_fup(decoder); in intel_pt_decode()
2818 err = intel_pt_walk_trace(decoder); in intel_pt_decode()
2821 err = intel_pt_resample(decoder); in intel_pt_decode()
2824 err = intel_pt_bug(decoder); in intel_pt_decode()
2830 decoder->state.err = intel_pt_ext_err(err); in intel_pt_decode()
2831 decoder->state.from_ip = decoder->ip; in intel_pt_decode()
2832 intel_pt_update_sample_time(decoder); in intel_pt_decode()
2833 decoder->sample_tot_cyc_cnt = decoder->tot_cyc_cnt; in intel_pt_decode()
2835 decoder->state.err = 0; in intel_pt_decode()
2836 if (decoder->cbr != decoder->cbr_seen) { in intel_pt_decode()
2837 decoder->cbr_seen = decoder->cbr; in intel_pt_decode()
2838 if (!decoder->state.type) { in intel_pt_decode()
2839 decoder->state.from_ip = decoder->ip; in intel_pt_decode()
2840 decoder->state.to_ip = 0; in intel_pt_decode()
2842 decoder->state.type |= INTEL_PT_CBR_CHG; in intel_pt_decode()
2843 decoder->state.cbr_payload = decoder->cbr_payload; in intel_pt_decode()
2844 decoder->state.cbr = decoder->cbr; in intel_pt_decode()
2846 if (intel_pt_sample_time(decoder->pkt_state)) { in intel_pt_decode()
2847 intel_pt_update_sample_time(decoder); in intel_pt_decode()
2848 if (decoder->sample_cyc) { in intel_pt_decode()
2849 decoder->sample_tot_cyc_cnt = decoder->tot_cyc_cnt; in intel_pt_decode()
2850 decoder->state.flags |= INTEL_PT_SAMPLE_IPC; in intel_pt_decode()
2851 decoder->sample_cyc = false; in intel_pt_decode()
2858 if (!decoder->have_cyc) in intel_pt_decode()
2859 decoder->state.flags |= INTEL_PT_SAMPLE_IPC; in intel_pt_decode()
2862 decoder->state.timestamp = decoder->sample_timestamp; in intel_pt_decode()
2863 decoder->state.est_timestamp = intel_pt_est_timestamp(decoder); in intel_pt_decode()
2864 decoder->state.cr3 = decoder->cr3; in intel_pt_decode()
2865 decoder->state.tot_insn_cnt = decoder->tot_insn_cnt; in intel_pt_decode()
2866 decoder->state.tot_cyc_cnt = decoder->sample_tot_cyc_cnt; in intel_pt_decode()
2868 return &decoder->state; in intel_pt_decode()
3232 * intel_pt_fast_forward - reposition decoder forwards.
3233 * @decoder: Intel PT decoder
3236 * Reposition decoder at the last PSB with a timestamp earlier than @timestamp.
3240 int intel_pt_fast_forward(struct intel_pt_decoder *decoder, uint64_t timestamp) in intel_pt_fast_forward() argument
3250 err = decoder->lookahead(decoder->data, intel_pt_ff_cb, &d); in intel_pt_fast_forward()
3257 decoder->pos += decoder->len; in intel_pt_fast_forward()
3258 decoder->len = 0; in intel_pt_fast_forward()
3259 err = intel_pt_get_next_data(decoder, true); in intel_pt_fast_forward()
3263 } while (decoder->buf_timestamp != d.buf_timestamp); in intel_pt_fast_forward()
3266 if (!decoder->buf) in intel_pt_fast_forward()
3269 buf = (unsigned char *)decoder->buf; in intel_pt_fast_forward()
3270 len = decoder->len; in intel_pt_fast_forward()
3285 tsc = intel_pt_8b_tsc(tsc, decoder->buf_timestamp); in intel_pt_fast_forward()
3294 decoder->pos += decoder->len - len; in intel_pt_fast_forward()
3295 decoder->buf = buf; in intel_pt_fast_forward()
3296 decoder->len = len; in intel_pt_fast_forward()
3297 intel_pt_reposition(decoder); in intel_pt_fast_forward()