Lines Matching +full:resume +full:- +full:offset
2 * Copyright (c) 2014-2019, Intel Corporation
38 #include "intel-pt.h"
63 return -pte_internal; in pt_qry_find_header_fup()
72 switch (packet->type) { in pt_qry_find_header_fup()
94 return -pte_invalid; in pt_qry_decoder_init()
98 errcode = pt_config_from_user(&decoder->config, config); in pt_qry_decoder_init()
102 pt_last_ip_init(&decoder->ip); in pt_qry_decoder_init()
103 pt_tnt_cache_init(&decoder->tnt); in pt_qry_decoder_init()
104 pt_time_init(&decoder->time); in pt_qry_decoder_init()
105 pt_time_init(&decoder->last_time); in pt_qry_decoder_init()
106 pt_tcal_init(&decoder->tcal); in pt_qry_decoder_init()
107 pt_evq_init(&decoder->evq); in pt_qry_decoder_init()
148 decoder->enabled = 0; in pt_qry_reset()
149 decoder->consume_packet = 0; in pt_qry_reset()
150 decoder->event = NULL; in pt_qry_reset()
152 pt_last_ip_init(&decoder->ip); in pt_qry_reset()
153 pt_tnt_cache_init(&decoder->tnt); in pt_qry_reset()
154 pt_time_init(&decoder->time); in pt_qry_reset()
155 pt_time_init(&decoder->last_time); in pt_qry_reset()
156 pt_tcal_init(&decoder->tcal); in pt_qry_reset()
157 pt_evq_init(&decoder->evq); in pt_qry_reset()
165 return -pte_internal; in pt_qry_will_event()
167 dfun = decoder->next; in pt_qry_will_event()
171 if (dfun->flags & pdff_event) in pt_qry_will_event()
174 if (dfun->flags & pdff_psbend) in pt_qry_will_event()
175 return pt_evq_pending(&decoder->evq, evb_psbend); in pt_qry_will_event()
177 if (dfun->flags & pdff_tip) in pt_qry_will_event()
178 return pt_evq_pending(&decoder->evq, evb_tip); in pt_qry_will_event()
180 if (dfun->flags & pdff_fup) in pt_qry_will_event()
181 return pt_evq_pending(&decoder->evq, evb_fup); in pt_qry_will_event()
192 return -pte_internal; in pt_qry_will_eos()
194 dfun = decoder->next; in pt_qry_will_eos()
200 * - we ran out of trace in pt_qry_will_eos()
201 * - we ran into a fetch error such as -pte_bad_opc in pt_qry_will_eos()
205 errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config); in pt_qry_will_eos()
206 return errcode == -pte_eos; in pt_qry_will_eos()
214 return -pte_internal; in pt_qry_status_flags()
230 if (pt_tnt_cache_is_empty(&decoder->tnt)) { in pt_qry_status_flags()
247 return -pte_internal; in pt_qry_provoke_fetch_error()
250 errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config); in pt_qry_provoke_fetch_error()
255 return -pte_internal; in pt_qry_provoke_fetch_error()
261 return -pte_internal; in pt_qry_read_ahead()
267 errcode = pt_df_fetch(&decoder->next, decoder->pos, in pt_qry_read_ahead()
268 &decoder->config); in pt_qry_read_ahead()
272 dfun = decoder->next; in pt_qry_read_ahead()
274 return -pte_internal; in pt_qry_read_ahead()
276 if (!dfun->decode) in pt_qry_read_ahead()
277 return -pte_internal; in pt_qry_read_ahead()
281 * - a branching related packet. */ in pt_qry_read_ahead()
282 if (dfun->flags & (pdff_tip | pdff_tnt)) in pt_qry_read_ahead()
285 /* - an event related packet. */ in pt_qry_read_ahead()
290 errcode = dfun->decode(decoder); in pt_qry_read_ahead()
294 * Move beyond the packet and clear @decoder->next to in pt_qry_read_ahead()
298 if (errcode == -pte_eos) { in pt_qry_read_ahead()
299 decoder->pos = decoder->config.end; in pt_qry_read_ahead()
300 decoder->next = NULL; in pt_qry_read_ahead()
315 return -pte_invalid; in pt_qry_start()
319 decoder->sync = pos; in pt_qry_start()
320 decoder->pos = pos; in pt_qry_start()
322 errcode = pt_df_fetch(&decoder->next, pos, &decoder->config); in pt_qry_start()
326 dfun = decoder->next; in pt_qry_start()
330 return -pte_nosync; in pt_qry_start()
333 errcode = dfun->decode(decoder); in pt_qry_start()
343 status = pt_last_ip_query(addr, &decoder->ip); in pt_qry_start()
350 /* Read ahead until the first query-relevant packet. */ in pt_qry_start()
360 errcode = pt_last_ip_query(addr, &decoder->ip); in pt_qry_start()
377 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_tsc()
382 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_tsc()
389 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_tsc()
403 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_header_tsc()
408 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_header_tsc()
415 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_header_tsc()
428 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_cbr()
433 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_cbr()
440 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_cbr()
454 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_header_cbr()
459 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_header_cbr()
466 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_header_cbr()
479 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_tma()
484 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_tma()
491 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_tma()
504 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_mtc()
509 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_mtc()
516 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_mtc()
530 * calibration which will result in imprecise cycle-accurate timing. in pt_qry_apply_cyc()
535 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_cyc()
545 if (errcode == -pte_no_time) in pt_qry_apply_cyc()
555 if (errcode < 0 && (errcode != -pte_bad_config)) in pt_qry_apply_cyc()
568 return -pte_invalid; in pt_qry_sync_forward()
570 begin = decoder->config.begin; in pt_qry_sync_forward()
571 sync = decoder->sync; in pt_qry_sync_forward()
572 pos = decoder->pos; in pt_qry_sync_forward()
580 return -pte_internal; in pt_qry_sync_forward()
585 space = pos - begin; in pt_qry_sync_forward()
587 space = ptps_psb - 1; in pt_qry_sync_forward()
589 pos -= space; in pt_qry_sync_forward()
591 errcode = pt_sync_forward(&sync, pos, &decoder->config); in pt_qry_sync_forward()
604 return -pte_invalid; in pt_qry_sync_backward()
606 start = decoder->pos; in pt_qry_sync_backward()
608 start = decoder->config.end; in pt_qry_sync_backward()
612 errcode = pt_sync_backward(&sync, sync, &decoder->config); in pt_qry_sync_backward()
621 if (errcode == -pte_eos) in pt_qry_sync_backward()
632 if (decoder->pos != start) in pt_qry_sync_backward()
640 uint64_t offset) in pt_qry_sync_set() argument
646 return -pte_invalid; in pt_qry_sync_set()
648 pos = decoder->config.begin + offset; in pt_qry_sync_set()
650 errcode = pt_sync_set(&sync, pos, &decoder->config); in pt_qry_sync_set()
657 int pt_qry_get_offset(const struct pt_query_decoder *decoder, uint64_t *offset) in pt_qry_get_offset() argument
661 if (!decoder || !offset) in pt_qry_get_offset()
662 return -pte_invalid; in pt_qry_get_offset()
664 begin = decoder->config.begin; in pt_qry_get_offset()
665 pos = decoder->pos; in pt_qry_get_offset()
668 return -pte_nosync; in pt_qry_get_offset()
670 *offset = (uint64_t) (int64_t) (pos - begin); in pt_qry_get_offset()
675 uint64_t *offset) in pt_qry_get_sync_offset() argument
679 if (!decoder || !offset) in pt_qry_get_sync_offset()
680 return -pte_invalid; in pt_qry_get_sync_offset()
682 begin = decoder->config.begin; in pt_qry_get_sync_offset()
683 sync = decoder->sync; in pt_qry_get_sync_offset()
686 return -pte_nosync; in pt_qry_get_sync_offset()
688 *offset = (uint64_t) (int64_t) (sync - begin); in pt_qry_get_sync_offset()
698 return &decoder->config; in pt_qry_get_config()
706 return -pte_internal; in pt_qry_cache_tnt()
711 dfun = decoder->next; in pt_qry_cache_tnt()
715 if (!dfun->decode) in pt_qry_cache_tnt()
716 return -pte_internal; in pt_qry_cache_tnt()
720 return -pte_bad_query; in pt_qry_cache_tnt()
723 if (dfun->flags & pdff_tip) in pt_qry_cache_tnt()
724 return -pte_bad_query; in pt_qry_cache_tnt()
729 decoder->event = NULL; in pt_qry_cache_tnt()
732 errcode = dfun->decode(decoder); in pt_qry_cache_tnt()
737 if (decoder->event) in pt_qry_cache_tnt()
738 return -pte_event_ignored; in pt_qry_cache_tnt()
741 if (dfun->flags & pdff_tnt) in pt_qry_cache_tnt()
744 /* Read ahead until the next query-relevant packet. */ in pt_qry_cache_tnt()
751 decoder->last_time = decoder->time; in pt_qry_cache_tnt()
753 /* Read ahead until the next query-relevant packet. */ in pt_qry_cache_tnt()
755 if ((errcode < 0) && (errcode != -pte_eos)) in pt_qry_cache_tnt()
766 return -pte_invalid; in pt_qry_cond_branch()
768 /* We cache the latest tnt packet in the decoder. Let's re-fill the in pt_qry_cond_branch()
771 if (pt_tnt_cache_is_empty(&decoder->tnt)) { in pt_qry_cond_branch()
777 query = pt_tnt_cache_query(&decoder->tnt); in pt_qry_cond_branch()
791 return -pte_invalid; in pt_qry_indirect_branch()
797 dfun = decoder->next; in pt_qry_indirect_branch()
801 if (!dfun->decode) in pt_qry_indirect_branch()
802 return -pte_internal; in pt_qry_indirect_branch()
806 return -pte_bad_query; in pt_qry_indirect_branch()
811 decoder->event = NULL; in pt_qry_indirect_branch()
817 * that our user is able to re-sync. in pt_qry_indirect_branch()
819 if ((dfun->flags & pdff_tnt) && in pt_qry_indirect_branch()
820 !pt_tnt_cache_is_empty(&decoder->tnt)) in pt_qry_indirect_branch()
821 return -pte_bad_query; in pt_qry_indirect_branch()
824 errcode = dfun->decode(decoder); in pt_qry_indirect_branch()
829 if (decoder->event) in pt_qry_indirect_branch()
830 return -pte_event_ignored; in pt_qry_indirect_branch()
835 if (dfun->flags & pdff_tip) { in pt_qry_indirect_branch()
841 errcode = pt_last_ip_query(&ip, &decoder->ip); in pt_qry_indirect_branch()
850 /* Read ahead until the next query-relevant packet. */ in pt_qry_indirect_branch()
857 decoder->last_time = decoder->time; in pt_qry_indirect_branch()
859 /* Read ahead until the next query-relevant packet. */ in pt_qry_indirect_branch()
861 if ((errcode < 0) && (errcode != -pte_eos)) in pt_qry_indirect_branch()
875 return -pte_invalid; in pt_qry_event()
878 return -pte_invalid; in pt_qry_event()
883 if (!pt_tnt_cache_is_empty(&decoder->tnt)) in pt_qry_event()
884 return -pte_bad_query; in pt_qry_event()
894 dfun = decoder->next; in pt_qry_event()
898 if (!dfun->decode) in pt_qry_event()
899 return -pte_internal; in pt_qry_event()
906 * to re-sync. in pt_qry_event()
908 if ((dfun->flags & (pdff_tip | pdff_tnt)) && in pt_qry_event()
910 return -pte_bad_query; in pt_qry_event()
915 decoder->event = NULL; in pt_qry_event()
918 errcode = dfun->decode(decoder); in pt_qry_event()
927 if (decoder->event) { in pt_qry_event()
928 (void) memcpy(event, decoder->event, size); in pt_qry_event()
932 /* Read ahead until the next query-relevant packet. */ in pt_qry_event()
939 decoder->last_time = decoder->time; in pt_qry_event()
941 /* Read ahead until the next query-relevant packet. */ in pt_qry_event()
943 if ((errcode < 0) && (errcode != -pte_eos)) in pt_qry_event()
955 return -pte_invalid; in pt_qry_time()
957 return pt_time_query_tsc(time, lost_mtc, lost_cyc, &decoder->last_time); in pt_qry_time()
963 return -pte_invalid; in pt_qry_core_bus_ratio()
965 return pt_time_query_cbr(cbr, &decoder->last_time); in pt_qry_core_bus_ratio()
974 return -pte_internal; in pt_qry_event_time()
976 errcode = pt_time_query_tsc(&event->tsc, &event->lost_mtc, in pt_qry_event_time()
977 &event->lost_cyc, &decoder->time); in pt_qry_event_time()
979 if (errcode != -pte_no_time) in pt_qry_event_time()
982 event->has_tsc = 1; in pt_qry_event_time()
993 return -pte_internal; in pt_qry_decode_unknown()
995 size = pt_pkt_read_unknown(&packet, decoder->pos, &decoder->config); in pt_qry_decode_unknown()
999 decoder->pos += size; in pt_qry_decode_unknown()
1006 return -pte_internal; in pt_qry_decode_pad()
1008 decoder->pos += ptps_pad; in pt_qry_decode_pad()
1016 return -pte_internal; in pt_qry_read_psb_header()
1018 pt_last_ip_init(&decoder->ip); in pt_qry_read_psb_header()
1024 errcode = pt_df_fetch(&decoder->next, decoder->pos, in pt_qry_read_psb_header()
1025 &decoder->config); in pt_qry_read_psb_header()
1029 dfun = decoder->next; in pt_qry_read_psb_header()
1031 return -pte_internal; in pt_qry_read_psb_header()
1034 if (dfun->flags & pdff_psbend) in pt_qry_read_psb_header()
1037 if (!dfun->header) in pt_qry_read_psb_header()
1038 return -pte_bad_context; in pt_qry_read_psb_header()
1040 errcode = dfun->header(decoder); in pt_qry_read_psb_header()
1052 return -pte_internal; in pt_qry_decode_psb()
1054 pos = decoder->pos; in pt_qry_decode_psb()
1056 size = pt_pkt_read_psb(pos, &decoder->config); in pt_qry_decode_psb()
1060 errcode = pt_tcal_update_psb(&decoder->tcal, &decoder->config); in pt_qry_decode_psb()
1064 decoder->pos += size; in pt_qry_decode_psb()
1071 decoder->pos = pos; in pt_qry_decode_psb()
1074 (void) pt_evq_clear(&decoder->evq, evb_psbend); in pt_qry_decode_psb()
1077 decoder->next = &pt_decode_psb; in pt_qry_decode_psb()
1096 return -pte_internal; in pt_qry_event_ip()
1098 errcode = pt_last_ip_query(ip, &decoder->ip); in pt_qry_event_ip()
1103 event->ip_suppressed = 1; in pt_qry_event_ip()
1117 * Returns -pte_eos if the ip does not fit into the buffer.
1118 * Returns -pte_bad_packet if the ip compression is not known.
1126 return -pte_internal; in pt_qry_decode_ip()
1128 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config); in pt_qry_decode_ip()
1132 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config); in pt_qry_decode_ip()
1144 return -pte_internal; in pt_qry_consume_tip()
1146 decoder->pos += size; in pt_qry_consume_tip()
1154 return -pte_internal; in pt_qry_event_tip()
1156 switch (ev->type) { in pt_qry_event_tip()
1158 decoder->consume_packet = 1; in pt_qry_event_tip()
1160 return pt_qry_event_ip(&ev->variant.async_branch.to, ev, in pt_qry_event_tip()
1164 return pt_qry_event_ip(&ev->variant.async_paging.ip, ev, in pt_qry_event_tip()
1168 return pt_qry_event_ip(&ev->variant.async_vmcs.ip, ev, in pt_qry_event_tip()
1172 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, in pt_qry_event_tip()
1179 return -pte_bad_context; in pt_qry_event_tip()
1188 return -pte_internal; in pt_qry_decode_tip()
1195 ev = pt_evq_dequeue(&decoder->evq, evb_tip); in pt_qry_decode_tip()
1202 decoder->event = ev; in pt_qry_decode_tip()
1205 if (pt_evq_pending(&decoder->evq, evb_tip)) in pt_qry_decode_tip()
1212 if (!decoder->consume_packet) in pt_qry_decode_tip()
1218 decoder->consume_packet = 0; in pt_qry_decode_tip()
1230 return -pte_internal; in pt_qry_decode_tnt_8()
1232 size = pt_pkt_read_tnt_8(&packet, decoder->pos, &decoder->config); in pt_qry_decode_tnt_8()
1236 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet, in pt_qry_decode_tnt_8()
1237 &decoder->config); in pt_qry_decode_tnt_8()
1241 decoder->pos += size; in pt_qry_decode_tnt_8()
1251 return -pte_internal; in pt_qry_decode_tnt_64()
1253 size = pt_pkt_read_tnt_64(&packet, decoder->pos, &decoder->config); in pt_qry_decode_tnt_64()
1257 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet, in pt_qry_decode_tnt_64()
1258 &decoder->config); in pt_qry_decode_tnt_64()
1262 decoder->pos += size; in pt_qry_decode_tnt_64()
1269 return -pte_internal; in pt_qry_consume_tip_pge()
1271 decoder->pos += size; in pt_qry_consume_tip_pge()
1279 return -pte_internal; in pt_qry_event_tip_pge()
1281 switch (ev->type) { in pt_qry_event_tip_pge()
1283 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder); in pt_qry_event_tip_pge()
1289 return -pte_bad_context; in pt_qry_event_tip_pge()
1298 return -pte_internal; in pt_qry_decode_tip_pge()
1310 if (!decoder->consume_packet) { in pt_qry_decode_tip_pge()
1312 ev = pt_evq_standalone(&decoder->evq); in pt_qry_decode_tip_pge()
1314 return -pte_internal; in pt_qry_decode_tip_pge()
1316 ev->type = ptev_enabled; in pt_qry_decode_tip_pge()
1319 errcode = pt_last_ip_query(&ev->variant.enabled.ip, in pt_qry_decode_tip_pge()
1320 &decoder->ip); in pt_qry_decode_tip_pge()
1322 return -pte_bad_packet; in pt_qry_decode_tip_pge()
1334 pt_tnt_cache_init(&decoder->tnt); in pt_qry_decode_tip_pge()
1337 decoder->consume_packet = 1; in pt_qry_decode_tip_pge()
1338 decoder->enabled = 1; in pt_qry_decode_tip_pge()
1341 ev = pt_evq_dequeue(&decoder->evq, evb_tip); in pt_qry_decode_tip_pge()
1353 return -pte_internal; in pt_qry_decode_tip_pge()
1356 decoder->event = ev; in pt_qry_decode_tip_pge()
1359 if (pt_evq_pending(&decoder->evq, evb_tip)) in pt_qry_decode_tip_pge()
1363 if (!decoder->consume_packet) in pt_qry_decode_tip_pge()
1364 return -pte_internal; in pt_qry_decode_tip_pge()
1366 decoder->consume_packet = 0; in pt_qry_decode_tip_pge()
1374 return -pte_internal; in pt_qry_consume_tip_pgd()
1376 decoder->enabled = 0; in pt_qry_consume_tip_pgd()
1377 decoder->pos += size; in pt_qry_consume_tip_pgd()
1385 return -pte_internal; in pt_qry_event_tip_pgd()
1387 switch (ev->type) { in pt_qry_event_tip_pgd()
1392 at = ev->variant.async_branch.from; in pt_qry_event_tip_pgd()
1394 ev->type = ptev_async_disabled; in pt_qry_event_tip_pgd()
1395 ev->variant.async_disabled.at = at; in pt_qry_event_tip_pgd()
1397 return pt_qry_event_ip(&ev->variant.async_disabled.ip, ev, in pt_qry_event_tip_pgd()
1414 * likely to resume from there. in pt_qry_event_tip_pgd()
1419 ev->ip_suppressed = 1; in pt_qry_event_tip_pgd()
1427 return -pte_bad_context; in pt_qry_event_tip_pgd()
1436 return -pte_internal; in pt_qry_decode_tip_pgd()
1443 ev = pt_evq_dequeue(&decoder->evq, evb_tip); in pt_qry_decode_tip_pgd()
1450 ev = pt_evq_standalone(&decoder->evq); in pt_qry_decode_tip_pgd()
1452 return -pte_internal; in pt_qry_decode_tip_pgd()
1453 ev->type = ptev_disabled; in pt_qry_decode_tip_pgd()
1455 errcode = pt_qry_event_ip(&ev->variant.disabled.ip, ev, in pt_qry_decode_tip_pgd()
1469 return -pte_internal; in pt_qry_decode_tip_pgd()
1472 decoder->event = ev; in pt_qry_decode_tip_pgd()
1475 if (pt_evq_pending(&decoder->evq, evb_tip)) in pt_qry_decode_tip_pgd()
1484 return -pte_internal; in pt_qry_consume_fup()
1486 decoder->pos += size; in pt_qry_consume_fup()
1499 if (errcode == -pte_eos) in scan_for_erratum_bdm70()
1515 /* We found it - the erratum applies. */ in scan_for_erratum_bdm70()
1542 return -pte_internal; in check_erratum_bdm70()
1548 errcode = pt_pkt_sync_set(&decoder, (uint64_t) (pos - config->begin)); in check_erratum_bdm70()
1562 return -pte_internal; in pt_qry_header_fup()
1564 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config); in pt_qry_header_fup()
1568 if (decoder->config.errata.bdm70 && !decoder->enabled) { in pt_qry_header_fup()
1569 errcode = check_erratum_bdm70(decoder->pos + size, in pt_qry_header_fup()
1570 &decoder->config); in pt_qry_header_fup()
1578 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config); in pt_qry_header_fup()
1584 decoder->enabled = 1; in pt_qry_header_fup()
1593 return -pte_internal; in pt_qry_event_fup()
1595 switch (ev->type) { in pt_qry_event_fup()
1597 decoder->consume_packet = 1; in pt_qry_event_fup()
1600 return pt_last_ip_query(&ev->variant.overflow.ip, in pt_qry_event_fup()
1601 &decoder->ip); in pt_qry_event_fup()
1604 if (!(ev->variant.tsx.aborted)) in pt_qry_event_fup()
1605 decoder->consume_packet = 1; in pt_qry_event_fup()
1607 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder); in pt_qry_event_fup()
1610 decoder->consume_packet = 1; in pt_qry_event_fup()
1612 return pt_qry_event_ip(&ev->variant.exstop.ip, ev, decoder); in pt_qry_event_fup()
1615 decoder->consume_packet = 1; in pt_qry_event_fup()
1617 return pt_qry_event_ip(&ev->variant.mwait.ip, ev, decoder); in pt_qry_event_fup()
1620 decoder->consume_packet = 1; in pt_qry_event_fup()
1622 return pt_qry_event_ip(&ev->variant.ptwrite.ip, ev, decoder); in pt_qry_event_fup()
1628 return -pte_internal; in pt_qry_event_fup()
1637 return -pte_internal; in pt_qry_decode_fup()
1644 ev = pt_evq_dequeue(&decoder->evq, evb_fup); in pt_qry_decode_fup()
1651 decoder->event = ev; in pt_qry_decode_fup()
1654 if (pt_evq_pending(&decoder->evq, evb_fup)) in pt_qry_decode_fup()
1661 if (!decoder->consume_packet) in pt_qry_decode_fup()
1667 decoder->consume_packet = 0; in pt_qry_decode_fup()
1675 errcode = pt_last_ip_query(&ip, &decoder->ip); in pt_qry_decode_fup()
1679 ev = pt_evq_enqueue(&decoder->evq, evb_tip); in pt_qry_decode_fup()
1681 return -pte_nomem; in pt_qry_decode_fup()
1683 ev->type = ptev_async_branch; in pt_qry_decode_fup()
1684 ev->variant.async_branch.from = ip; in pt_qry_decode_fup()
1701 return -pte_internal; in pt_qry_decode_pip()
1703 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config); in pt_qry_decode_pip()
1708 * as an in-flight async branch event. in pt_qry_decode_pip()
1710 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch); in pt_qry_decode_pip()
1712 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_pip()
1714 return -pte_internal; in pt_qry_decode_pip()
1715 event->type = ptev_paging; in pt_qry_decode_pip()
1716 event->variant.paging.cr3 = packet.cr3; in pt_qry_decode_pip()
1717 event->variant.paging.non_root = packet.nr; in pt_qry_decode_pip()
1719 decoder->event = event; in pt_qry_decode_pip()
1721 event = pt_evq_enqueue(&decoder->evq, evb_tip); in pt_qry_decode_pip()
1723 return -pte_nomem; in pt_qry_decode_pip()
1725 event->type = ptev_async_paging; in pt_qry_decode_pip()
1726 event->variant.async_paging.cr3 = packet.cr3; in pt_qry_decode_pip()
1727 event->variant.async_paging.non_root = packet.nr; in pt_qry_decode_pip()
1734 decoder->pos += size; in pt_qry_decode_pip()
1745 return -pte_internal; in pt_qry_header_pip()
1747 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config); in pt_qry_header_pip()
1752 event = pt_evq_enqueue(&decoder->evq, evb_psbend); in pt_qry_header_pip()
1754 return -pte_nomem; in pt_qry_header_pip()
1756 event->type = ptev_async_paging; in pt_qry_header_pip()
1757 event->variant.async_paging.cr3 = packet.cr3; in pt_qry_header_pip()
1758 event->variant.async_paging.non_root = packet.nr; in pt_qry_header_pip()
1760 decoder->pos += size; in pt_qry_header_pip()
1770 return -pte_internal; in pt_qry_event_psbend()
1773 ev->status_update = 1; in pt_qry_event_psbend()
1779 switch (ev->type) { in pt_qry_event_psbend()
1781 return pt_qry_event_ip(&ev->variant.async_paging.ip, ev, in pt_qry_event_psbend()
1785 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder); in pt_qry_event_psbend()
1788 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder); in pt_qry_event_psbend()
1791 return pt_qry_event_ip(&ev->variant.async_vmcs.ip, ev, in pt_qry_event_psbend()
1801 ev->status_update = 0; in pt_qry_event_psbend()
1808 return -pte_internal; in pt_qry_event_psbend()
1817 return -pte_internal; in pt_qry_process_pending_psb_events()
1819 ev = pt_evq_dequeue(&decoder->evq, evb_psbend); in pt_qry_process_pending_psb_events()
1828 decoder->event = ev; in pt_qry_process_pending_psb_events()
1845 return -pte_internal; in pt_qry_event_ovf_disabled()
1847 ev = pt_evq_standalone(&decoder->evq); in pt_qry_event_ovf_disabled()
1849 return -pte_internal; in pt_qry_event_ovf_disabled()
1851 ev->type = ptev_overflow; in pt_qry_event_ovf_disabled()
1857 ev->ip_suppressed = 1; in pt_qry_event_ovf_disabled()
1859 decoder->enabled = 0; in pt_qry_event_ovf_disabled()
1860 decoder->event = ev; in pt_qry_event_ovf_disabled()
1876 return -pte_internal; in pt_qry_event_ovf_enabled()
1878 ev = pt_evq_enqueue(&decoder->evq, evb_fup); in pt_qry_event_ovf_enabled()
1880 return -pte_internal; in pt_qry_event_ovf_enabled()
1882 ev->type = ptev_overflow; in pt_qry_event_ovf_enabled()
1884 decoder->enabled = 1; in pt_qry_event_ovf_enabled()
1895 * - set time tracking to @time and @tcal
1896 * - set the position to @offset
1897 * - set ip to @packet's IP payload
1898 * - set tracing to be enabled
1905 const struct pt_time *time, uint64_t offset) in skd010_recover() argument
1912 return -pte_internal; in skd010_recover()
1915 ip = decoder->ip; in skd010_recover()
1918 errcode = pt_last_ip_update_ip(&ip, packet, &decoder->config); in skd010_recover()
1923 ev = pt_evq_standalone(&decoder->evq); in skd010_recover()
1925 return -pte_internal; in skd010_recover()
1927 ev->type = ptev_overflow; in skd010_recover()
1930 errcode = pt_last_ip_query(&ev->variant.overflow.ip, &ip); in skd010_recover()
1932 return -pte_bad_context; in skd010_recover()
1934 /* We continue decoding at the given offset. */ in skd010_recover()
1935 decoder->pos = decoder->config.begin + offset; in skd010_recover()
1938 decoder->enabled = 1; in skd010_recover()
1939 decoder->ip = ip; in skd010_recover()
1941 decoder->time = *time; in skd010_recover()
1942 decoder->tcal = *tcal; in skd010_recover()
1945 decoder->event = ev; in skd010_recover()
1956 * - set time tracking to @time and @tcal
1957 * - set the position to @offset
1958 * - set tracing to be disabled
1964 const struct pt_time *time, uint64_t offset) in skd010_recover_disabled() argument
1967 return -pte_internal; in skd010_recover_disabled()
1969 decoder->time = *time; in skd010_recover_disabled()
1970 decoder->tcal = *tcal; in skd010_recover_disabled()
1972 /* We continue decoding at the given offset. */ in skd010_recover_disabled()
1973 decoder->pos = decoder->config.begin + offset; in skd010_recover_disabled()
1978 /* Scan ahead for a packet at which to resume after an overflow.
2009 uint64_t offset; in skd010_scan_for_ovf_resume() member
2014 return -pte_internal; in skd010_scan_for_ovf_resume()
2017 time = decoder->time; in skd010_scan_for_ovf_resume()
2018 tcal = decoder->tcal; in skd010_scan_for_ovf_resume()
2025 uint64_t offset; in skd010_scan_for_ovf_resume() local
2027 errcode = pt_pkt_get_offset(pkt, &offset); in skd010_scan_for_ovf_resume()
2036 if (errcode == -pte_eos) in skd010_scan_for_ovf_resume()
2054 offset + packet.size); in skd010_scan_for_ovf_resume()
2063 * find an IP packet at which to resume tracing. in skd010_scan_for_ovf_resume()
2092 * In the TIP case, we'd be able to re-sync at in skd010_scan_for_ovf_resume()
2099 * - it's getting too complicated. in skd010_scan_for_ovf_resume()
2115 if (mode_tsx.offset) in skd010_scan_for_ovf_resume()
2123 mode_tsx.offset = offset; in skd010_scan_for_ovf_resume()
2141 if (mode_tsx.offset) in skd010_scan_for_ovf_resume()
2146 mode_tsx.offset); in skd010_scan_for_ovf_resume()
2153 &tcal, &time, offset); in skd010_scan_for_ovf_resume()
2161 offset + packet.size); in skd010_scan_for_ovf_resume()
2172 if (errcode == -pte_eos) in skd010_scan_for_ovf_resume()
2186 return -pte_internal; in skd010_scan_for_ovf_resume()
2192 &tcal, &time, offset); in skd010_scan_for_ovf_resume()
2196 return -pte_bad_context; in skd010_scan_for_ovf_resume()
2201 * before. We may resume normally. in skd010_scan_for_ovf_resume()
2218 /* We may skip a stand-alone EXSTOP. */ in skd010_scan_for_ovf_resume()
2230 /* We may skip a stand-alone PTW. */ in skd010_scan_for_ovf_resume()
2243 &decoder->config); in skd010_scan_for_ovf_resume()
2253 &decoder->config); in skd010_scan_for_ovf_resume()
2263 &decoder->config); in skd010_scan_for_ovf_resume()
2273 &decoder->config); in skd010_scan_for_ovf_resume()
2283 &decoder->config); in skd010_scan_for_ovf_resume()
2295 uint64_t offset; in pt_qry_handle_skd010() local
2299 return -pte_internal; in pt_qry_handle_skd010()
2301 errcode = pt_qry_get_offset(decoder, &offset); in pt_qry_handle_skd010()
2305 errcode = pt_pkt_decoder_init(&pkt, &decoder->config); in pt_qry_handle_skd010()
2309 errcode = pt_pkt_sync_set(&pkt, offset); in pt_qry_handle_skd010()
2326 return -pte_internal; in apl12_tracing_is_disabled()
2335 if (status == -pte_eos) in apl12_tracing_is_disabled()
2351 /* Tracing gets enabled - it must have been disabled. */ in apl12_tracing_is_disabled()
2370 if (status == -pte_eos) in apl12_tracing_is_disabled()
2377 return -pte_bad_context; in apl12_tracing_is_disabled()
2380 /* It doesn't matter - we run into the next overflow. */ in apl12_tracing_is_disabled()
2393 * We resume from @offset (relative to @decoder->pos) with tracing disabled. On
2394 * our way to the resume location we process packets to update our state.
2402 unsigned int offset) in apl12_resume_disabled() argument
2408 return -pte_internal; in apl12_resume_disabled()
2418 end = begin + offset; in apl12_resume_disabled()
2426 if (errcode == -pte_eos) in apl12_resume_disabled()
2432 /* The offset is the start of the next packet. */ in apl12_resume_disabled()
2437 /* We're done when we reach @offset. in apl12_resume_disabled()
2442 * Check that we're not accidentally proceeding past @offset. in apl12_resume_disabled()
2446 return -pte_internal; in apl12_resume_disabled()
2462 * are state-relevant; let's check them explicitly. in apl12_resume_disabled()
2464 return -pte_internal; in apl12_resume_disabled()
2468 errcode = pt_qry_apply_tsc(&decoder->time, in apl12_resume_disabled()
2469 &decoder->tcal, in apl12_resume_disabled()
2471 &decoder->config); in apl12_resume_disabled()
2479 errcode = pt_qry_apply_cbr(&decoder->time, in apl12_resume_disabled()
2480 &decoder->tcal, in apl12_resume_disabled()
2482 &decoder->config); in apl12_resume_disabled()
2490 errcode = pt_qry_apply_tma(&decoder->time, in apl12_resume_disabled()
2491 &decoder->tcal, in apl12_resume_disabled()
2493 &decoder->config); in apl12_resume_disabled()
2501 errcode = pt_qry_apply_mtc(&decoder->time, in apl12_resume_disabled()
2502 &decoder->tcal, in apl12_resume_disabled()
2504 &decoder->config); in apl12_resume_disabled()
2512 errcode = pt_qry_apply_cyc(&decoder->time, in apl12_resume_disabled()
2513 &decoder->tcal, in apl12_resume_disabled()
2515 &decoder->config); in apl12_resume_disabled()
2523 decoder->pos += offset; in apl12_resume_disabled()
2530 * This function is called when a FUP is found after an OVF. The @offset
2531 * argument gives the relative offset from @decoder->pos to after the FUP.
2548 unsigned int offset) in pt_qry_handle_apl12() argument
2555 return -pte_internal; in pt_qry_handle_apl12()
2561 status = pt_pkt_decoder_init(&pkt, &decoder->config); in pt_qry_handle_apl12()
2565 status = pt_pkt_sync_set(&pkt, here + offset); in pt_qry_handle_apl12()
2569 status = apl12_resume_disabled(decoder, &pkt, offset); in pt_qry_handle_apl12()
2578 * We search for a TIP.PGD and, if we found one, resume from after that packet
2579 * with tracing disabled. On our way to the resume location we process packets
2598 return -pte_internal; in apl11_apply()
2600 time = decoder->time; in apl11_apply()
2601 tcal = decoder->tcal; in apl11_apply()
2612 uint64_t offset; in apl11_apply() local
2616 * Resume from here with tracing disabled. in apl11_apply()
2618 errcode = pt_pkt_get_offset(pkt, &offset); in apl11_apply()
2622 decoder->time = time; in apl11_apply()
2623 decoder->tcal = tcal; in apl11_apply()
2624 decoder->pos = decoder->config.begin + offset; in apl11_apply()
2630 return -pte_bad_opc; in apl11_apply()
2658 return -pte_bad_context; in apl11_apply()
2665 &decoder->config); in apl11_apply()
2675 &decoder->config); in apl11_apply()
2685 &decoder->config); in apl11_apply()
2695 &decoder->config); in apl11_apply()
2705 &decoder->config); in apl11_apply()
2720 * TIP.PGD and resume from there with tracing disabled.
2732 uint64_t offset; in pt_qry_handle_apl11() local
2736 return -pte_internal; in pt_qry_handle_apl11()
2738 status = pt_qry_get_offset(decoder, &offset); in pt_qry_handle_apl11()
2742 status = pt_pkt_decoder_init(&pkt, &decoder->config); in pt_qry_handle_apl11()
2746 status = pt_pkt_sync_set(&pkt, offset); in pt_qry_handle_apl11()
2769 return -pte_bad_opc; in pt_pkt_find_ovf_fup()
2800 return -pte_bad_context; in pt_pkt_find_ovf_fup()
2810 * Return the relative offset of the packet following the found FUP on success.
2817 uint64_t begin, end, offset; in pt_qry_find_ovf_fup() local
2821 return -pte_internal; in pt_qry_find_ovf_fup()
2827 status = pt_pkt_decoder_init(&pkt, &decoder->config); in pt_qry_find_ovf_fup()
2840 return -pte_overflow; in pt_qry_find_ovf_fup()
2842 offset = end - begin; in pt_qry_find_ovf_fup()
2843 if (INT_MAX < offset) in pt_qry_find_ovf_fup()
2844 return -pte_overflow; in pt_qry_find_ovf_fup()
2846 status = (int) offset; in pt_qry_find_ovf_fup()
2858 int status, offset; in pt_qry_decode_ovf() local
2861 return -pte_internal; in pt_qry_decode_ovf()
2872 time = decoder->time; in pt_qry_decode_ovf()
2873 tcal = decoder->tcal; in pt_qry_decode_ovf()
2877 decoder->time = time; in pt_qry_decode_ovf()
2878 if (decoder->config.flags.variant.query.keep_tcal_on_ovf) { in pt_qry_decode_ovf()
2879 status = pt_tcal_update_ovf(&tcal, &decoder->config); in pt_qry_decode_ovf()
2883 decoder->tcal = tcal; in pt_qry_decode_ovf()
2887 decoder->pos += ptps_ovf; in pt_qry_decode_ovf()
2899 * as we see a non-timing non-FUP packet, we know that tracing has been in pt_qry_decode_ovf()
2902 offset = pt_qry_find_ovf_fup(decoder); in pt_qry_decode_ovf()
2903 if (offset <= 0) { in pt_qry_decode_ovf()
2907 * tracing is enabled and hence the FUP is missing, we resume in pt_qry_decode_ovf()
2910 if (decoder->config.errata.skd010) { in pt_qry_decode_ovf()
2921 if (decoder->config.errata.apl11 && in pt_qry_decode_ovf()
2922 (offset == -pte_bad_context)) { in pt_qry_decode_ovf()
2933 if (offset < 0 && offset != -pte_eos) in pt_qry_decode_ovf()
2934 return offset; in pt_qry_decode_ovf()
2943 if (decoder->config.errata.apl12) { in pt_qry_decode_ovf()
2945 (unsigned int) offset); in pt_qry_decode_ovf()
2960 return -pte_internal; in pt_qry_decode_mode_exec()
2963 event = pt_evq_enqueue(&decoder->evq, evb_tip); in pt_qry_decode_mode_exec()
2965 return -pte_nomem; in pt_qry_decode_mode_exec()
2967 event->type = ptev_exec_mode; in pt_qry_decode_mode_exec()
2968 event->variant.exec_mode.mode = pt_get_exec_mode(packet); in pt_qry_decode_mode_exec()
2979 return -pte_internal; in pt_qry_decode_mode_tsx()
2982 if (!decoder->enabled) { in pt_qry_decode_mode_tsx()
2983 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_mode_tsx()
2985 return -pte_internal; in pt_qry_decode_mode_tsx()
2988 event->variant.tsx.ip = 0; in pt_qry_decode_mode_tsx()
2989 event->ip_suppressed = 1; in pt_qry_decode_mode_tsx()
2992 decoder->event = event; in pt_qry_decode_mode_tsx()
2995 event = pt_evq_enqueue(&decoder->evq, evb_fup); in pt_qry_decode_mode_tsx()
2997 return -pte_nomem; in pt_qry_decode_mode_tsx()
3000 event->type = ptev_tsx; in pt_qry_decode_mode_tsx()
3001 event->variant.tsx.speculative = packet->intx; in pt_qry_decode_mode_tsx()
3002 event->variant.tsx.aborted = packet->abrt; in pt_qry_decode_mode_tsx()
3013 return -pte_internal; in pt_qry_decode_mode()
3015 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config); in pt_qry_decode_mode()
3033 decoder->pos += size; in pt_qry_decode_mode()
3044 return -pte_internal; in pt_qry_header_mode()
3046 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config); in pt_qry_header_mode()
3051 event = pt_evq_enqueue(&decoder->evq, evb_psbend); in pt_qry_header_mode()
3053 return -pte_nomem; in pt_qry_header_mode()
3057 event->type = ptev_exec_mode; in pt_qry_header_mode()
3058 event->variant.exec_mode.mode = in pt_qry_header_mode()
3063 event->type = ptev_tsx; in pt_qry_header_mode()
3064 event->variant.tsx.speculative = packet.bits.tsx.intx; in pt_qry_header_mode()
3065 event->variant.tsx.aborted = packet.bits.tsx.abrt; in pt_qry_header_mode()
3069 decoder->pos += size; in pt_qry_header_mode()
3078 return -pte_internal; in pt_qry_decode_psbend()
3091 decoder->pos += ptps_psbend; in pt_qry_decode_psbend()
3101 return -pte_internal; in pt_qry_decode_tsc()
3103 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config); in pt_qry_decode_tsc()
3107 errcode = pt_qry_apply_tsc(&decoder->time, &decoder->tcal, in pt_qry_decode_tsc()
3108 &packet, &decoder->config); in pt_qry_decode_tsc()
3112 decoder->pos += size; in pt_qry_decode_tsc()
3122 return -pte_internal; in pt_qry_header_tsc()
3124 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config); in pt_qry_header_tsc()
3128 errcode = pt_qry_apply_header_tsc(&decoder->time, &decoder->tcal, in pt_qry_header_tsc()
3129 &packet, &decoder->config); in pt_qry_header_tsc()
3133 decoder->pos += size; in pt_qry_header_tsc()
3144 return -pte_internal; in pt_qry_decode_cbr()
3146 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config); in pt_qry_decode_cbr()
3150 errcode = pt_qry_apply_cbr(&decoder->time, &decoder->tcal, in pt_qry_decode_cbr()
3151 &packet, &decoder->config); in pt_qry_decode_cbr()
3155 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_cbr()
3157 return -pte_internal; in pt_qry_decode_cbr()
3159 event->type = ptev_cbr; in pt_qry_decode_cbr()
3160 event->variant.cbr.ratio = packet.ratio; in pt_qry_decode_cbr()
3162 decoder->event = event; in pt_qry_decode_cbr()
3168 decoder->pos += size; in pt_qry_decode_cbr()
3179 return -pte_internal; in pt_qry_header_cbr()
3181 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config); in pt_qry_header_cbr()
3185 errcode = pt_qry_apply_header_cbr(&decoder->time, &decoder->tcal, in pt_qry_header_cbr()
3186 &packet, &decoder->config); in pt_qry_header_cbr()
3190 event = pt_evq_enqueue(&decoder->evq, evb_psbend); in pt_qry_header_cbr()
3192 return -pte_nomem; in pt_qry_header_cbr()
3194 event->type = ptev_cbr; in pt_qry_header_cbr()
3195 event->variant.cbr.ratio = packet.ratio; in pt_qry_header_cbr()
3197 decoder->pos += size; in pt_qry_header_cbr()
3207 return -pte_internal; in pt_qry_decode_tma()
3209 size = pt_pkt_read_tma(&packet, decoder->pos, &decoder->config); in pt_qry_decode_tma()
3213 errcode = pt_qry_apply_tma(&decoder->time, &decoder->tcal, in pt_qry_decode_tma()
3214 &packet, &decoder->config); in pt_qry_decode_tma()
3218 decoder->pos += size; in pt_qry_decode_tma()
3228 return -pte_internal; in pt_qry_decode_mtc()
3230 size = pt_pkt_read_mtc(&packet, decoder->pos, &decoder->config); in pt_qry_decode_mtc()
3234 errcode = pt_qry_apply_mtc(&decoder->time, &decoder->tcal, in pt_qry_decode_mtc()
3235 &packet, &decoder->config); in pt_qry_decode_mtc()
3239 decoder->pos += size; in pt_qry_decode_mtc()
3250 return -pte_internal; in check_erratum_skd007()
3252 /* It must be a 2-byte CYC. */ in check_erratum_skd007()
3256 payload = (uint16_t) packet->value; in check_erratum_skd007()
3263 pos = decoder->pos + size; in check_erratum_skd007()
3264 if (decoder->config.end <= pos) in check_erratum_skd007()
3271 /* We shouldn't get back-to-back CYCs unless they are sent when the in check_erratum_skd007()
3274 * Since we got two non-full CYC packets, we assume the erratum hit. in check_erratum_skd007()
3287 return -pte_internal; in pt_qry_decode_cyc()
3289 config = &decoder->config; in pt_qry_decode_cyc()
3291 size = pt_pkt_read_cyc(&packet, decoder->pos, config); in pt_qry_decode_cyc()
3295 if (config->errata.skd007) { in pt_qry_decode_cyc()
3307 decoder->pos += 1; in pt_qry_decode_cyc()
3312 errcode = pt_qry_apply_cyc(&decoder->time, &decoder->tcal, in pt_qry_decode_cyc()
3317 decoder->pos += size; in pt_qry_decode_cyc()
3327 return -pte_internal; in pt_qry_decode_stop()
3330 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_stop()
3332 return -pte_internal; in pt_qry_decode_stop()
3334 event->type = ptev_stop; in pt_qry_decode_stop()
3336 decoder->event = event; in pt_qry_decode_stop()
3342 decoder->pos += ptps_stop; in pt_qry_decode_stop()
3353 return -pte_internal; in pt_qry_header_vmcs()
3355 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config); in pt_qry_header_vmcs()
3359 event = pt_evq_enqueue(&decoder->evq, evb_psbend); in pt_qry_header_vmcs()
3361 return -pte_nomem; in pt_qry_header_vmcs()
3363 event->type = ptev_async_vmcs; in pt_qry_header_vmcs()
3364 event->variant.async_vmcs.base = packet.base; in pt_qry_header_vmcs()
3366 decoder->pos += size; in pt_qry_header_vmcs()
3377 return -pte_internal; in pt_qry_decode_vmcs()
3379 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config); in pt_qry_decode_vmcs()
3383 /* VMCS events bind to the same IP as an in-flight async paging event. in pt_qry_decode_vmcs()
3388 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_paging); in pt_qry_decode_vmcs()
3392 paging = pt_evq_enqueue(&decoder->evq, evb_tip); in pt_qry_decode_vmcs()
3394 return -pte_nomem; in pt_qry_decode_vmcs()
3398 event->type = ptev_async_vmcs; in pt_qry_decode_vmcs()
3399 event->variant.async_vmcs.base = packet.base; in pt_qry_decode_vmcs()
3401 decoder->pos += size; in pt_qry_decode_vmcs()
3405 /* VMCS events bind to the same TIP packet as an in-flight async in pt_qry_decode_vmcs()
3408 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch); in pt_qry_decode_vmcs()
3410 event = pt_evq_enqueue(&decoder->evq, evb_tip); in pt_qry_decode_vmcs()
3412 return -pte_nomem; in pt_qry_decode_vmcs()
3414 event->type = ptev_async_vmcs; in pt_qry_decode_vmcs()
3415 event->variant.async_vmcs.base = packet.base; in pt_qry_decode_vmcs()
3417 decoder->pos += size; in pt_qry_decode_vmcs()
3421 /* VMCS events that do not bind to an in-flight async event are in pt_qry_decode_vmcs()
3422 * stand-alone. in pt_qry_decode_vmcs()
3424 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_vmcs()
3426 return -pte_internal; in pt_qry_decode_vmcs()
3428 event->type = ptev_vmcs; in pt_qry_decode_vmcs()
3429 event->variant.vmcs.base = packet.base; in pt_qry_decode_vmcs()
3431 decoder->event = event; in pt_qry_decode_vmcs()
3437 decoder->pos += size; in pt_qry_decode_vmcs()
3448 return -pte_internal; in pt_qry_decode_mnt()
3450 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config); in pt_qry_decode_mnt()
3454 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_mnt()
3456 return -pte_internal; in pt_qry_decode_mnt()
3458 event->type = ptev_mnt; in pt_qry_decode_mnt()
3459 event->variant.mnt.payload = packet.payload; in pt_qry_decode_mnt()
3461 decoder->event = event; in pt_qry_decode_mnt()
3467 decoder->pos += size; in pt_qry_decode_mnt()
3479 return -pte_internal; in pt_qry_header_mnt()
3481 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config); in pt_qry_header_mnt()
3485 event = pt_evq_enqueue(&decoder->evq, evb_psbend); in pt_qry_header_mnt()
3487 return -pte_nomem; in pt_qry_header_mnt()
3489 event->type = ptev_mnt; in pt_qry_header_mnt()
3490 event->variant.mnt.payload = packet.payload; in pt_qry_header_mnt()
3492 decoder->pos += size; in pt_qry_header_mnt()
3504 return -pte_internal; in pt_qry_decode_exstop()
3506 size = pt_pkt_read_exstop(&packet, decoder->pos, &decoder->config); in pt_qry_decode_exstop()
3511 event = pt_evq_enqueue(&decoder->evq, evb_fup); in pt_qry_decode_exstop()
3513 return -pte_internal; in pt_qry_decode_exstop()
3515 event->type = ptev_exstop; in pt_qry_decode_exstop()
3517 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_exstop()
3519 return -pte_internal; in pt_qry_decode_exstop()
3521 event->type = ptev_exstop; in pt_qry_decode_exstop()
3523 event->ip_suppressed = 1; in pt_qry_decode_exstop()
3524 event->variant.exstop.ip = 0ull; in pt_qry_decode_exstop()
3526 decoder->event = event; in pt_qry_decode_exstop()
3529 decoder->pos += size; in pt_qry_decode_exstop()
3540 return -pte_internal; in pt_qry_decode_mwait()
3542 size = pt_pkt_read_mwait(&packet, decoder->pos, &decoder->config); in pt_qry_decode_mwait()
3546 event = pt_evq_enqueue(&decoder->evq, evb_fup); in pt_qry_decode_mwait()
3548 return -pte_internal; in pt_qry_decode_mwait()
3550 event->type = ptev_mwait; in pt_qry_decode_mwait()
3551 event->variant.mwait.hints = packet.hints; in pt_qry_decode_mwait()
3552 event->variant.mwait.ext = packet.ext; in pt_qry_decode_mwait()
3554 decoder->pos += size; in pt_qry_decode_mwait()
3565 return -pte_internal; in pt_qry_decode_pwre()
3567 size = pt_pkt_read_pwre(&packet, decoder->pos, &decoder->config); in pt_qry_decode_pwre()
3571 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_pwre()
3573 return -pte_internal; in pt_qry_decode_pwre()
3575 event->type = ptev_pwre; in pt_qry_decode_pwre()
3576 event->variant.pwre.state = packet.state; in pt_qry_decode_pwre()
3577 event->variant.pwre.sub_state = packet.sub_state; in pt_qry_decode_pwre()
3580 event->variant.pwre.hw = 1; in pt_qry_decode_pwre()
3582 decoder->event = event; in pt_qry_decode_pwre()
3584 decoder->pos += size; in pt_qry_decode_pwre()
3595 return -pte_internal; in pt_qry_decode_pwrx()
3597 size = pt_pkt_read_pwrx(&packet, decoder->pos, &decoder->config); in pt_qry_decode_pwrx()
3601 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_pwrx()
3603 return -pte_internal; in pt_qry_decode_pwrx()
3605 event->type = ptev_pwrx; in pt_qry_decode_pwrx()
3606 event->variant.pwrx.last = packet.last; in pt_qry_decode_pwrx()
3607 event->variant.pwrx.deepest = packet.deepest; in pt_qry_decode_pwrx()
3610 event->variant.pwrx.interrupt = 1; in pt_qry_decode_pwrx()
3612 event->variant.pwrx.store = 1; in pt_qry_decode_pwrx()
3614 event->variant.pwrx.autonomous = 1; in pt_qry_decode_pwrx()
3616 decoder->event = event; in pt_qry_decode_pwrx()
3618 decoder->pos += size; in pt_qry_decode_pwrx()
3629 return -pte_internal; in pt_qry_decode_ptw()
3631 size = pt_pkt_read_ptw(&packet, decoder->pos, &decoder->config); in pt_qry_decode_ptw()
3640 event = pt_evq_enqueue(&decoder->evq, evb_fup); in pt_qry_decode_ptw()
3642 return -pte_internal; in pt_qry_decode_ptw()
3644 event = pt_evq_standalone(&decoder->evq); in pt_qry_decode_ptw()
3646 return -pte_internal; in pt_qry_decode_ptw()
3648 event->ip_suppressed = 1; in pt_qry_decode_ptw()
3650 decoder->event = event; in pt_qry_decode_ptw()
3653 event->type = ptev_ptwrite; in pt_qry_decode_ptw()
3654 event->variant.ptwrite.size = (uint8_t) pls; in pt_qry_decode_ptw()
3655 event->variant.ptwrite.payload = packet.payload; in pt_qry_decode_ptw()
3657 decoder->pos += size; in pt_qry_decode_ptw()