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

Lines Matching defs: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)
567 if (!decoder)
570 begin = decoder->config.begin;
571 sync = decoder->sync;
572 pos = decoder->pos;
591 errcode = pt_sync_forward(&sync, pos, &decoder->config);
595 return pt_qry_start(decoder, sync, ip);
598 int pt_qry_sync_backward(struct pt_query_decoder *decoder, uint64_t *ip)
603 if (!decoder)
606 start = decoder->pos;
608 start = decoder->config.end;
612 errcode = pt_sync_backward(&sync, sync, &decoder->config);
616 errcode = pt_qry_start(decoder, sync, ip);
632 if (decoder->pos != start)
639 int pt_qry_sync_set(struct pt_query_decoder *decoder, uint64_t *ip,
645 if (!decoder)
648 pos = decoder->config.begin + offset;
650 errcode = pt_sync_set(&sync, pos, &decoder->config);
654 return pt_qry_start(decoder, sync, ip);
657 int pt_qry_get_offset(const struct pt_query_decoder *decoder, uint64_t *offset)
661 if (!decoder || !offset)
664 begin = decoder->config.begin;
665 pos = decoder->pos;
674 int pt_qry_get_sync_offset(const struct pt_query_decoder *decoder,
679 if (!decoder || !offset)
682 begin = decoder->config.begin;
683 sync = decoder->sync;
693 pt_qry_get_config(const struct pt_query_decoder *decoder)
695 if (!decoder)
698 return &decoder->config;
701 static int pt_qry_cache_tnt(struct pt_query_decoder *decoder)
705 if (!decoder)
711 dfun = decoder->next;
713 return pt_qry_provoke_fetch_error(decoder);
719 if (pt_qry_will_event(decoder))
726 /* Clear the decoder's current event so we know when we
729 decoder->event = NULL;
731 /* Apply the decoder function. */
732 errcode = dfun->decode(decoder);
737 if (decoder->event)
745 errcode = pt_qry_read_ahead(decoder);
751 decoder->last_time = decoder->time;
754 errcode = pt_qry_read_ahead(decoder);
761 int pt_qry_cond_branch(struct pt_query_decoder *decoder, int *taken)
765 if (!decoder || !taken)
768 /* We cache the latest tnt packet in the decoder. Let's re-fill the
771 if (pt_tnt_cache_is_empty(&decoder->tnt)) {
772 errcode = pt_qry_cache_tnt(decoder);
777 query = pt_tnt_cache_query(&decoder->tnt);
783 return pt_qry_status_flags(decoder);
786 int pt_qry_indirect_branch(struct pt_query_decoder *decoder, uint64_t *addr)
790 if (!decoder || !addr)
797 dfun = decoder->next;
799 return pt_qry_provoke_fetch_error(decoder);
805 if (pt_qry_will_event(decoder))
808 /* Clear the decoder's current event so we know when we
811 decoder->event = NULL;
820 !pt_tnt_cache_is_empty(&decoder->tnt))
823 /* Apply the decoder function. */
824 errcode = dfun->decode(decoder);
829 if (decoder->event)
839 * is stored in the decoder's last ip.
841 errcode = pt_last_ip_query(&ip, &decoder->ip);
851 errcode = pt_qry_read_ahead(decoder);
857 decoder->last_time = decoder->time;
860 errcode = pt_qry_read_ahead(decoder);
864 flags |= pt_qry_status_flags(decoder);
869 int pt_qry_event(struct pt_query_decoder *decoder, struct pt_event *event,
874 if (!decoder || !event)
883 if (!pt_tnt_cache_is_empty(&decoder->tnt))
894 dfun = decoder->next;
896 return pt_qry_provoke_fetch_error(decoder);
909 !pt_qry_will_event(decoder))
912 /* Clear the decoder's current event so we know when decoding
915 decoder->event = NULL;
917 /* Apply any other decoder function. */
918 errcode = dfun->decode(decoder);
927 if (decoder->event) {
928 (void) memcpy(event, decoder->event, size);
933 errcode = pt_qry_read_ahead(decoder);
939 decoder->last_time = decoder->time;
942 errcode = pt_qry_read_ahead(decoder);
946 flags |= pt_qry_status_flags(decoder);
951 int pt_qry_time(struct pt_query_decoder *decoder, uint64_t *time,
954 if (!decoder || !time)
957 return pt_time_query_tsc(time, lost_mtc, lost_cyc, &decoder->last_time);
960 int pt_qry_core_bus_ratio(struct pt_query_decoder *decoder, uint32_t *cbr)
962 if (!decoder || !cbr)
965 return pt_time_query_cbr(cbr, &decoder->last_time);
969 const struct pt_query_decoder *decoder)
973 if (!event || !decoder)
977 &event->lost_cyc, &decoder->time);
987 int pt_qry_decode_unknown(struct pt_query_decoder *decoder)
992 if (!decoder)
995 size = pt_pkt_read_unknown(&packet, decoder->pos, &decoder->config);
999 decoder->pos += size;
1003 int pt_qry_decode_pad(struct pt_query_decoder *decoder)
1005 if (!decoder)
1008 decoder->pos += ptps_pad;
1013 static int pt_qry_read_psb_header(struct pt_query_decoder *decoder)
1015 if (!decoder)
1018 pt_last_ip_init(&decoder->ip);
1024 errcode = pt_df_fetch(&decoder->next, decoder->pos,
1025 &decoder->config);
1029 dfun = decoder->next;
1040 errcode = dfun->header(decoder);
1046 int pt_qry_decode_psb(struct pt_query_decoder *decoder)
1051 if (!decoder)
1054 pos = decoder->pos;
1056 size = pt_pkt_read_psb(pos, &decoder->config);
1060 errcode = pt_tcal_update_psb(&decoder->tcal, &decoder->config);
1064 decoder->pos += size;
1066 errcode = pt_qry_read_psb_header(decoder);
1071 decoder->pos = pos;
1074 (void) pt_evq_clear(&decoder->evq, evb_psbend);
1076 /* Reset the decoder's decode function. */
1077 decoder->next = &pt_decode_psb;
1091 const struct pt_query_decoder *decoder)
1095 if (!decoder)
1098 errcode = pt_last_ip_query(ip, &decoder->ip);
1120 static int pt_qry_decode_ip(struct pt_query_decoder *decoder)
1125 if (!decoder)
1128 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config);
1132 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config);
1136 /* We do not update the decoder's position, yet. */
1141 static int pt_qry_consume_tip(struct pt_query_decoder *decoder, int size)
1143 if (!decoder)
1146 decoder->pos += size;
1151 struct pt_query_decoder *decoder)
1153 if (!ev || !decoder)
1158 decoder->consume_packet = 1;
1161 decoder);
1165 decoder);
1169 decoder);
1173 decoder);
1182 int pt_qry_decode_tip(struct pt_query_decoder *decoder)
1187 if (!decoder)
1190 size = pt_qry_decode_ip(decoder);
1195 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1197 errcode = pt_qry_event_tip(ev, decoder);
1202 decoder->event = ev;
1205 if (pt_evq_pending(&decoder->evq, evb_tip))
1212 if (!decoder->consume_packet)
1218 decoder->consume_packet = 0;
1221 return pt_qry_consume_tip(decoder, size);
1224 int pt_qry_decode_tnt_8(struct pt_query_decoder *decoder)
1229 if (!decoder)
1232 size = pt_pkt_read_tnt_8(&packet, decoder->pos, &decoder->config);
1236 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet,
1237 &decoder->config);
1241 decoder->pos += size;
1245 int pt_qry_decode_tnt_64(struct pt_query_decoder *decoder)
1250 if (!decoder)
1253 size = pt_pkt_read_tnt_64(&packet, decoder->pos, &decoder->config);
1257 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet,
1258 &decoder->config);
1262 decoder->pos += size;
1266 static int pt_qry_consume_tip_pge(struct pt_query_decoder *decoder, int size)
1268 if (!decoder)
1271 decoder->pos += size;
1276 const struct pt_query_decoder *decoder)
1283 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder);
1292 int pt_qry_decode_tip_pge(struct pt_query_decoder *decoder)
1297 if (!decoder)
1300 size = pt_qry_decode_ip(decoder);
1308 * We use the consume packet decoder flag to indicate this.
1310 if (!decoder->consume_packet) {
1312 ev = pt_evq_standalone(&decoder->evq);
1320 &decoder->ip);
1324 errcode = pt_qry_event_time(ev, decoder);
1334 pt_tnt_cache_init(&decoder->tnt);
1337 decoder->consume_packet = 1;
1338 decoder->enabled = 1;
1341 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1343 errcode = pt_qry_event_tip_pge(ev, decoder);
1356 decoder->event = ev;
1359 if (pt_evq_pending(&decoder->evq, evb_tip))
1363 if (!decoder->consume_packet)
1366 decoder->consume_packet = 0;
1368 return pt_qry_consume_tip_pge(decoder, size);
1371 static int pt_qry_consume_tip_pgd(struct pt_query_decoder *decoder, int size)
1373 if (!decoder)
1376 decoder->enabled = 0;
1377 decoder->pos += size;
1382 const struct pt_query_decoder *decoder)
1398 decoder);
1430 int pt_qry_decode_tip_pgd(struct pt_query_decoder *decoder)
1435 if (!decoder)
1438 size = pt_qry_decode_ip(decoder);
1443 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1445 errcode = pt_qry_event_tip_pgd(ev, decoder);
1450 ev = pt_evq_standalone(&decoder->evq);
1456 decoder);
1460 errcode = pt_qry_event_time(ev, decoder);
1472 decoder->event = ev;
1475 if (pt_evq_pending(&decoder->evq, evb_tip))
1478 return pt_qry_consume_tip_pgd(decoder, size);
1481 static int pt_qry_consume_fup(struct pt_query_decoder *decoder, int size)
1483 if (!decoder)
1486 decoder->pos += size;
1490 static int scan_for_erratum_bdm70(struct pt_packet_decoder *decoder)
1496 errcode = pt_pkt_next(decoder, &packet, sizeof(packet));
1538 struct pt_packet_decoder decoder;
1544 errcode = pt_pkt_decoder_init(&decoder, config);
1548 errcode = pt_pkt_sync_set(&decoder, (uint64_t) (pos - config->begin));
1550 errcode = scan_for_erratum_bdm70(&decoder);
1552 pt_pkt_decoder_fini(&decoder);
1556 int pt_qry_header_fup(struct pt_query_decoder *decoder)
1561 if (!decoder)
1564 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config);
1568 if (decoder->config.errata.bdm70 && !decoder->enabled) {
1569 errcode = check_erratum_bdm70(decoder->pos + size,
1570 &decoder->config);
1575 return pt_qry_consume_fup(decoder, size);
1578 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config);
1584 decoder->enabled = 1;
1586 return pt_qry_consume_fup(decoder, size);
1590 struct pt_query_decoder *decoder)
1592 if (!ev || !decoder)
1597 decoder->consume_packet = 1;
1601 &decoder->ip);
1605 decoder->consume_packet = 1;
1607 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder);
1610 decoder->consume_packet = 1;
1612 return pt_qry_event_ip(&ev->variant.exstop.ip, ev, decoder);
1615 decoder->consume_packet = 1;
1617 return pt_qry_event_ip(&ev->variant.mwait.ip, ev, decoder);
1620 decoder->consume_packet = 1;
1622 return pt_qry_event_ip(&ev->variant.ptwrite.ip, ev, decoder);
1631 int pt_qry_decode_fup(struct pt_query_decoder *decoder)
1636 if (!decoder)
1639 size = pt_qry_decode_ip(decoder);
1644 ev = pt_evq_dequeue(&decoder->evq, evb_fup);
1646 errcode = pt_qry_event_fup(ev, decoder);
1651 decoder->event = ev;
1654 if (pt_evq_pending(&decoder->evq, evb_fup))
1661 if (!decoder->consume_packet)
1667 decoder->consume_packet = 0;
1675 errcode = pt_last_ip_query(&ip, &decoder->ip);
1679 ev = pt_evq_enqueue(&decoder->evq, evb_tip);
1686 errcode = pt_qry_event_time(ev, decoder);
1691 return pt_qry_consume_fup(decoder, size);
1694 int pt_qry_decode_pip(struct pt_query_decoder *decoder)
1700 if (!decoder)
1703 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config);
1710 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch);
1712 event = pt_evq_standalone(&decoder->evq);
1719 decoder->event = event;
1721 event = pt_evq_enqueue(&decoder->evq, evb_tip);
1730 errcode = pt_qry_event_time(event, decoder);
1734 decoder->pos += size;
1738 int pt_qry_header_pip(struct pt_query_decoder *decoder)
1744 if (!decoder)
1747 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config);
1752 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
1760 decoder->pos += size;
1765 struct pt_query_decoder *decoder)
1769 if (!ev || !decoder)
1775 errcode = pt_qry_event_time(ev, decoder);
1782 decoder);
1785 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder);
1788 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder);
1792 decoder);
1811 static int pt_qry_process_pending_psb_events(struct pt_query_decoder *decoder)
1816 if (!decoder)
1819 ev = pt_evq_dequeue(&decoder->evq, evb_psbend);
1823 errcode = pt_qry_event_psbend(ev, decoder);
1828 decoder->event = ev;
1836 * Creates and published the event and disables tracing in @decoder.
1840 static int pt_qry_event_ovf_disabled(struct pt_query_decoder *decoder)
1844 if (!decoder)
1847 ev = pt_evq_standalone(&decoder->evq);
1859 decoder->enabled = 0;
1860 decoder->event = ev;
1862 return pt_qry_event_time(ev, decoder);
1867 * Creates and enqueues the event and enables tracing in @decoder.
1871 static int pt_qry_event_ovf_enabled(struct pt_query_decoder *decoder)
1875 if (!decoder)
1878 ev = pt_evq_enqueue(&decoder->evq, evb_fup);
1884 decoder->enabled = 1;
1886 return pt_qry_event_time(ev, decoder);
1893 * Further updates @decoder as follows:
1902 static int skd010_recover(struct pt_query_decoder *decoder,
1911 if (!decoder || !packet || !tcal || !time)
1914 /* We use the decoder's IP. It should be newly initialized. */
1915 ip = decoder->ip;
1918 errcode = pt_last_ip_update_ip(&ip, packet, &decoder->config);
1923 ev = pt_evq_standalone(&decoder->evq);
1935 decoder->pos = decoder->config.begin + offset;
1938 decoder->enabled = 1;
1939 decoder->ip = ip;
1941 decoder->time = *time;
1942 decoder->tcal = *tcal;
1945 decoder->event = ev;
1947 return pt_qry_event_time(ev, decoder);
1954 * Further updates @decoder as follows:
1962 static int skd010_recover_disabled(struct pt_query_decoder *decoder,
1966 if (!decoder || !tcal || !time)
1969 decoder->time = *time;
1970 decoder->tcal = *tcal;
1973 decoder->pos = decoder->config.begin + offset;
1975 return pt_qry_event_ovf_disabled(decoder);
2002 struct pt_query_decoder *decoder)
2013 if (!decoder)
2017 time = decoder->time;
2018 tcal = decoder->tcal;
2053 return skd010_recover_disabled(decoder, &tcal, &time,
2142 return skd010_recover(decoder,
2152 return skd010_recover(decoder, &packet.payload.ip,
2159 return skd010_recover(decoder, &packet.payload.ip,
2191 return skd010_recover(decoder, &packet.payload.ip,
2243 &decoder->config);
2253 &decoder->config);
2263 &decoder->config);
2273 &decoder->config);
2283 &decoder->config);
2292 static int pt_qry_handle_skd010(struct pt_query_decoder *decoder)
2298 if (!decoder)
2301 errcode = pt_qry_get_offset(decoder, &offset);
2305 errcode = pt_pkt_decoder_init(&pkt, &decoder->config);
2311 errcode = skd010_scan_for_ovf_resume(&pkt, decoder);
2323 static int apl12_tracing_is_disabled(struct pt_packet_decoder *decoder)
2325 if (!decoder)
2332 status = pt_pkt_next(decoder, &packet, sizeof(packet));
2367 status = pt_qry_find_header_fup(&packet, decoder);
2393 * We resume from @offset (relative to @decoder->pos) with tracing disabled. On
2400 static int apl12_resume_disabled(struct pt_query_decoder *decoder,
2407 if (!decoder)
2410 errcode = pt_qry_get_offset(decoder, &begin);
2468 errcode = pt_qry_apply_tsc(&decoder->time,
2469 &decoder->tcal,
2471 &decoder->config);
2479 errcode = pt_qry_apply_cbr(&decoder->time,
2480 &decoder->tcal,
2482 &decoder->config);
2490 errcode = pt_qry_apply_tma(&decoder->time,
2491 &decoder->tcal,
2493 &decoder->config);
2501 errcode = pt_qry_apply_mtc(&decoder->time,
2502 &decoder->tcal,
2504 &decoder->config);
2512 errcode = pt_qry_apply_cyc(&decoder->time,
2513 &decoder->tcal,
2515 &decoder->config);
2523 decoder->pos += offset;
2525 return pt_qry_event_ovf_disabled(decoder);
2531 * argument gives the relative offset from @decoder->pos to after the FUP.
2540 * This will drop any CBR or MTC events. We will update @decoder's timing state
2547 static int pt_qry_handle_apl12(struct pt_query_decoder *decoder,
2554 if (!decoder)
2557 status = pt_qry_get_offset(decoder, &here);
2561 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2569 status = apl12_resume_disabled(decoder, &pkt, offset);
2591 static int apl11_apply(struct pt_query_decoder *decoder,
2597 if (!decoder)
2600 time = decoder->time;
2601 tcal = decoder->tcal;
2622 decoder->time = time;
2623 decoder->tcal = tcal;
2624 decoder->pos = decoder->config.begin + offset;
2626 return pt_qry_event_ovf_disabled(decoder);
2665 &decoder->config);
2675 &decoder->config);
2685 &decoder->config);
2695 &decoder->config);
2705 &decoder->config);
2722 * This will drop any CBR or MTC events. We will update @decoder's timing state
2729 static int pt_qry_handle_apl11(struct pt_query_decoder *decoder)
2735 if (!decoder)
2738 status = pt_qry_get_offset(decoder, &offset);
2742 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2748 status = apl11_apply(decoder, &pkt);
2754 static int pt_pkt_find_ovf_fup(struct pt_packet_decoder *decoder)
2760 errcode = pt_pkt_next(decoder, &packet, sizeof(packet));
2814 static int pt_qry_find_ovf_fup(const struct pt_query_decoder *decoder)
2820 if (!decoder)
2823 status = pt_qry_get_offset(decoder, &begin);
2827 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2854 int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
2860 if (!decoder)
2863 status = pt_qry_process_pending_psb_events(decoder);
2871 /* Reset the decoder state but preserve timing. */
2872 time = decoder->time;
2873 tcal = decoder->tcal;
2875 pt_qry_reset(decoder);
2877 decoder->time = time;
2878 if (decoder->config.flags.variant.query.keep_tcal_on_ovf) {
2879 status = pt_tcal_update_ovf(&tcal, &decoder->config);
2883 decoder->tcal = tcal;
2887 decoder->pos += ptps_ovf;
2902 offset = pt_qry_find_ovf_fup(decoder);
2910 if (decoder->config.errata.skd010) {
2911 status = pt_qry_handle_skd010(decoder);
2921 if (decoder->config.errata.apl11 &&
2923 status = pt_qry_handle_apl11(decoder);
2936 return pt_qry_event_ovf_disabled(decoder);
2943 if (decoder->config.errata.apl12) {
2944 status = pt_qry_handle_apl12(decoder,
2950 return pt_qry_event_ovf_enabled(decoder);
2954 static int pt_qry_decode_mode_exec(struct pt_query_decoder *decoder,
2959 if (!decoder || !packet)
2963 event = pt_evq_enqueue(&decoder->evq, evb_tip);
2970 return pt_qry_event_time(event, decoder);
2973 static int pt_qry_decode_mode_tsx(struct pt_query_decoder *decoder,
2978 if (!decoder || !packet)
2982 if (!decoder->enabled) {
2983 event = pt_evq_standalone(&decoder->evq);
2992 decoder->event = event;
2995 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3004 return pt_qry_event_time(event, decoder);
3007 int pt_qry_decode_mode(struct pt_query_decoder *decoder)
3012 if (!decoder)
3015 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config);
3022 errcode = pt_qry_decode_mode_exec(decoder, &packet.bits.exec);
3026 errcode = pt_qry_decode_mode_tsx(decoder, &packet.bits.tsx);
3033 decoder->pos += size;
3037 int pt_qry_header_mode(struct pt_query_decoder *decoder)
3043 if (!decoder)
3046 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config);
3051 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3069 decoder->pos += size;
3073 int pt_qry_decode_psbend(struct pt_query_decoder *decoder)
3077 if (!decoder)
3080 status = pt_qry_process_pending_psb_events(decoder);
3091 decoder->pos += ptps_psbend;
3095 int pt_qry_decode_tsc(struct pt_query_decoder *decoder)
3100 if (!decoder)
3103 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config);
3107 errcode = pt_qry_apply_tsc(&decoder->time, &decoder->tcal,
3108 &packet, &decoder->config);
3112 decoder->pos += size;
3116 int pt_qry_header_tsc(struct pt_query_decoder *decoder)
3121 if (!decoder)
3124 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config);
3128 errcode = pt_qry_apply_header_tsc(&decoder->time, &decoder->tcal,
3129 &packet, &decoder->config);
3133 decoder->pos += size;
3137 int pt_qry_decode_cbr(struct pt_query_decoder *decoder)
3143 if (!decoder)
3146 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config);
3150 errcode = pt_qry_apply_cbr(&decoder->time, &decoder->tcal,
3151 &packet, &decoder->config);
3155 event = pt_evq_standalone(&decoder->evq);
3162 decoder->event = event;
3164 errcode = pt_qry_event_time(event, decoder);
3168 decoder->pos += size;
3172 int pt_qry_header_cbr(struct pt_query_decoder *decoder)
3178 if (!decoder)
3181 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config);
3185 errcode = pt_qry_apply_header_cbr(&decoder->time, &decoder->tcal,
3186 &packet, &decoder->config);
3190 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3197 decoder->pos += size;
3201 int pt_qry_decode_tma(struct pt_query_decoder *decoder)
3206 if (!decoder)
3209 size = pt_pkt_read_tma(&packet, decoder->pos, &decoder->config);
3213 errcode = pt_qry_apply_tma(&decoder->time, &decoder->tcal,
3214 &packet, &decoder->config);
3218 decoder->pos += size;
3222 int pt_qry_decode_mtc(struct pt_query_decoder *decoder)
3227 if (!decoder)
3230 size = pt_pkt_read_mtc(&packet, decoder->pos, &decoder->config);
3234 errcode = pt_qry_apply_mtc(&decoder->time, &decoder->tcal,
3235 &packet, &decoder->config);
3239 decoder->pos += size;
3243 static int check_erratum_skd007(struct pt_query_decoder *decoder,
3249 if (!decoder || !packet || size < 0)
3263 pos = decoder->pos + size;
3264 if (decoder->config.end <= pos)
3280 int pt_qry_decode_cyc(struct pt_query_decoder *decoder)
3286 if (!decoder)
3289 config = &decoder->config;
3291 size = pt_pkt_read_cyc(&packet, decoder->pos, config);
3296 errcode = check_erratum_skd007(decoder, &packet, size);
3307 decoder->pos += 1;
3312 errcode = pt_qry_apply_cyc(&decoder->time, &decoder->tcal,
3317 decoder->pos += size;
3321 int pt_qry_decode_stop(struct pt_query_decoder *decoder)
3326 if (!decoder)
3330 event = pt_evq_standalone(&decoder->evq);
3336 decoder->event = event;
3338 errcode = pt_qry_event_time(event, decoder);
3342 decoder->pos += ptps_stop;
3346 int pt_qry_header_vmcs(struct pt_query_decoder *decoder)
3352 if (!decoder)
3355 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config);
3359 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3366 decoder->pos += size;
3370 int pt_qry_decode_vmcs(struct pt_query_decoder *decoder)
3376 if (!decoder)
3379 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config);
3388 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_paging);
3392 paging = pt_evq_enqueue(&decoder->evq, evb_tip);
3401 decoder->pos += size;
3408 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch);
3410 event = pt_evq_enqueue(&decoder->evq, evb_tip);
3417 decoder->pos += size;
3424 event = pt_evq_standalone(&decoder->evq);
3431 decoder->event = event;
3433 errcode = pt_qry_event_time(event, decoder);
3437 decoder->pos += size;
3441 int pt_qry_decode_mnt(struct pt_query_decoder *decoder)
3447 if (!decoder)
3450 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config);
3454 event = pt_evq_standalone(&decoder->evq);
3461 decoder->event = event;
3463 errcode = pt_qry_event_time(event, decoder);
3467 decoder->pos += size;
3472 int pt_qry_header_mnt(struct pt_query_decoder *decoder)
3478 if (!decoder)
3481 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config);
3485 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3492 decoder->pos += size;
3497 int pt_qry_decode_exstop(struct pt_query_decoder *decoder)
3503 if (!decoder)
3506 size = pt_pkt_read_exstop(&packet, decoder->pos, &decoder->config);
3511 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3517 event = pt_evq_standalone(&decoder->evq);
3526 decoder->event = event;
3529 decoder->pos += size;
3533 int pt_qry_decode_mwait(struct pt_query_decoder *decoder)
3539 if (!decoder)
3542 size = pt_pkt_read_mwait(&packet, decoder->pos, &decoder->config);
3546 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3554 decoder->pos += size;
3558 int pt_qry_decode_pwre(struct pt_query_decoder *decoder)
3564 if (!decoder)
3567 size = pt_pkt_read_pwre(&packet, decoder->pos, &decoder->config);
3571 event = pt_evq_standalone(&decoder->evq);
3582 decoder->event = event;
3584 decoder->pos += size;
3588 int pt_qry_decode_pwrx(struct pt_query_decoder *decoder)
3594 if (!decoder)
3597 size = pt_pkt_read_pwrx(&packet, decoder->pos, &decoder->config);
3601 event = pt_evq_standalone(&decoder->evq);
3616 decoder->event = event;
3618 decoder->pos += size;
3622 int pt_qry_decode_ptw(struct pt_query_decoder *decoder)
3628 if (!decoder)
3631 size = pt_pkt_read_ptw(&packet, decoder->pos, &decoder->config);
3640 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3644 event = pt_evq_standalone(&decoder->evq);
3650 decoder->event = event;
3657 decoder->pos += size;