• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/contrib/processor-trace/libipt/src/

Lines Matching refs:decoder

48  * The packet @decoder must be synchronized onto the trace stream at the
60 struct pt_packet_decoder *decoder)
62 if (!packet || !decoder)
68 errcode = pt_pkt_next(decoder, packet, sizeof(*packet));
88 int pt_qry_decoder_init(struct pt_query_decoder *decoder,
93 if (!decoder)
96 memset(decoder, 0, sizeof(*decoder));
98 errcode = pt_config_from_user(&decoder->config, config);
102 pt_last_ip_init(&decoder->ip);
103 pt_tnt_cache_init(&decoder->tnt);
104 pt_time_init(&decoder->time);
105 pt_time_init(&decoder->last_time);
106 pt_tcal_init(&decoder->tcal);
107 pt_evq_init(&decoder->evq);
114 struct pt_query_decoder *decoder;
117 decoder = malloc(sizeof(*decoder));
118 if (!decoder)
121 errcode = pt_qry_decoder_init(decoder, config);
123 free(decoder);
127 return decoder;
130 void pt_qry_decoder_fini(struct pt_query_decoder *decoder)
132 (void) decoder;
137 void pt_qry_free_decoder(struct pt_query_decoder *decoder)
139 pt_qry_decoder_fini(decoder);
140 free(decoder);
143 static void pt_qry_reset(struct pt_query_decoder *decoder)
145 if (!decoder)
148 decoder->enabled = 0;
149 decoder->consume_packet = 0;
150 decoder->event = NULL;
152 pt_last_ip_init(&decoder->ip);
153 pt_tnt_cache_init(&decoder->tnt);
154 pt_time_init(&decoder->time);
155 pt_time_init(&decoder->last_time);
156 pt_tcal_init(&decoder->tcal);
157 pt_evq_init(&decoder->evq);
160 static int pt_qry_will_event(const struct pt_query_decoder *decoder)
164 if (!decoder)
167 dfun = decoder->next;
175 return pt_evq_pending(&decoder->evq, evb_psbend);
178 return pt_evq_pending(&decoder->evq, evb_tip);
181 return pt_evq_pending(&decoder->evq, evb_fup);
186 static int pt_qry_will_eos(const struct pt_query_decoder *decoder)
191 if (!decoder)
194 dfun = decoder->next;
205 errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config);
209 static int pt_qry_status_flags(const struct pt_query_decoder *decoder)
213 if (!decoder)
230 if (pt_tnt_cache_is_empty(&decoder->tnt)) {
231 if (pt_qry_will_event(decoder))
234 if (pt_qry_will_eos(decoder))
241 static int pt_qry_provoke_fetch_error(const struct pt_query_decoder *decoder)
246 if (!decoder)
249 /* Repeat the decoder fetch to reproduce the error. */
250 errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config);
258 static int pt_qry_read_ahead(struct pt_query_decoder *decoder)
260 if (!decoder)
267 errcode = pt_df_fetch(&decoder->next, decoder->pos,
268 &decoder->config);
272 dfun = decoder->next;
286 if (pt_qry_will_event(decoder))
290 errcode = dfun->decode(decoder);
294 * Move beyond the packet and clear @decoder->next to
299 decoder->pos = decoder->config.end;
300 decoder->next = NULL;
308 static int pt_qry_start(struct pt_query_decoder *decoder, const uint8_t *pos,
314 if (!decoder || !pos)
317 pt_qry_reset(decoder);
319 decoder->sync = pos;
320 decoder->pos = pos;
322 errcode = pt_df_fetch(&decoder->next, pos, &decoder->config);
326 dfun = decoder->next;
333 errcode = dfun->decode(decoder);
339 * adjacent PSB+ that might change the decoder's IP, causing us
343 status = pt_last_ip_query(addr, &decoder->ip);
351 errcode = pt_qry_read_ahead(decoder);
355 /* We return the current decoder status. */
356 status = pt_qry_status_flags(decoder);
360 errcode = pt_last_ip_query(addr, &decoder->ip);
561 int pt_qry_sync_forward(struct pt_query_decoder *decoder, uint64_t *ip)
566 if (!decoder)
569 sync = decoder->sync;
570 pos = decoder->pos;
572 pos = decoder->config.begin;
577 errcode = pt_sync_forward(&sync, pos, &decoder->config);
581 return pt_qry_start(decoder, sync, ip);
584 int pt_qry_sync_backward(struct pt_query_decoder *decoder, uint64_t *ip)
589 if (!decoder)
592 start = decoder->pos;
594 start = decoder->config.end;
598 errcode = pt_sync_backward(&sync, sync, &decoder->config);
602 errcode = pt_qry_start(decoder, sync, ip);
618 if (decoder->pos != start)
625 int pt_qry_sync_set(struct pt_query_decoder *decoder, uint64_t *ip,
631 if (!decoder)
634 pos = decoder->config.begin + offset;
636 errcode = pt_sync_set(&sync, pos, &decoder->config);
640 return pt_qry_start(decoder, sync, ip);
643 int pt_qry_get_offset(const struct pt_query_decoder *decoder, uint64_t *offset)
647 if (!decoder || !offset)
650 begin = decoder->config.begin;
651 pos = decoder->pos;
660 int pt_qry_get_sync_offset(const struct pt_query_decoder *decoder,
665 if (!decoder || !offset)
668 begin = decoder->config.begin;
669 sync = decoder->sync;
679 pt_qry_get_config(const struct pt_query_decoder *decoder)
681 if (!decoder)
684 return &decoder->config;
687 static int pt_qry_cache_tnt(struct pt_query_decoder *decoder)
691 if (!decoder)
697 dfun = decoder->next;
699 return pt_qry_provoke_fetch_error(decoder);
705 if (pt_qry_will_event(decoder))
712 /* Clear the decoder's current event so we know when we
715 decoder->event = NULL;
717 /* Apply the decoder function. */
718 errcode = dfun->decode(decoder);
723 if (decoder->event)
731 errcode = pt_qry_read_ahead(decoder);
737 decoder->last_time = decoder->time;
740 errcode = pt_qry_read_ahead(decoder);
747 int pt_qry_cond_branch(struct pt_query_decoder *decoder, int *taken)
751 if (!decoder || !taken)
754 /* We cache the latest tnt packet in the decoder. Let's re-fill the
757 if (pt_tnt_cache_is_empty(&decoder->tnt)) {
758 errcode = pt_qry_cache_tnt(decoder);
763 query = pt_tnt_cache_query(&decoder->tnt);
769 return pt_qry_status_flags(decoder);
772 int pt_qry_indirect_branch(struct pt_query_decoder *decoder, uint64_t *addr)
776 if (!decoder || !addr)
783 dfun = decoder->next;
785 return pt_qry_provoke_fetch_error(decoder);
791 if (pt_qry_will_event(decoder))
794 /* Clear the decoder's current event so we know when we
797 decoder->event = NULL;
806 !pt_tnt_cache_is_empty(&decoder->tnt))
809 /* Apply the decoder function. */
810 errcode = dfun->decode(decoder);
815 if (decoder->event)
825 * is stored in the decoder's last ip.
827 errcode = pt_last_ip_query(&ip, &decoder->ip);
837 errcode = pt_qry_read_ahead(decoder);
843 decoder->last_time = decoder->time;
846 errcode = pt_qry_read_ahead(decoder);
850 flags |= pt_qry_status_flags(decoder);
855 int pt_qry_event(struct pt_query_decoder *decoder, struct pt_event *event,
860 if (!decoder || !event)
869 if (!pt_tnt_cache_is_empty(&decoder->tnt))
880 dfun = decoder->next;
882 return pt_qry_provoke_fetch_error(decoder);
895 !pt_qry_will_event(decoder))
898 /* Clear the decoder's current event so we know when decoding
901 decoder->event = NULL;
903 /* Apply any other decoder function. */
904 errcode = dfun->decode(decoder);
913 if (decoder->event) {
914 (void) memcpy(event, decoder->event, size);
919 errcode = pt_qry_read_ahead(decoder);
925 decoder->last_time = decoder->time;
928 errcode = pt_qry_read_ahead(decoder);
932 flags |= pt_qry_status_flags(decoder);
937 int pt_qry_time(struct pt_query_decoder *decoder, uint64_t *time,
940 if (!decoder || !time)
943 return pt_time_query_tsc(time, lost_mtc, lost_cyc, &decoder->last_time);
946 int pt_qry_core_bus_ratio(struct pt_query_decoder *decoder, uint32_t *cbr)
948 if (!decoder || !cbr)
951 return pt_time_query_cbr(cbr, &decoder->last_time);
955 const struct pt_query_decoder *decoder)
959 if (!event || !decoder)
963 &event->lost_cyc, &decoder->time);
973 int pt_qry_decode_unknown(struct pt_query_decoder *decoder)
978 if (!decoder)
981 size = pt_pkt_read_unknown(&packet, decoder->pos, &decoder->config);
985 decoder->pos += size;
989 int pt_qry_decode_pad(struct pt_query_decoder *decoder)
991 if (!decoder)
994 decoder->pos += ptps_pad;
999 static int pt_qry_read_psb_header(struct pt_query_decoder *decoder)
1001 if (!decoder)
1004 pt_last_ip_init(&decoder->ip);
1010 errcode = pt_df_fetch(&decoder->next, decoder->pos,
1011 &decoder->config);
1015 dfun = decoder->next;
1026 errcode = dfun->header(decoder);
1032 int pt_qry_decode_psb(struct pt_query_decoder *decoder)
1037 if (!decoder)
1040 pos = decoder->pos;
1042 size = pt_pkt_read_psb(pos, &decoder->config);
1046 decoder->pos += size;
1048 errcode = pt_qry_read_psb_header(decoder);
1053 decoder->pos = pos;
1056 (void) pt_evq_clear(&decoder->evq, evb_psbend);
1058 /* Reset the decoder's decode function. */
1059 decoder->next = &pt_decode_psb;
1073 const struct pt_query_decoder *decoder)
1077 if (!decoder)
1080 errcode = pt_last_ip_query(ip, &decoder->ip);
1102 static int pt_qry_decode_ip(struct pt_query_decoder *decoder)
1107 if (!decoder)
1110 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config);
1114 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config);
1118 /* We do not update the decoder's position, yet. */
1123 static int pt_qry_consume_tip(struct pt_query_decoder *decoder, int size)
1125 if (!decoder)
1128 decoder->pos += size;
1133 struct pt_query_decoder *decoder)
1135 if (!ev || !decoder)
1140 decoder->consume_packet = 1;
1143 decoder);
1147 decoder);
1151 decoder);
1155 decoder);
1164 int pt_qry_decode_tip(struct pt_query_decoder *decoder)
1169 if (!decoder)
1172 size = pt_qry_decode_ip(decoder);
1177 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1179 errcode = pt_qry_event_tip(ev, decoder);
1184 decoder->event = ev;
1187 if (pt_evq_pending(&decoder->evq, evb_tip))
1194 if (!decoder->consume_packet)
1200 decoder->consume_packet = 0;
1203 return pt_qry_consume_tip(decoder, size);
1206 int pt_qry_decode_tnt_8(struct pt_query_decoder *decoder)
1211 if (!decoder)
1214 size = pt_pkt_read_tnt_8(&packet, decoder->pos, &decoder->config);
1218 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet,
1219 &decoder->config);
1223 decoder->pos += size;
1227 int pt_qry_decode_tnt_64(struct pt_query_decoder *decoder)
1232 if (!decoder)
1235 size = pt_pkt_read_tnt_64(&packet, decoder->pos, &decoder->config);
1239 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet,
1240 &decoder->config);
1244 decoder->pos += size;
1248 static int pt_qry_consume_tip_pge(struct pt_query_decoder *decoder, int size)
1250 if (!decoder)
1253 decoder->pos += size;
1258 const struct pt_query_decoder *decoder)
1265 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder);
1274 int pt_qry_decode_tip_pge(struct pt_query_decoder *decoder)
1279 if (!decoder)
1282 size = pt_qry_decode_ip(decoder);
1290 * We use the consume packet decoder flag to indicate this.
1292 if (!decoder->consume_packet) {
1294 ev = pt_evq_standalone(&decoder->evq);
1302 &decoder->ip);
1306 errcode = pt_qry_event_time(ev, decoder);
1316 pt_tnt_cache_init(&decoder->tnt);
1319 decoder->consume_packet = 1;
1320 decoder->enabled = 1;
1323 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1325 errcode = pt_qry_event_tip_pge(ev, decoder);
1338 decoder->event = ev;
1341 if (pt_evq_pending(&decoder->evq, evb_tip))
1345 if (!decoder->consume_packet)
1348 decoder->consume_packet = 0;
1350 return pt_qry_consume_tip_pge(decoder, size);
1353 static int pt_qry_consume_tip_pgd(struct pt_query_decoder *decoder, int size)
1355 if (!decoder)
1358 decoder->enabled = 0;
1359 decoder->pos += size;
1364 const struct pt_query_decoder *decoder)
1380 decoder);
1412 int pt_qry_decode_tip_pgd(struct pt_query_decoder *decoder)
1417 if (!decoder)
1420 size = pt_qry_decode_ip(decoder);
1425 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1427 errcode = pt_qry_event_tip_pgd(ev, decoder);
1432 ev = pt_evq_standalone(&decoder->evq);
1438 decoder);
1442 errcode = pt_qry_event_time(ev, decoder);
1454 decoder->event = ev;
1457 if (pt_evq_pending(&decoder->evq, evb_tip))
1460 return pt_qry_consume_tip_pgd(decoder, size);
1463 static int pt_qry_consume_fup(struct pt_query_decoder *decoder, int size)
1465 if (!decoder)
1468 decoder->pos += size;
1472 static int scan_for_erratum_bdm70(struct pt_packet_decoder *decoder)
1478 errcode = pt_pkt_next(decoder, &packet, sizeof(packet));
1520 struct pt_packet_decoder decoder;
1526 errcode = pt_pkt_decoder_init(&decoder, config);
1530 errcode = pt_pkt_sync_set(&decoder, (uint64_t) (pos - config->begin));
1532 errcode = scan_for_erratum_bdm70(&decoder);
1534 pt_pkt_decoder_fini(&decoder);
1538 int pt_qry_header_fup(struct pt_query_decoder *decoder)
1543 if (!decoder)
1546 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config);
1550 if (decoder->config.errata.bdm70 && !decoder->enabled) {
1551 errcode = check_erratum_bdm70(decoder->pos + size,
1552 &decoder->config);
1557 return pt_qry_consume_fup(decoder, size);
1560 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config);
1566 decoder->enabled = 1;
1568 return pt_qry_consume_fup(decoder, size);
1572 struct pt_query_decoder *decoder)
1574 if (!ev || !decoder)
1579 decoder->consume_packet = 1;
1583 &decoder->ip);
1587 decoder->consume_packet = 1;
1589 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder);
1592 decoder->consume_packet = 1;
1594 return pt_qry_event_ip(&ev->variant.exstop.ip, ev, decoder);
1597 decoder->consume_packet = 1;
1599 return pt_qry_event_ip(&ev->variant.mwait.ip, ev, decoder);
1602 decoder->consume_packet = 1;
1604 return pt_qry_event_ip(&ev->variant.ptwrite.ip, ev, decoder);
1613 int pt_qry_decode_fup(struct pt_query_decoder *decoder)
1618 if (!decoder)
1621 size = pt_qry_decode_ip(decoder);
1626 ev = pt_evq_dequeue(&decoder->evq, evb_fup);
1628 errcode = pt_qry_event_fup(ev, decoder);
1633 decoder->event = ev;
1636 if (pt_evq_pending(&decoder->evq, evb_fup))
1643 if (!decoder->consume_packet)
1649 decoder->consume_packet = 0;
1657 errcode = pt_last_ip_query(&ip, &decoder->ip);
1661 ev = pt_evq_enqueue(&decoder->evq, evb_tip);
1668 errcode = pt_qry_event_time(ev, decoder);
1673 return pt_qry_consume_fup(decoder, size);
1676 int pt_qry_decode_pip(struct pt_query_decoder *decoder)
1682 if (!decoder)
1685 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config);
1692 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch);
1694 event = pt_evq_standalone(&decoder->evq);
1701 decoder->event = event;
1703 event = pt_evq_enqueue(&decoder->evq, evb_tip);
1712 errcode = pt_qry_event_time(event, decoder);
1716 decoder->pos += size;
1720 int pt_qry_header_pip(struct pt_query_decoder *decoder)
1726 if (!decoder)
1729 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config);
1734 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
1742 decoder->pos += size;
1747 struct pt_query_decoder *decoder)
1751 if (!ev || !decoder)
1757 errcode = pt_qry_event_time(ev, decoder);
1764 decoder);
1767 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder);
1770 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder);
1774 decoder);
1793 static int pt_qry_process_pending_psb_events(struct pt_query_decoder *decoder)
1798 if (!decoder)
1801 ev = pt_evq_dequeue(&decoder->evq, evb_psbend);
1805 errcode = pt_qry_event_psbend(ev, decoder);
1810 decoder->event = ev;
1818 * Creates and published the event and disables tracing in @decoder.
1822 static int pt_qry_event_ovf_disabled(struct pt_query_decoder *decoder)
1826 if (!decoder)
1829 ev = pt_evq_standalone(&decoder->evq);
1841 decoder->enabled = 0;
1842 decoder->event = ev;
1844 return pt_qry_event_time(ev, decoder);
1849 * Creates and enqueues the event and enables tracing in @decoder.
1853 static int pt_qry_event_ovf_enabled(struct pt_query_decoder *decoder)
1857 if (!decoder)
1860 ev = pt_evq_enqueue(&decoder->evq, evb_fup);
1866 decoder->enabled = 1;
1868 return pt_qry_event_time(ev, decoder);
1875 * Further updates @decoder as follows:
1884 static int skd010_recover(struct pt_query_decoder *decoder,
1893 if (!decoder || !packet || !tcal || !time)
1896 /* We use the decoder's IP. It should be newly initialized. */
1897 ip = decoder->ip;
1900 errcode = pt_last_ip_update_ip(&ip, packet, &decoder->config);
1905 ev = pt_evq_standalone(&decoder->evq);
1917 decoder->pos = decoder->config.begin + offset;
1920 decoder->enabled = 1;
1921 decoder->ip = ip;
1923 decoder->time = *time;
1924 decoder->tcal = *tcal;
1927 decoder->event = ev;
1929 return pt_qry_event_time(ev, decoder);
1936 * Further updates @decoder as follows:
1944 static int skd010_recover_disabled(struct pt_query_decoder *decoder,
1948 if (!decoder || !tcal || !time)
1951 decoder->time = *time;
1952 decoder->tcal = *tcal;
1955 decoder->pos = decoder->config.begin + offset;
1957 return pt_qry_event_ovf_disabled(decoder);
1984 struct pt_query_decoder *decoder)
1995 if (!decoder)
1999 time = decoder->time;
2000 tcal = decoder->tcal;
2035 return skd010_recover_disabled(decoder, &tcal, &time,
2124 return skd010_recover(decoder,
2134 return skd010_recover(decoder, &packet.payload.ip,
2141 return skd010_recover(decoder, &packet.payload.ip,
2173 return skd010_recover(decoder, &packet.payload.ip,
2225 &decoder->config);
2235 &decoder->config);
2245 &decoder->config);
2255 &decoder->config);
2265 &decoder->config);
2274 static int pt_qry_handle_skd010(struct pt_query_decoder *decoder)
2280 if (!decoder)
2283 errcode = pt_qry_get_offset(decoder, &offset);
2287 errcode = pt_pkt_decoder_init(&pkt, &decoder->config);
2293 errcode = skd010_scan_for_ovf_resume(&pkt, decoder);
2305 static int apl12_tracing_is_disabled(struct pt_packet_decoder *decoder)
2307 if (!decoder)
2314 status = pt_pkt_next(decoder, &packet, sizeof(packet));
2349 status = pt_qry_find_header_fup(&packet, decoder);
2375 * We resume from @offset (relative to @decoder->pos) with tracing disabled. On
2382 static int apl12_resume_disabled(struct pt_query_decoder *decoder,
2389 if (!decoder)
2392 errcode = pt_qry_get_offset(decoder, &begin);
2450 errcode = pt_qry_apply_tsc(&decoder->time,
2451 &decoder->tcal,
2453 &decoder->config);
2461 errcode = pt_qry_apply_cbr(&decoder->time,
2462 &decoder->tcal,
2464 &decoder->config);
2472 errcode = pt_qry_apply_tma(&decoder->time,
2473 &decoder->tcal,
2475 &decoder->config);
2483 errcode = pt_qry_apply_mtc(&decoder->time,
2484 &decoder->tcal,
2486 &decoder->config);
2494 errcode = pt_qry_apply_cyc(&decoder->time,
2495 &decoder->tcal,
2497 &decoder->config);
2505 decoder->pos += offset;
2507 return pt_qry_event_ovf_disabled(decoder);
2513 * argument gives the relative offset from @decoder->pos to after the FUP.
2522 * This will drop any CBR or MTC events. We will update @decoder's timing state
2529 static int pt_qry_handle_apl12(struct pt_query_decoder *decoder,
2536 if (!decoder)
2539 status = pt_qry_get_offset(decoder, &here);
2543 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2551 status = apl12_resume_disabled(decoder, &pkt, offset);
2573 static int apl11_apply(struct pt_query_decoder *decoder,
2579 if (!decoder)
2582 time = decoder->time;
2583 tcal = decoder->tcal;
2604 decoder->time = time;
2605 decoder->tcal = tcal;
2606 decoder->pos = decoder->config.begin + offset;
2608 return pt_qry_event_ovf_disabled(decoder);
2647 &decoder->config);
2657 &decoder->config);
2667 &decoder->config);
2677 &decoder->config);
2687 &decoder->config);
2704 * This will drop any CBR or MTC events. We will update @decoder's timing state
2711 static int pt_qry_handle_apl11(struct pt_query_decoder *decoder)
2717 if (!decoder)
2720 status = pt_qry_get_offset(decoder, &offset);
2724 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2730 status = apl11_apply(decoder, &pkt);
2736 static int pt_pkt_find_ovf_fup(struct pt_packet_decoder *decoder)
2742 errcode = pt_pkt_next(decoder, &packet, sizeof(packet));
2796 static int pt_qry_find_ovf_fup(const struct pt_query_decoder *decoder)
2802 if (!decoder)
2805 status = pt_qry_get_offset(decoder, &begin);
2809 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2836 int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
2841 if (!decoder)
2844 status = pt_qry_process_pending_psb_events(decoder);
2852 /* Reset the decoder state but preserve timing. */
2853 time = decoder->time;
2854 pt_qry_reset(decoder);
2855 decoder->time = time;
2858 decoder->pos += ptps_ovf;
2873 offset = pt_qry_find_ovf_fup(decoder);
2881 if (decoder->config.errata.skd010) {
2882 status = pt_qry_handle_skd010(decoder);
2892 if (decoder->config.errata.apl11 &&
2894 status = pt_qry_handle_apl11(decoder);
2907 return pt_qry_event_ovf_disabled(decoder);
2914 if (decoder->config.errata.apl12) {
2915 status = pt_qry_handle_apl12(decoder,
2921 return pt_qry_event_ovf_enabled(decoder);
2925 static int pt_qry_decode_mode_exec(struct pt_query_decoder *decoder,
2930 if (!decoder || !packet)
2934 event = pt_evq_enqueue(&decoder->evq, evb_tip);
2941 return pt_qry_event_time(event, decoder);
2944 static int pt_qry_decode_mode_tsx(struct pt_query_decoder *decoder,
2949 if (!decoder || !packet)
2953 if (!decoder->enabled) {
2954 event = pt_evq_standalone(&decoder->evq);
2963 decoder->event = event;
2966 event = pt_evq_enqueue(&decoder->evq, evb_fup);
2975 return pt_qry_event_time(event, decoder);
2978 int pt_qry_decode_mode(struct pt_query_decoder *decoder)
2983 if (!decoder)
2986 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config);
2993 errcode = pt_qry_decode_mode_exec(decoder, &packet.bits.exec);
2997 errcode = pt_qry_decode_mode_tsx(decoder, &packet.bits.tsx);
3004 decoder->pos += size;
3008 int pt_qry_header_mode(struct pt_query_decoder *decoder)
3014 if (!decoder)
3017 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config);
3022 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3040 decoder->pos += size;
3044 int pt_qry_decode_psbend(struct pt_query_decoder *decoder)
3048 if (!decoder)
3051 status = pt_qry_process_pending_psb_events(decoder);
3062 decoder->pos += ptps_psbend;
3066 int pt_qry_decode_tsc(struct pt_query_decoder *decoder)
3071 if (!decoder)
3074 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config);
3078 errcode = pt_qry_apply_tsc(&decoder->time, &decoder->tcal,
3079 &packet, &decoder->config);
3083 decoder->pos += size;
3087 int pt_qry_header_tsc(struct pt_query_decoder *decoder)
3092 if (!decoder)
3095 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config);
3099 errcode = pt_qry_apply_header_tsc(&decoder->time, &decoder->tcal,
3100 &packet, &decoder->config);
3104 decoder->pos += size;
3108 int pt_qry_decode_cbr(struct pt_query_decoder *decoder)
3114 if (!decoder)
3117 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config);
3121 errcode = pt_qry_apply_cbr(&decoder->time, &decoder->tcal,
3122 &packet, &decoder->config);
3126 event = pt_evq_standalone(&decoder->evq);
3133 decoder->event = event;
3135 errcode = pt_qry_event_time(event, decoder);
3139 decoder->pos += size;
3143 int pt_qry_header_cbr(struct pt_query_decoder *decoder)
3149 if (!decoder)
3152 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config);
3156 errcode = pt_qry_apply_header_cbr(&decoder->time, &decoder->tcal,
3157 &packet, &decoder->config);
3161 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3168 decoder->pos += size;
3172 int pt_qry_decode_tma(struct pt_query_decoder *decoder)
3177 if (!decoder)
3180 size = pt_pkt_read_tma(&packet, decoder->pos, &decoder->config);
3184 errcode = pt_qry_apply_tma(&decoder->time, &decoder->tcal,
3185 &packet, &decoder->config);
3189 decoder->pos += size;
3193 int pt_qry_decode_mtc(struct pt_query_decoder *decoder)
3198 if (!decoder)
3201 size = pt_pkt_read_mtc(&packet, decoder->pos, &decoder->config);
3205 errcode = pt_qry_apply_mtc(&decoder->time, &decoder->tcal,
3206 &packet, &decoder->config);
3210 decoder->pos += size;
3214 static int check_erratum_skd007(struct pt_query_decoder *decoder,
3220 if (!decoder || !packet || size < 0)
3234 pos = decoder->pos + size;
3235 if (decoder->config.end <= pos)
3251 int pt_qry_decode_cyc(struct pt_query_decoder *decoder)
3257 if (!decoder)
3260 config = &decoder->config;
3262 size = pt_pkt_read_cyc(&packet, decoder->pos, config);
3267 errcode = check_erratum_skd007(decoder, &packet, size);
3278 decoder->pos += 1;
3283 errcode = pt_qry_apply_cyc(&decoder->time, &decoder->tcal,
3288 decoder->pos += size;
3292 int pt_qry_decode_stop(struct pt_query_decoder *decoder)
3297 if (!decoder)
3301 event = pt_evq_standalone(&decoder->evq);
3307 decoder->event = event;
3309 errcode = pt_qry_event_time(event, decoder);
3313 decoder->pos += ptps_stop;
3317 int pt_qry_header_vmcs(struct pt_query_decoder *decoder)
3323 if (!decoder)
3326 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config);
3330 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3337 decoder->pos += size;
3341 int pt_qry_decode_vmcs(struct pt_query_decoder *decoder)
3347 if (!decoder)
3350 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config);
3359 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_paging);
3363 paging = pt_evq_enqueue(&decoder->evq, evb_tip);
3372 decoder->pos += size;
3379 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch);
3381 event = pt_evq_enqueue(&decoder->evq, evb_tip);
3388 decoder->pos += size;
3395 event = pt_evq_standalone(&decoder->evq);
3402 decoder->event = event;
3404 errcode = pt_qry_event_time(event, decoder);
3408 decoder->pos += size;
3412 int pt_qry_decode_mnt(struct pt_query_decoder *decoder)
3418 if (!decoder)
3421 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config);
3425 event = pt_evq_standalone(&decoder->evq);
3432 decoder->event = event;
3434 errcode = pt_qry_event_time(event, decoder);
3438 decoder->pos += size;
3443 int pt_qry_header_mnt(struct pt_query_decoder *decoder)
3449 if (!decoder)
3452 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config);
3456 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3463 decoder->pos += size;
3468 int pt_qry_decode_exstop(struct pt_query_decoder *decoder)
3474 if (!decoder)
3477 size = pt_pkt_read_exstop(&packet, decoder->pos, &decoder->config);
3482 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3488 event = pt_evq_standalone(&decoder->evq);
3497 decoder->event = event;
3500 decoder->pos += size;
3504 int pt_qry_decode_mwait(struct pt_query_decoder *decoder)
3510 if (!decoder)
3513 size = pt_pkt_read_mwait(&packet, decoder->pos, &decoder->config);
3517 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3525 decoder->pos += size;
3529 int pt_qry_decode_pwre(struct pt_query_decoder *decoder)
3535 if (!decoder)
3538 size = pt_pkt_read_pwre(&packet, decoder->pos, &decoder->config);
3542 event = pt_evq_standalone(&decoder->evq);
3553 decoder->event = event;
3555 decoder->pos += size;
3559 int pt_qry_decode_pwrx(struct pt_query_decoder *decoder)
3565 if (!decoder)
3568 size = pt_pkt_read_pwrx(&packet, decoder->pos, &decoder->config);
3572 event = pt_evq_standalone(&decoder->evq);
3587 decoder->event = event;
3589 decoder->pos += size;
3593 int pt_qry_decode_ptw(struct pt_query_decoder *decoder)
3599 if (!decoder)
3602 size = pt_pkt_read_ptw(&packet, decoder->pos, &decoder->config);
3611 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3615 event = pt_evq_standalone(&decoder->evq);
3621 decoder->event = event;
3628 decoder->pos += size;