1 /*
2 * Copyright (c) 2014-2019, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * * Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * * Neither the name of Intel Corporation nor the names of its contributors
13 * may be used to endorse or promote products derived from this software
14 * without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "pt_query_decoder.h"
30 #include "pt_sync.h"
31 #include "pt_decoder_function.h"
32 #include "pt_packet.h"
33 #include "pt_packet_decoder.h"
34 #include "pt_config.h"
35 #include "pt_opcodes.h"
36 #include "pt_compiler.h"
37
38 #include "intel-pt.h"
39
40 #include <string.h>
41 #include <stddef.h>
42 #include <stdlib.h>
43 #include <limits.h>
44
45
46 /* Find a FUP in a PSB+ header.
47 *
48 * The packet @decoder must be synchronized onto the trace stream at the
49 * beginning or somewhere inside a PSB+ header.
50 *
51 * It uses @packet to hold trace packets during its search. If the search is
52 * successful, @packet will contain the first (and hopefully only) FUP packet in
53 * this PSB+. Otherwise, @packet may contain anything.
54 *
55 * Returns one if a FUP packet is found (@packet will contain it).
56 * Returns zero if no FUP packet is found (@packet is undefined).
57 * Returns a negative error code otherwise.
58 */
pt_qry_find_header_fup(struct pt_packet * packet,struct pt_packet_decoder * decoder)59 static int pt_qry_find_header_fup(struct pt_packet *packet,
60 struct pt_packet_decoder *decoder)
61 {
62 if (!packet || !decoder)
63 return -pte_internal;
64
65 for (;;) {
66 int errcode;
67
68 errcode = pt_pkt_next(decoder, packet, sizeof(*packet));
69 if (errcode < 0)
70 return errcode;
71
72 switch (packet->type) {
73 default:
74 /* Ignore the packet. */
75 break;
76
77 case ppt_psbend:
78 /* There's no FUP in here. */
79 return 0;
80
81 case ppt_fup:
82 /* Found it. */
83 return 1;
84 }
85 }
86 }
87
pt_qry_decoder_init(struct pt_query_decoder * decoder,const struct pt_config * config)88 int pt_qry_decoder_init(struct pt_query_decoder *decoder,
89 const struct pt_config *config)
90 {
91 int errcode;
92
93 if (!decoder)
94 return -pte_invalid;
95
96 memset(decoder, 0, sizeof(*decoder));
97
98 errcode = pt_config_from_user(&decoder->config, config);
99 if (errcode < 0)
100 return errcode;
101
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);
108
109 return 0;
110 }
111
pt_qry_alloc_decoder(const struct pt_config * config)112 struct pt_query_decoder *pt_qry_alloc_decoder(const struct pt_config *config)
113 {
114 struct pt_query_decoder *decoder;
115 int errcode;
116
117 decoder = malloc(sizeof(*decoder));
118 if (!decoder)
119 return NULL;
120
121 errcode = pt_qry_decoder_init(decoder, config);
122 if (errcode < 0) {
123 free(decoder);
124 return NULL;
125 }
126
127 return decoder;
128 }
129
pt_qry_decoder_fini(struct pt_query_decoder * decoder)130 void pt_qry_decoder_fini(struct pt_query_decoder *decoder)
131 {
132 (void) decoder;
133
134 /* Nothing to do. */
135 }
136
pt_qry_free_decoder(struct pt_query_decoder * decoder)137 void pt_qry_free_decoder(struct pt_query_decoder *decoder)
138 {
139 pt_qry_decoder_fini(decoder);
140 free(decoder);
141 }
142
pt_qry_reset(struct pt_query_decoder * decoder)143 static void pt_qry_reset(struct pt_query_decoder *decoder)
144 {
145 if (!decoder)
146 return;
147
148 decoder->enabled = 0;
149 decoder->consume_packet = 0;
150 decoder->event = NULL;
151
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);
158 }
159
pt_qry_will_event(const struct pt_query_decoder * decoder)160 static int pt_qry_will_event(const struct pt_query_decoder *decoder)
161 {
162 const struct pt_decoder_function *dfun;
163
164 if (!decoder)
165 return -pte_internal;
166
167 dfun = decoder->next;
168 if (!dfun)
169 return 0;
170
171 if (dfun->flags & pdff_event)
172 return 1;
173
174 if (dfun->flags & pdff_psbend)
175 return pt_evq_pending(&decoder->evq, evb_psbend);
176
177 if (dfun->flags & pdff_tip)
178 return pt_evq_pending(&decoder->evq, evb_tip);
179
180 if (dfun->flags & pdff_fup)
181 return pt_evq_pending(&decoder->evq, evb_fup);
182
183 return 0;
184 }
185
pt_qry_will_eos(const struct pt_query_decoder * decoder)186 static int pt_qry_will_eos(const struct pt_query_decoder *decoder)
187 {
188 const struct pt_decoder_function *dfun;
189 int errcode;
190
191 if (!decoder)
192 return -pte_internal;
193
194 dfun = decoder->next;
195 if (dfun)
196 return 0;
197
198 /* The decoding function may be NULL for two reasons:
199 *
200 * - we ran out of trace
201 * - we ran into a fetch error such as -pte_bad_opc
202 *
203 * Let's fetch again.
204 */
205 errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config);
206 return errcode == -pte_eos;
207 }
208
pt_qry_status_flags(const struct pt_query_decoder * decoder)209 static int pt_qry_status_flags(const struct pt_query_decoder *decoder)
210 {
211 int flags = 0;
212
213 if (!decoder)
214 return -pte_internal;
215
216 /* Some packets force out TNT and any deferred TIPs in order to
217 * establish the correct context for the subsequent packet.
218 *
219 * Users are expected to first navigate to the correct code region
220 * by using up the cached TNT bits before interpreting any subsequent
221 * packets.
222 *
223 * We do need to read ahead in order to signal upcoming events. We may
224 * have already decoded those packets while our user has not navigated
225 * to the correct code region, yet.
226 *
227 * In order to have our user use up the cached TNT bits first, we do
228 * not indicate the next event until the TNT cache is empty.
229 */
230 if (pt_tnt_cache_is_empty(&decoder->tnt)) {
231 if (pt_qry_will_event(decoder))
232 flags |= pts_event_pending;
233
234 if (pt_qry_will_eos(decoder))
235 flags |= pts_eos;
236 }
237
238 return flags;
239 }
240
pt_qry_provoke_fetch_error(const struct pt_query_decoder * decoder)241 static int pt_qry_provoke_fetch_error(const struct pt_query_decoder *decoder)
242 {
243 const struct pt_decoder_function *dfun;
244 int errcode;
245
246 if (!decoder)
247 return -pte_internal;
248
249 /* Repeat the decoder fetch to reproduce the error. */
250 errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config);
251 if (errcode < 0)
252 return errcode;
253
254 /* We must get some error or something's wrong. */
255 return -pte_internal;
256 }
257
pt_qry_read_ahead(struct pt_query_decoder * decoder)258 static int pt_qry_read_ahead(struct pt_query_decoder *decoder)
259 {
260 if (!decoder)
261 return -pte_internal;
262
263 for (;;) {
264 const struct pt_decoder_function *dfun;
265 int errcode;
266
267 errcode = pt_df_fetch(&decoder->next, decoder->pos,
268 &decoder->config);
269 if (errcode)
270 return errcode;
271
272 dfun = decoder->next;
273 if (!dfun)
274 return -pte_internal;
275
276 if (!dfun->decode)
277 return -pte_internal;
278
279 /* We're done once we reach
280 *
281 * - a branching related packet. */
282 if (dfun->flags & (pdff_tip | pdff_tnt))
283 return 0;
284
285 /* - an event related packet. */
286 if (pt_qry_will_event(decoder))
287 return 0;
288
289 /* Decode status update packets. */
290 errcode = dfun->decode(decoder);
291 if (errcode) {
292 /* Ignore truncated status packets at the end.
293 *
294 * Move beyond the packet and clear @decoder->next to
295 * indicate that we were not able to fetch the next
296 * packet.
297 */
298 if (errcode == -pte_eos) {
299 decoder->pos = decoder->config.end;
300 decoder->next = NULL;
301 }
302
303 return errcode;
304 }
305 }
306 }
307
pt_qry_start(struct pt_query_decoder * decoder,const uint8_t * pos,uint64_t * addr)308 static int pt_qry_start(struct pt_query_decoder *decoder, const uint8_t *pos,
309 uint64_t *addr)
310 {
311 const struct pt_decoder_function *dfun;
312 int status, errcode;
313
314 if (!decoder || !pos)
315 return -pte_invalid;
316
317 pt_qry_reset(decoder);
318
319 decoder->sync = pos;
320 decoder->pos = pos;
321
322 errcode = pt_df_fetch(&decoder->next, pos, &decoder->config);
323 if (errcode)
324 return errcode;
325
326 dfun = decoder->next;
327
328 /* We do need to start at a PSB in order to initialize the state. */
329 if (dfun != &pt_decode_psb)
330 return -pte_nosync;
331
332 /* Decode the PSB+ header to initialize the state. */
333 errcode = dfun->decode(decoder);
334 if (errcode < 0)
335 return errcode;
336
337 /* Fill in the start address.
338 * We do this before reading ahead since the latter may read an
339 * adjacent PSB+ that might change the decoder's IP, causing us
340 * to skip code.
341 */
342 if (addr) {
343 status = pt_last_ip_query(addr, &decoder->ip);
344
345 /* Make sure we don't clobber it later on. */
346 if (!status)
347 addr = NULL;
348 }
349
350 /* Read ahead until the first query-relevant packet. */
351 errcode = pt_qry_read_ahead(decoder);
352 if (errcode < 0)
353 return errcode;
354
355 /* We return the current decoder status. */
356 status = pt_qry_status_flags(decoder);
357 if (status < 0)
358 return status;
359
360 errcode = pt_last_ip_query(addr, &decoder->ip);
361 if (errcode < 0) {
362 /* Indicate the missing IP in the status. */
363 if (addr)
364 status |= pts_ip_suppressed;
365 }
366
367 return status;
368 }
369
pt_qry_apply_tsc(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_tsc * packet,const struct pt_config * config)370 static int pt_qry_apply_tsc(struct pt_time *time, struct pt_time_cal *tcal,
371 const struct pt_packet_tsc *packet,
372 const struct pt_config *config)
373 {
374 int errcode;
375
376 /* We ignore configuration errors. They will result in imprecise
377 * calibration which will result in imprecise cycle-accurate timing.
378 *
379 * We currently do not track them.
380 */
381 errcode = pt_tcal_update_tsc(tcal, packet, config);
382 if (errcode < 0 && (errcode != -pte_bad_config))
383 return errcode;
384
385 /* We ignore configuration errors. They will result in imprecise
386 * timing and are tracked as packet losses in struct pt_time.
387 */
388 errcode = pt_time_update_tsc(time, packet, config);
389 if (errcode < 0 && (errcode != -pte_bad_config))
390 return errcode;
391
392 return 0;
393 }
394
pt_qry_apply_header_tsc(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_tsc * packet,const struct pt_config * config)395 static int pt_qry_apply_header_tsc(struct pt_time *time,
396 struct pt_time_cal *tcal,
397 const struct pt_packet_tsc *packet,
398 const struct pt_config *config)
399 {
400 int errcode;
401
402 /* We ignore configuration errors. They will result in imprecise
403 * calibration which will result in imprecise cycle-accurate timing.
404 *
405 * We currently do not track them.
406 */
407 errcode = pt_tcal_header_tsc(tcal, packet, config);
408 if (errcode < 0 && (errcode != -pte_bad_config))
409 return errcode;
410
411 /* We ignore configuration errors. They will result in imprecise
412 * timing and are tracked as packet losses in struct pt_time.
413 */
414 errcode = pt_time_update_tsc(time, packet, config);
415 if (errcode < 0 && (errcode != -pte_bad_config))
416 return errcode;
417
418 return 0;
419 }
420
pt_qry_apply_cbr(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_cbr * packet,const struct pt_config * config)421 static int pt_qry_apply_cbr(struct pt_time *time, struct pt_time_cal *tcal,
422 const struct pt_packet_cbr *packet,
423 const struct pt_config *config)
424 {
425 int errcode;
426
427 /* We ignore configuration errors. They will result in imprecise
428 * calibration which will result in imprecise cycle-accurate timing.
429 *
430 * We currently do not track them.
431 */
432 errcode = pt_tcal_update_cbr(tcal, packet, config);
433 if (errcode < 0 && (errcode != -pte_bad_config))
434 return errcode;
435
436 /* We ignore configuration errors. They will result in imprecise
437 * timing and are tracked as packet losses in struct pt_time.
438 */
439 errcode = pt_time_update_cbr(time, packet, config);
440 if (errcode < 0 && (errcode != -pte_bad_config))
441 return errcode;
442
443 return 0;
444 }
445
pt_qry_apply_header_cbr(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_cbr * packet,const struct pt_config * config)446 static int pt_qry_apply_header_cbr(struct pt_time *time,
447 struct pt_time_cal *tcal,
448 const struct pt_packet_cbr *packet,
449 const struct pt_config *config)
450 {
451 int errcode;
452
453 /* We ignore configuration errors. They will result in imprecise
454 * calibration which will result in imprecise cycle-accurate timing.
455 *
456 * We currently do not track them.
457 */
458 errcode = pt_tcal_header_cbr(tcal, packet, config);
459 if (errcode < 0 && (errcode != -pte_bad_config))
460 return errcode;
461
462 /* We ignore configuration errors. They will result in imprecise
463 * timing and are tracked as packet losses in struct pt_time.
464 */
465 errcode = pt_time_update_cbr(time, packet, config);
466 if (errcode < 0 && (errcode != -pte_bad_config))
467 return errcode;
468
469 return 0;
470 }
471
pt_qry_apply_tma(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_tma * packet,const struct pt_config * config)472 static int pt_qry_apply_tma(struct pt_time *time, struct pt_time_cal *tcal,
473 const struct pt_packet_tma *packet,
474 const struct pt_config *config)
475 {
476 int errcode;
477
478 /* We ignore configuration errors. They will result in imprecise
479 * calibration which will result in imprecise cycle-accurate timing.
480 *
481 * We currently do not track them.
482 */
483 errcode = pt_tcal_update_tma(tcal, packet, config);
484 if (errcode < 0 && (errcode != -pte_bad_config))
485 return errcode;
486
487 /* We ignore configuration errors. They will result in imprecise
488 * timing and are tracked as packet losses in struct pt_time.
489 */
490 errcode = pt_time_update_tma(time, packet, config);
491 if (errcode < 0 && (errcode != -pte_bad_config))
492 return errcode;
493
494 return 0;
495 }
496
pt_qry_apply_mtc(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_mtc * packet,const struct pt_config * config)497 static int pt_qry_apply_mtc(struct pt_time *time, struct pt_time_cal *tcal,
498 const struct pt_packet_mtc *packet,
499 const struct pt_config *config)
500 {
501 int errcode;
502
503 /* We ignore configuration errors. They will result in imprecise
504 * calibration which will result in imprecise cycle-accurate timing.
505 *
506 * We currently do not track them.
507 */
508 errcode = pt_tcal_update_mtc(tcal, packet, config);
509 if (errcode < 0 && (errcode != -pte_bad_config))
510 return errcode;
511
512 /* We ignore configuration errors. They will result in imprecise
513 * timing and are tracked as packet losses in struct pt_time.
514 */
515 errcode = pt_time_update_mtc(time, packet, config);
516 if (errcode < 0 && (errcode != -pte_bad_config))
517 return errcode;
518
519 return 0;
520 }
521
pt_qry_apply_cyc(struct pt_time * time,struct pt_time_cal * tcal,const struct pt_packet_cyc * packet,const struct pt_config * config)522 static int pt_qry_apply_cyc(struct pt_time *time, struct pt_time_cal *tcal,
523 const struct pt_packet_cyc *packet,
524 const struct pt_config *config)
525 {
526 uint64_t fcr;
527 int errcode;
528
529 /* We ignore configuration errors. They will result in imprecise
530 * calibration which will result in imprecise cycle-accurate timing.
531 *
532 * We currently do not track them.
533 */
534 errcode = pt_tcal_update_cyc(tcal, packet, config);
535 if (errcode < 0 && (errcode != -pte_bad_config))
536 return errcode;
537
538 /* We need the FastCounter to Cycles ratio below. Fall back to
539 * an invalid ratio of 0 if calibration has not kicked in, yet.
540 *
541 * This will be tracked as packet loss in struct pt_time.
542 */
543 errcode = pt_tcal_fcr(&fcr, tcal);
544 if (errcode < 0) {
545 if (errcode == -pte_no_time)
546 fcr = 0ull;
547 else
548 return errcode;
549 }
550
551 /* We ignore configuration errors. They will result in imprecise
552 * timing and are tracked as packet losses in struct pt_time.
553 */
554 errcode = pt_time_update_cyc(time, packet, config, fcr);
555 if (errcode < 0 && (errcode != -pte_bad_config))
556 return errcode;
557
558 return 0;
559 }
560
pt_qry_sync_forward(struct pt_query_decoder * decoder,uint64_t * ip)561 int pt_qry_sync_forward(struct pt_query_decoder *decoder, uint64_t *ip)
562 {
563 const uint8_t *pos, *sync, *begin;
564 ptrdiff_t space;
565 int errcode;
566
567 if (!decoder)
568 return -pte_invalid;
569
570 begin = decoder->config.begin;
571 sync = decoder->sync;
572 pos = decoder->pos;
573 if (!pos)
574 pos = begin;
575
576 if (pos == sync)
577 pos += ptps_psb;
578
579 if (pos < begin)
580 return -pte_internal;
581
582 /* Start a bit earlier so we find PSB that have been partially consumed
583 * by a preceding packet.
584 */
585 space = pos - begin;
586 if (ptps_psb <= space)
587 space = ptps_psb - 1;
588
589 pos -= space;
590
591 errcode = pt_sync_forward(&sync, pos, &decoder->config);
592 if (errcode < 0)
593 return errcode;
594
595 return pt_qry_start(decoder, sync, ip);
596 }
597
pt_qry_sync_backward(struct pt_query_decoder * decoder,uint64_t * ip)598 int pt_qry_sync_backward(struct pt_query_decoder *decoder, uint64_t *ip)
599 {
600 const uint8_t *start, *sync;
601 int errcode;
602
603 if (!decoder)
604 return -pte_invalid;
605
606 start = decoder->pos;
607 if (!start)
608 start = decoder->config.end;
609
610 sync = start;
611 for (;;) {
612 errcode = pt_sync_backward(&sync, sync, &decoder->config);
613 if (errcode < 0)
614 return errcode;
615
616 errcode = pt_qry_start(decoder, sync, ip);
617 if (errcode < 0) {
618 /* Ignore incomplete trace segments at the end. We need
619 * a full PSB+ to start decoding.
620 */
621 if (errcode == -pte_eos)
622 continue;
623
624 return errcode;
625 }
626
627 /* An empty trace segment in the middle of the trace might bring
628 * us back to where we started.
629 *
630 * We're done when we reached a new position.
631 */
632 if (decoder->pos != start)
633 break;
634 }
635
636 return 0;
637 }
638
pt_qry_sync_set(struct pt_query_decoder * decoder,uint64_t * ip,uint64_t offset)639 int pt_qry_sync_set(struct pt_query_decoder *decoder, uint64_t *ip,
640 uint64_t offset)
641 {
642 const uint8_t *sync, *pos;
643 int errcode;
644
645 if (!decoder)
646 return -pte_invalid;
647
648 pos = decoder->config.begin + offset;
649
650 errcode = pt_sync_set(&sync, pos, &decoder->config);
651 if (errcode < 0)
652 return errcode;
653
654 return pt_qry_start(decoder, sync, ip);
655 }
656
pt_qry_get_offset(const struct pt_query_decoder * decoder,uint64_t * offset)657 int pt_qry_get_offset(const struct pt_query_decoder *decoder, uint64_t *offset)
658 {
659 const uint8_t *begin, *pos;
660
661 if (!decoder || !offset)
662 return -pte_invalid;
663
664 begin = decoder->config.begin;
665 pos = decoder->pos;
666
667 if (!pos)
668 return -pte_nosync;
669
670 *offset = (uint64_t) (int64_t) (pos - begin);
671 return 0;
672 }
673
pt_qry_get_sync_offset(const struct pt_query_decoder * decoder,uint64_t * offset)674 int pt_qry_get_sync_offset(const struct pt_query_decoder *decoder,
675 uint64_t *offset)
676 {
677 const uint8_t *begin, *sync;
678
679 if (!decoder || !offset)
680 return -pte_invalid;
681
682 begin = decoder->config.begin;
683 sync = decoder->sync;
684
685 if (!sync)
686 return -pte_nosync;
687
688 *offset = (uint64_t) (int64_t) (sync - begin);
689 return 0;
690 }
691
692 const struct pt_config *
pt_qry_get_config(const struct pt_query_decoder * decoder)693 pt_qry_get_config(const struct pt_query_decoder *decoder)
694 {
695 if (!decoder)
696 return NULL;
697
698 return &decoder->config;
699 }
700
pt_qry_cache_tnt(struct pt_query_decoder * decoder)701 static int pt_qry_cache_tnt(struct pt_query_decoder *decoder)
702 {
703 int errcode;
704
705 if (!decoder)
706 return -pte_internal;
707
708 for (;;) {
709 const struct pt_decoder_function *dfun;
710
711 dfun = decoder->next;
712 if (!dfun)
713 return pt_qry_provoke_fetch_error(decoder);
714
715 if (!dfun->decode)
716 return -pte_internal;
717
718 /* There's an event ahead of us. */
719 if (pt_qry_will_event(decoder))
720 return -pte_bad_query;
721
722 /* Diagnose a TIP that has not been part of an event. */
723 if (dfun->flags & pdff_tip)
724 return -pte_bad_query;
725
726 /* Clear the decoder's current event so we know when we
727 * accidentally skipped an event.
728 */
729 decoder->event = NULL;
730
731 /* Apply the decoder function. */
732 errcode = dfun->decode(decoder);
733 if (errcode)
734 return errcode;
735
736 /* If we skipped an event, we're in trouble. */
737 if (decoder->event)
738 return -pte_event_ignored;
739
740 /* We're done when we decoded a TNT packet. */
741 if (dfun->flags & pdff_tnt)
742 break;
743
744 /* Read ahead until the next query-relevant packet. */
745 errcode = pt_qry_read_ahead(decoder);
746 if (errcode)
747 return errcode;
748 }
749
750 /* Preserve the time at the TNT packet. */
751 decoder->last_time = decoder->time;
752
753 /* Read ahead until the next query-relevant packet. */
754 errcode = pt_qry_read_ahead(decoder);
755 if ((errcode < 0) && (errcode != -pte_eos))
756 return errcode;
757
758 return 0;
759 }
760
pt_qry_cond_branch(struct pt_query_decoder * decoder,int * taken)761 int pt_qry_cond_branch(struct pt_query_decoder *decoder, int *taken)
762 {
763 int errcode, query;
764
765 if (!decoder || !taken)
766 return -pte_invalid;
767
768 /* We cache the latest tnt packet in the decoder. Let's re-fill the
769 * cache in case it is empty.
770 */
771 if (pt_tnt_cache_is_empty(&decoder->tnt)) {
772 errcode = pt_qry_cache_tnt(decoder);
773 if (errcode < 0)
774 return errcode;
775 }
776
777 query = pt_tnt_cache_query(&decoder->tnt);
778 if (query < 0)
779 return query;
780
781 *taken = query;
782
783 return pt_qry_status_flags(decoder);
784 }
785
pt_qry_indirect_branch(struct pt_query_decoder * decoder,uint64_t * addr)786 int pt_qry_indirect_branch(struct pt_query_decoder *decoder, uint64_t *addr)
787 {
788 int errcode, flags;
789
790 if (!decoder || !addr)
791 return -pte_invalid;
792
793 flags = 0;
794 for (;;) {
795 const struct pt_decoder_function *dfun;
796
797 dfun = decoder->next;
798 if (!dfun)
799 return pt_qry_provoke_fetch_error(decoder);
800
801 if (!dfun->decode)
802 return -pte_internal;
803
804 /* There's an event ahead of us. */
805 if (pt_qry_will_event(decoder))
806 return -pte_bad_query;
807
808 /* Clear the decoder's current event so we know when we
809 * accidentally skipped an event.
810 */
811 decoder->event = NULL;
812
813 /* We may see a single TNT packet if the current tnt is empty.
814 *
815 * If we see a TNT while the current tnt is not empty, it means
816 * that our user got out of sync. Let's report no data and hope
817 * that our user is able to re-sync.
818 */
819 if ((dfun->flags & pdff_tnt) &&
820 !pt_tnt_cache_is_empty(&decoder->tnt))
821 return -pte_bad_query;
822
823 /* Apply the decoder function. */
824 errcode = dfun->decode(decoder);
825 if (errcode)
826 return errcode;
827
828 /* If we skipped an event, we're in trouble. */
829 if (decoder->event)
830 return -pte_event_ignored;
831
832 /* We're done when we found a TIP packet that isn't part of an
833 * event.
834 */
835 if (dfun->flags & pdff_tip) {
836 uint64_t ip;
837
838 /* We already decoded it, so the branch destination
839 * is stored in the decoder's last ip.
840 */
841 errcode = pt_last_ip_query(&ip, &decoder->ip);
842 if (errcode < 0)
843 flags |= pts_ip_suppressed;
844 else
845 *addr = ip;
846
847 break;
848 }
849
850 /* Read ahead until the next query-relevant packet. */
851 errcode = pt_qry_read_ahead(decoder);
852 if (errcode)
853 return errcode;
854 }
855
856 /* Preserve the time at the TIP packet. */
857 decoder->last_time = decoder->time;
858
859 /* Read ahead until the next query-relevant packet. */
860 errcode = pt_qry_read_ahead(decoder);
861 if ((errcode < 0) && (errcode != -pte_eos))
862 return errcode;
863
864 flags |= pt_qry_status_flags(decoder);
865
866 return flags;
867 }
868
pt_qry_event(struct pt_query_decoder * decoder,struct pt_event * event,size_t size)869 int pt_qry_event(struct pt_query_decoder *decoder, struct pt_event *event,
870 size_t size)
871 {
872 int errcode, flags;
873
874 if (!decoder || !event)
875 return -pte_invalid;
876
877 if (size < offsetof(struct pt_event, variant))
878 return -pte_invalid;
879
880 /* We do not allow querying for events while there are still TNT
881 * bits to consume.
882 */
883 if (!pt_tnt_cache_is_empty(&decoder->tnt))
884 return -pte_bad_query;
885
886 /* Do not provide more than we actually have. */
887 if (sizeof(*event) < size)
888 size = sizeof(*event);
889
890 flags = 0;
891 for (;;) {
892 const struct pt_decoder_function *dfun;
893
894 dfun = decoder->next;
895 if (!dfun)
896 return pt_qry_provoke_fetch_error(decoder);
897
898 if (!dfun->decode)
899 return -pte_internal;
900
901 /* We must not see a TIP or TNT packet unless it belongs
902 * to an event.
903 *
904 * If we see one, it means that our user got out of sync.
905 * Let's report no data and hope that our user is able
906 * to re-sync.
907 */
908 if ((dfun->flags & (pdff_tip | pdff_tnt)) &&
909 !pt_qry_will_event(decoder))
910 return -pte_bad_query;
911
912 /* Clear the decoder's current event so we know when decoding
913 * produces a new event.
914 */
915 decoder->event = NULL;
916
917 /* Apply any other decoder function. */
918 errcode = dfun->decode(decoder);
919 if (errcode)
920 return errcode;
921
922 /* Check if there has been an event.
923 *
924 * Some packets may result in events in some but not in all
925 * configurations.
926 */
927 if (decoder->event) {
928 (void) memcpy(event, decoder->event, size);
929 break;
930 }
931
932 /* Read ahead until the next query-relevant packet. */
933 errcode = pt_qry_read_ahead(decoder);
934 if (errcode)
935 return errcode;
936 }
937
938 /* Preserve the time at the event. */
939 decoder->last_time = decoder->time;
940
941 /* Read ahead until the next query-relevant packet. */
942 errcode = pt_qry_read_ahead(decoder);
943 if ((errcode < 0) && (errcode != -pte_eos))
944 return errcode;
945
946 flags |= pt_qry_status_flags(decoder);
947
948 return flags;
949 }
950
pt_qry_time(struct pt_query_decoder * decoder,uint64_t * time,uint32_t * lost_mtc,uint32_t * lost_cyc)951 int pt_qry_time(struct pt_query_decoder *decoder, uint64_t *time,
952 uint32_t *lost_mtc, uint32_t *lost_cyc)
953 {
954 if (!decoder || !time)
955 return -pte_invalid;
956
957 return pt_time_query_tsc(time, lost_mtc, lost_cyc, &decoder->last_time);
958 }
959
pt_qry_core_bus_ratio(struct pt_query_decoder * decoder,uint32_t * cbr)960 int pt_qry_core_bus_ratio(struct pt_query_decoder *decoder, uint32_t *cbr)
961 {
962 if (!decoder || !cbr)
963 return -pte_invalid;
964
965 return pt_time_query_cbr(cbr, &decoder->last_time);
966 }
967
pt_qry_event_time(struct pt_event * event,const struct pt_query_decoder * decoder)968 static int pt_qry_event_time(struct pt_event *event,
969 const struct pt_query_decoder *decoder)
970 {
971 int errcode;
972
973 if (!event || !decoder)
974 return -pte_internal;
975
976 errcode = pt_time_query_tsc(&event->tsc, &event->lost_mtc,
977 &event->lost_cyc, &decoder->time);
978 if (errcode < 0) {
979 if (errcode != -pte_no_time)
980 return errcode;
981 } else
982 event->has_tsc = 1;
983
984 return 0;
985 }
986
pt_qry_decode_unknown(struct pt_query_decoder * decoder)987 int pt_qry_decode_unknown(struct pt_query_decoder *decoder)
988 {
989 struct pt_packet packet;
990 int size;
991
992 if (!decoder)
993 return -pte_internal;
994
995 size = pt_pkt_read_unknown(&packet, decoder->pos, &decoder->config);
996 if (size < 0)
997 return size;
998
999 decoder->pos += size;
1000 return 0;
1001 }
1002
pt_qry_decode_pad(struct pt_query_decoder * decoder)1003 int pt_qry_decode_pad(struct pt_query_decoder *decoder)
1004 {
1005 if (!decoder)
1006 return -pte_internal;
1007
1008 decoder->pos += ptps_pad;
1009
1010 return 0;
1011 }
1012
pt_qry_read_psb_header(struct pt_query_decoder * decoder)1013 static int pt_qry_read_psb_header(struct pt_query_decoder *decoder)
1014 {
1015 if (!decoder)
1016 return -pte_internal;
1017
1018 pt_last_ip_init(&decoder->ip);
1019
1020 for (;;) {
1021 const struct pt_decoder_function *dfun;
1022 int errcode;
1023
1024 errcode = pt_df_fetch(&decoder->next, decoder->pos,
1025 &decoder->config);
1026 if (errcode)
1027 return errcode;
1028
1029 dfun = decoder->next;
1030 if (!dfun)
1031 return -pte_internal;
1032
1033 /* We're done once we reach an psbend packet. */
1034 if (dfun->flags & pdff_psbend)
1035 return 0;
1036
1037 if (!dfun->header)
1038 return -pte_bad_context;
1039
1040 errcode = dfun->header(decoder);
1041 if (errcode)
1042 return errcode;
1043 }
1044 }
1045
pt_qry_decode_psb(struct pt_query_decoder * decoder)1046 int pt_qry_decode_psb(struct pt_query_decoder *decoder)
1047 {
1048 const uint8_t *pos;
1049 int size, errcode;
1050
1051 if (!decoder)
1052 return -pte_internal;
1053
1054 pos = decoder->pos;
1055
1056 size = pt_pkt_read_psb(pos, &decoder->config);
1057 if (size < 0)
1058 return size;
1059
1060 errcode = pt_tcal_update_psb(&decoder->tcal, &decoder->config);
1061 if (errcode < 0)
1062 return errcode;
1063
1064 decoder->pos += size;
1065
1066 errcode = pt_qry_read_psb_header(decoder);
1067 if (errcode < 0) {
1068 /* Move back to the PSB so we have a chance to recover and
1069 * continue decoding.
1070 */
1071 decoder->pos = pos;
1072
1073 /* Clear any PSB+ events that have already been queued. */
1074 (void) pt_evq_clear(&decoder->evq, evb_psbend);
1075
1076 /* Reset the decoder's decode function. */
1077 decoder->next = &pt_decode_psb;
1078
1079 return errcode;
1080 }
1081
1082 /* The next packet following the PSB header will be of type PSBEND.
1083 *
1084 * Decoding this packet will publish the PSB events what have been
1085 * accumulated while reading the PSB header.
1086 */
1087 return 0;
1088 }
1089
pt_qry_event_ip(uint64_t * ip,struct pt_event * event,const struct pt_query_decoder * decoder)1090 static int pt_qry_event_ip(uint64_t *ip, struct pt_event *event,
1091 const struct pt_query_decoder *decoder)
1092 {
1093 int errcode;
1094
1095 if (!decoder)
1096 return -pte_internal;
1097
1098 errcode = pt_last_ip_query(ip, &decoder->ip);
1099 if (errcode < 0) {
1100 switch (pt_errcode(errcode)) {
1101 case pte_noip:
1102 case pte_ip_suppressed:
1103 event->ip_suppressed = 1;
1104 break;
1105
1106 default:
1107 return errcode;
1108 }
1109 }
1110
1111 return 0;
1112 }
1113
1114 /* Decode a generic IP packet.
1115 *
1116 * Returns the number of bytes read, on success.
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.
1119 */
pt_qry_decode_ip(struct pt_query_decoder * decoder)1120 static int pt_qry_decode_ip(struct pt_query_decoder *decoder)
1121 {
1122 struct pt_packet_ip packet;
1123 int errcode, size;
1124
1125 if (!decoder)
1126 return -pte_internal;
1127
1128 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config);
1129 if (size < 0)
1130 return size;
1131
1132 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config);
1133 if (errcode < 0)
1134 return errcode;
1135
1136 /* We do not update the decoder's position, yet. */
1137
1138 return size;
1139 }
1140
pt_qry_consume_tip(struct pt_query_decoder * decoder,int size)1141 static int pt_qry_consume_tip(struct pt_query_decoder *decoder, int size)
1142 {
1143 if (!decoder)
1144 return -pte_internal;
1145
1146 decoder->pos += size;
1147 return 0;
1148 }
1149
pt_qry_event_tip(struct pt_event * ev,struct pt_query_decoder * decoder)1150 static int pt_qry_event_tip(struct pt_event *ev,
1151 struct pt_query_decoder *decoder)
1152 {
1153 if (!ev || !decoder)
1154 return -pte_internal;
1155
1156 switch (ev->type) {
1157 case ptev_async_branch:
1158 decoder->consume_packet = 1;
1159
1160 return pt_qry_event_ip(&ev->variant.async_branch.to, ev,
1161 decoder);
1162
1163 case ptev_async_paging:
1164 return pt_qry_event_ip(&ev->variant.async_paging.ip, ev,
1165 decoder);
1166
1167 case ptev_async_vmcs:
1168 return pt_qry_event_ip(&ev->variant.async_vmcs.ip, ev,
1169 decoder);
1170
1171 case ptev_exec_mode:
1172 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev,
1173 decoder);
1174
1175 default:
1176 break;
1177 }
1178
1179 return -pte_bad_context;
1180 }
1181
pt_qry_decode_tip(struct pt_query_decoder * decoder)1182 int pt_qry_decode_tip(struct pt_query_decoder *decoder)
1183 {
1184 struct pt_event *ev;
1185 int size, errcode;
1186
1187 if (!decoder)
1188 return -pte_internal;
1189
1190 size = pt_qry_decode_ip(decoder);
1191 if (size < 0)
1192 return size;
1193
1194 /* Process any pending events binding to TIP. */
1195 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1196 if (ev) {
1197 errcode = pt_qry_event_tip(ev, decoder);
1198 if (errcode < 0)
1199 return errcode;
1200
1201 /* Publish the event. */
1202 decoder->event = ev;
1203
1204 /* Process further pending events. */
1205 if (pt_evq_pending(&decoder->evq, evb_tip))
1206 return 0;
1207
1208 /* No further events.
1209 *
1210 * If none of the events consumed the packet, we're done.
1211 */
1212 if (!decoder->consume_packet)
1213 return 0;
1214
1215 /* We're done with this packet. Clear the flag we set previously
1216 * and consume it.
1217 */
1218 decoder->consume_packet = 0;
1219 }
1220
1221 return pt_qry_consume_tip(decoder, size);
1222 }
1223
pt_qry_decode_tnt_8(struct pt_query_decoder * decoder)1224 int pt_qry_decode_tnt_8(struct pt_query_decoder *decoder)
1225 {
1226 struct pt_packet_tnt packet;
1227 int size, errcode;
1228
1229 if (!decoder)
1230 return -pte_internal;
1231
1232 size = pt_pkt_read_tnt_8(&packet, decoder->pos, &decoder->config);
1233 if (size < 0)
1234 return size;
1235
1236 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet,
1237 &decoder->config);
1238 if (errcode < 0)
1239 return errcode;
1240
1241 decoder->pos += size;
1242 return 0;
1243 }
1244
pt_qry_decode_tnt_64(struct pt_query_decoder * decoder)1245 int pt_qry_decode_tnt_64(struct pt_query_decoder *decoder)
1246 {
1247 struct pt_packet_tnt packet;
1248 int size, errcode;
1249
1250 if (!decoder)
1251 return -pte_internal;
1252
1253 size = pt_pkt_read_tnt_64(&packet, decoder->pos, &decoder->config);
1254 if (size < 0)
1255 return size;
1256
1257 errcode = pt_tnt_cache_update_tnt(&decoder->tnt, &packet,
1258 &decoder->config);
1259 if (errcode < 0)
1260 return errcode;
1261
1262 decoder->pos += size;
1263 return 0;
1264 }
1265
pt_qry_consume_tip_pge(struct pt_query_decoder * decoder,int size)1266 static int pt_qry_consume_tip_pge(struct pt_query_decoder *decoder, int size)
1267 {
1268 if (!decoder)
1269 return -pte_internal;
1270
1271 decoder->pos += size;
1272 return 0;
1273 }
1274
pt_qry_event_tip_pge(struct pt_event * ev,const struct pt_query_decoder * decoder)1275 static int pt_qry_event_tip_pge(struct pt_event *ev,
1276 const struct pt_query_decoder *decoder)
1277 {
1278 if (!ev)
1279 return -pte_internal;
1280
1281 switch (ev->type) {
1282 case ptev_exec_mode:
1283 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder);
1284
1285 default:
1286 break;
1287 }
1288
1289 return -pte_bad_context;
1290 }
1291
pt_qry_decode_tip_pge(struct pt_query_decoder * decoder)1292 int pt_qry_decode_tip_pge(struct pt_query_decoder *decoder)
1293 {
1294 struct pt_event *ev;
1295 int size, errcode;
1296
1297 if (!decoder)
1298 return -pte_internal;
1299
1300 size = pt_qry_decode_ip(decoder);
1301 if (size < 0)
1302 return size;
1303
1304 /* We send the enable event first. This is more convenient for our users
1305 * and does not require them to either store or blindly apply other
1306 * events that might be pending.
1307 *
1308 * We use the consume packet decoder flag to indicate this.
1309 */
1310 if (!decoder->consume_packet) {
1311 /* This packet signals a standalone enabled event. */
1312 ev = pt_evq_standalone(&decoder->evq);
1313 if (!ev)
1314 return -pte_internal;
1315
1316 ev->type = ptev_enabled;
1317
1318 /* We can't afford having a suppressed IP here. */
1319 errcode = pt_last_ip_query(&ev->variant.enabled.ip,
1320 &decoder->ip);
1321 if (errcode < 0)
1322 return -pte_bad_packet;
1323
1324 errcode = pt_qry_event_time(ev, decoder);
1325 if (errcode < 0)
1326 return errcode;
1327
1328 /* Discard any cached TNT bits.
1329 *
1330 * They should have been consumed at the corresponding disable
1331 * event. If they have not, for whatever reason, discard them
1332 * now so our user does not get out of sync.
1333 */
1334 pt_tnt_cache_init(&decoder->tnt);
1335
1336 /* Process pending events next. */
1337 decoder->consume_packet = 1;
1338 decoder->enabled = 1;
1339 } else {
1340 /* Process any pending events binding to TIP. */
1341 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1342 if (ev) {
1343 errcode = pt_qry_event_tip_pge(ev, decoder);
1344 if (errcode < 0)
1345 return errcode;
1346 }
1347 }
1348
1349 /* We must have an event. Either the initial enable event or one of the
1350 * queued events.
1351 */
1352 if (!ev)
1353 return -pte_internal;
1354
1355 /* Publish the event. */
1356 decoder->event = ev;
1357
1358 /* Process further pending events. */
1359 if (pt_evq_pending(&decoder->evq, evb_tip))
1360 return 0;
1361
1362 /* We must consume the packet. */
1363 if (!decoder->consume_packet)
1364 return -pte_internal;
1365
1366 decoder->consume_packet = 0;
1367
1368 return pt_qry_consume_tip_pge(decoder, size);
1369 }
1370
pt_qry_consume_tip_pgd(struct pt_query_decoder * decoder,int size)1371 static int pt_qry_consume_tip_pgd(struct pt_query_decoder *decoder, int size)
1372 {
1373 if (!decoder)
1374 return -pte_internal;
1375
1376 decoder->enabled = 0;
1377 decoder->pos += size;
1378 return 0;
1379 }
1380
pt_qry_event_tip_pgd(struct pt_event * ev,const struct pt_query_decoder * decoder)1381 static int pt_qry_event_tip_pgd(struct pt_event *ev,
1382 const struct pt_query_decoder *decoder)
1383 {
1384 if (!ev)
1385 return -pte_internal;
1386
1387 switch (ev->type) {
1388 case ptev_async_branch: {
1389 uint64_t at;
1390
1391 /* Turn the async branch into an async disable. */
1392 at = ev->variant.async_branch.from;
1393
1394 ev->type = ptev_async_disabled;
1395 ev->variant.async_disabled.at = at;
1396
1397 return pt_qry_event_ip(&ev->variant.async_disabled.ip, ev,
1398 decoder);
1399 }
1400
1401 case ptev_async_paging:
1402 case ptev_async_vmcs:
1403 case ptev_exec_mode:
1404 /* These events are ordered after the async disable event. It
1405 * is not quite clear what IP to give them.
1406 *
1407 * If we give them the async disable's source IP, we'd make an
1408 * error if the IP is updated when applying the async disable
1409 * event.
1410 *
1411 * If we give them the async disable's destination IP, we'd make
1412 * an error if the IP is not updated when applying the async
1413 * disable event. That's what our decoders do since tracing is
1414 * likely to resume from there.
1415 *
1416 * In all cases, tracing will be disabled when those events are
1417 * applied, so we may as well suppress the IP.
1418 */
1419 ev->ip_suppressed = 1;
1420
1421 return 0;
1422
1423 default:
1424 break;
1425 }
1426
1427 return -pte_bad_context;
1428 }
1429
pt_qry_decode_tip_pgd(struct pt_query_decoder * decoder)1430 int pt_qry_decode_tip_pgd(struct pt_query_decoder *decoder)
1431 {
1432 struct pt_event *ev;
1433 int size, errcode;
1434
1435 if (!decoder)
1436 return -pte_internal;
1437
1438 size = pt_qry_decode_ip(decoder);
1439 if (size < 0)
1440 return size;
1441
1442 /* Process any pending events binding to TIP. */
1443 ev = pt_evq_dequeue(&decoder->evq, evb_tip);
1444 if (ev) {
1445 errcode = pt_qry_event_tip_pgd(ev, decoder);
1446 if (errcode < 0)
1447 return errcode;
1448 } else {
1449 /* This packet signals a standalone disabled event. */
1450 ev = pt_evq_standalone(&decoder->evq);
1451 if (!ev)
1452 return -pte_internal;
1453 ev->type = ptev_disabled;
1454
1455 errcode = pt_qry_event_ip(&ev->variant.disabled.ip, ev,
1456 decoder);
1457 if (errcode < 0)
1458 return errcode;
1459
1460 errcode = pt_qry_event_time(ev, decoder);
1461 if (errcode < 0)
1462 return errcode;
1463 }
1464
1465 /* We must have an event. Either the initial enable event or one of the
1466 * queued events.
1467 */
1468 if (!ev)
1469 return -pte_internal;
1470
1471 /* Publish the event. */
1472 decoder->event = ev;
1473
1474 /* Process further pending events. */
1475 if (pt_evq_pending(&decoder->evq, evb_tip))
1476 return 0;
1477
1478 return pt_qry_consume_tip_pgd(decoder, size);
1479 }
1480
pt_qry_consume_fup(struct pt_query_decoder * decoder,int size)1481 static int pt_qry_consume_fup(struct pt_query_decoder *decoder, int size)
1482 {
1483 if (!decoder)
1484 return -pte_internal;
1485
1486 decoder->pos += size;
1487 return 0;
1488 }
1489
scan_for_erratum_bdm70(struct pt_packet_decoder * decoder)1490 static int scan_for_erratum_bdm70(struct pt_packet_decoder *decoder)
1491 {
1492 for (;;) {
1493 struct pt_packet packet;
1494 int errcode;
1495
1496 errcode = pt_pkt_next(decoder, &packet, sizeof(packet));
1497 if (errcode < 0) {
1498 /* Running out of packets is not an error. */
1499 if (errcode == -pte_eos)
1500 errcode = 0;
1501
1502 return errcode;
1503 }
1504
1505 switch (packet.type) {
1506 default:
1507 /* All other packets cancel our search.
1508 *
1509 * We do not enumerate those packets since we also
1510 * want to include new packets.
1511 */
1512 return 0;
1513
1514 case ppt_tip_pge:
1515 /* We found it - the erratum applies. */
1516 return 1;
1517
1518 case ppt_pad:
1519 case ppt_tsc:
1520 case ppt_cbr:
1521 case ppt_psbend:
1522 case ppt_pip:
1523 case ppt_mode:
1524 case ppt_vmcs:
1525 case ppt_tma:
1526 case ppt_mtc:
1527 case ppt_cyc:
1528 case ppt_mnt:
1529 /* Intentionally skip a few packets. */
1530 continue;
1531 }
1532 }
1533 }
1534
check_erratum_bdm70(const uint8_t * pos,const struct pt_config * config)1535 static int check_erratum_bdm70(const uint8_t *pos,
1536 const struct pt_config *config)
1537 {
1538 struct pt_packet_decoder decoder;
1539 int errcode;
1540
1541 if (!pos || !config)
1542 return -pte_internal;
1543
1544 errcode = pt_pkt_decoder_init(&decoder, config);
1545 if (errcode < 0)
1546 return errcode;
1547
1548 errcode = pt_pkt_sync_set(&decoder, (uint64_t) (pos - config->begin));
1549 if (errcode >= 0)
1550 errcode = scan_for_erratum_bdm70(&decoder);
1551
1552 pt_pkt_decoder_fini(&decoder);
1553 return errcode;
1554 }
1555
pt_qry_header_fup(struct pt_query_decoder * decoder)1556 int pt_qry_header_fup(struct pt_query_decoder *decoder)
1557 {
1558 struct pt_packet_ip packet;
1559 int errcode, size;
1560
1561 if (!decoder)
1562 return -pte_internal;
1563
1564 size = pt_pkt_read_ip(&packet, decoder->pos, &decoder->config);
1565 if (size < 0)
1566 return size;
1567
1568 if (decoder->config.errata.bdm70 && !decoder->enabled) {
1569 errcode = check_erratum_bdm70(decoder->pos + size,
1570 &decoder->config);
1571 if (errcode < 0)
1572 return errcode;
1573
1574 if (errcode)
1575 return pt_qry_consume_fup(decoder, size);
1576 }
1577
1578 errcode = pt_last_ip_update_ip(&decoder->ip, &packet, &decoder->config);
1579 if (errcode < 0)
1580 return errcode;
1581
1582 /* Tracing is enabled if we have an IP in the header. */
1583 if (packet.ipc != pt_ipc_suppressed)
1584 decoder->enabled = 1;
1585
1586 return pt_qry_consume_fup(decoder, size);
1587 }
1588
pt_qry_event_fup(struct pt_event * ev,struct pt_query_decoder * decoder)1589 static int pt_qry_event_fup(struct pt_event *ev,
1590 struct pt_query_decoder *decoder)
1591 {
1592 if (!ev || !decoder)
1593 return -pte_internal;
1594
1595 switch (ev->type) {
1596 case ptev_overflow:
1597 decoder->consume_packet = 1;
1598
1599 /* We can't afford having a suppressed IP here. */
1600 return pt_last_ip_query(&ev->variant.overflow.ip,
1601 &decoder->ip);
1602
1603 case ptev_tsx:
1604 if (!(ev->variant.tsx.aborted))
1605 decoder->consume_packet = 1;
1606
1607 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder);
1608
1609 case ptev_exstop:
1610 decoder->consume_packet = 1;
1611
1612 return pt_qry_event_ip(&ev->variant.exstop.ip, ev, decoder);
1613
1614 case ptev_mwait:
1615 decoder->consume_packet = 1;
1616
1617 return pt_qry_event_ip(&ev->variant.mwait.ip, ev, decoder);
1618
1619 case ptev_ptwrite:
1620 decoder->consume_packet = 1;
1621
1622 return pt_qry_event_ip(&ev->variant.ptwrite.ip, ev, decoder);
1623
1624 default:
1625 break;
1626 }
1627
1628 return -pte_internal;
1629 }
1630
pt_qry_decode_fup(struct pt_query_decoder * decoder)1631 int pt_qry_decode_fup(struct pt_query_decoder *decoder)
1632 {
1633 struct pt_event *ev;
1634 int size, errcode;
1635
1636 if (!decoder)
1637 return -pte_internal;
1638
1639 size = pt_qry_decode_ip(decoder);
1640 if (size < 0)
1641 return size;
1642
1643 /* Process any pending events binding to FUP. */
1644 ev = pt_evq_dequeue(&decoder->evq, evb_fup);
1645 if (ev) {
1646 errcode = pt_qry_event_fup(ev, decoder);
1647 if (errcode < 0)
1648 return errcode;
1649
1650 /* Publish the event. */
1651 decoder->event = ev;
1652
1653 /* Process further pending events. */
1654 if (pt_evq_pending(&decoder->evq, evb_fup))
1655 return 0;
1656
1657 /* No further events.
1658 *
1659 * If none of the events consumed the packet, we're done.
1660 */
1661 if (!decoder->consume_packet)
1662 return 0;
1663
1664 /* We're done with this packet. Clear the flag we set previously
1665 * and consume it.
1666 */
1667 decoder->consume_packet = 0;
1668 } else {
1669 /* FUP indicates an async branch event; it binds to TIP.
1670 *
1671 * We do need an IP in this case.
1672 */
1673 uint64_t ip;
1674
1675 errcode = pt_last_ip_query(&ip, &decoder->ip);
1676 if (errcode < 0)
1677 return errcode;
1678
1679 ev = pt_evq_enqueue(&decoder->evq, evb_tip);
1680 if (!ev)
1681 return -pte_nomem;
1682
1683 ev->type = ptev_async_branch;
1684 ev->variant.async_branch.from = ip;
1685
1686 errcode = pt_qry_event_time(ev, decoder);
1687 if (errcode < 0)
1688 return errcode;
1689 }
1690
1691 return pt_qry_consume_fup(decoder, size);
1692 }
1693
pt_qry_decode_pip(struct pt_query_decoder * decoder)1694 int pt_qry_decode_pip(struct pt_query_decoder *decoder)
1695 {
1696 struct pt_packet_pip packet;
1697 struct pt_event *event;
1698 int size, errcode;
1699
1700 if (!decoder)
1701 return -pte_internal;
1702
1703 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config);
1704 if (size < 0)
1705 return size;
1706
1707 /* Paging events are either standalone or bind to the same TIP packet
1708 * as an in-flight async branch event.
1709 */
1710 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch);
1711 if (!event) {
1712 event = pt_evq_standalone(&decoder->evq);
1713 if (!event)
1714 return -pte_internal;
1715 event->type = ptev_paging;
1716 event->variant.paging.cr3 = packet.cr3;
1717 event->variant.paging.non_root = packet.nr;
1718
1719 decoder->event = event;
1720 } else {
1721 event = pt_evq_enqueue(&decoder->evq, evb_tip);
1722 if (!event)
1723 return -pte_nomem;
1724
1725 event->type = ptev_async_paging;
1726 event->variant.async_paging.cr3 = packet.cr3;
1727 event->variant.async_paging.non_root = packet.nr;
1728 }
1729
1730 errcode = pt_qry_event_time(event, decoder);
1731 if (errcode < 0)
1732 return errcode;
1733
1734 decoder->pos += size;
1735 return 0;
1736 }
1737
pt_qry_header_pip(struct pt_query_decoder * decoder)1738 int pt_qry_header_pip(struct pt_query_decoder *decoder)
1739 {
1740 struct pt_packet_pip packet;
1741 struct pt_event *event;
1742 int size;
1743
1744 if (!decoder)
1745 return -pte_internal;
1746
1747 size = pt_pkt_read_pip(&packet, decoder->pos, &decoder->config);
1748 if (size < 0)
1749 return size;
1750
1751 /* Paging events are reported at the end of the PSB. */
1752 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
1753 if (!event)
1754 return -pte_nomem;
1755
1756 event->type = ptev_async_paging;
1757 event->variant.async_paging.cr3 = packet.cr3;
1758 event->variant.async_paging.non_root = packet.nr;
1759
1760 decoder->pos += size;
1761 return 0;
1762 }
1763
pt_qry_event_psbend(struct pt_event * ev,struct pt_query_decoder * decoder)1764 static int pt_qry_event_psbend(struct pt_event *ev,
1765 struct pt_query_decoder *decoder)
1766 {
1767 int errcode;
1768
1769 if (!ev || !decoder)
1770 return -pte_internal;
1771
1772 /* PSB+ events are status updates. */
1773 ev->status_update = 1;
1774
1775 errcode = pt_qry_event_time(ev, decoder);
1776 if (errcode < 0)
1777 return errcode;
1778
1779 switch (ev->type) {
1780 case ptev_async_paging:
1781 return pt_qry_event_ip(&ev->variant.async_paging.ip, ev,
1782 decoder);
1783
1784 case ptev_exec_mode:
1785 return pt_qry_event_ip(&ev->variant.exec_mode.ip, ev, decoder);
1786
1787 case ptev_tsx:
1788 return pt_qry_event_ip(&ev->variant.tsx.ip, ev, decoder);
1789
1790 case ptev_async_vmcs:
1791 return pt_qry_event_ip(&ev->variant.async_vmcs.ip, ev,
1792 decoder);
1793
1794 case ptev_cbr:
1795 return 0;
1796
1797 case ptev_mnt:
1798 /* Maintenance packets may appear anywhere. Do not mark them as
1799 * status updates even if they appear in PSB+.
1800 */
1801 ev->status_update = 0;
1802 return 0;
1803
1804 default:
1805 break;
1806 }
1807
1808 return -pte_internal;
1809 }
1810
pt_qry_process_pending_psb_events(struct pt_query_decoder * decoder)1811 static int pt_qry_process_pending_psb_events(struct pt_query_decoder *decoder)
1812 {
1813 struct pt_event *ev;
1814 int errcode;
1815
1816 if (!decoder)
1817 return -pte_internal;
1818
1819 ev = pt_evq_dequeue(&decoder->evq, evb_psbend);
1820 if (!ev)
1821 return 0;
1822
1823 errcode = pt_qry_event_psbend(ev, decoder);
1824 if (errcode < 0)
1825 return errcode;
1826
1827 /* Publish the event. */
1828 decoder->event = ev;
1829
1830 /* Signal a pending event. */
1831 return 1;
1832 }
1833
1834 /* Create a standalone overflow event with tracing disabled.
1835 *
1836 * Creates and published the event and disables tracing in @decoder.
1837 *
1838 * Returns zero on success, a negative pt_error_code otherwise.
1839 */
pt_qry_event_ovf_disabled(struct pt_query_decoder * decoder)1840 static int pt_qry_event_ovf_disabled(struct pt_query_decoder *decoder)
1841 {
1842 struct pt_event *ev;
1843
1844 if (!decoder)
1845 return -pte_internal;
1846
1847 ev = pt_evq_standalone(&decoder->evq);
1848 if (!ev)
1849 return -pte_internal;
1850
1851 ev->type = ptev_overflow;
1852
1853 /* We suppress the IP to indicate that tracing has been disabled before
1854 * the overflow resolved. There can be several events before tracing is
1855 * enabled again.
1856 */
1857 ev->ip_suppressed = 1;
1858
1859 decoder->enabled = 0;
1860 decoder->event = ev;
1861
1862 return pt_qry_event_time(ev, decoder);
1863 }
1864
1865 /* Queues an overflow event with tracing enabled.
1866 *
1867 * Creates and enqueues the event and enables tracing in @decoder.
1868 *
1869 * Returns zero on success, a negative pt_error_code otherwise.
1870 */
pt_qry_event_ovf_enabled(struct pt_query_decoder * decoder)1871 static int pt_qry_event_ovf_enabled(struct pt_query_decoder *decoder)
1872 {
1873 struct pt_event *ev;
1874
1875 if (!decoder)
1876 return -pte_internal;
1877
1878 ev = pt_evq_enqueue(&decoder->evq, evb_fup);
1879 if (!ev)
1880 return -pte_internal;
1881
1882 ev->type = ptev_overflow;
1883
1884 decoder->enabled = 1;
1885
1886 return pt_qry_event_time(ev, decoder);
1887 }
1888
1889 /* Recover from SKD010.
1890 *
1891 * Creates and publishes an overflow event at @packet's IP payload.
1892 *
1893 * Further updates @decoder as follows:
1894 *
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
1899 *
1900 * Returns zero on success, a negative error code otherwise.
1901 */
skd010_recover(struct pt_query_decoder * decoder,const struct pt_packet_ip * packet,const struct pt_time_cal * tcal,const struct pt_time * time,uint64_t offset)1902 static int skd010_recover(struct pt_query_decoder *decoder,
1903 const struct pt_packet_ip *packet,
1904 const struct pt_time_cal *tcal,
1905 const struct pt_time *time, uint64_t offset)
1906 {
1907 struct pt_last_ip ip;
1908 struct pt_event *ev;
1909 int errcode;
1910
1911 if (!decoder || !packet || !tcal || !time)
1912 return -pte_internal;
1913
1914 /* We use the decoder's IP. It should be newly initialized. */
1915 ip = decoder->ip;
1916
1917 /* Extract the IP payload from the packet. */
1918 errcode = pt_last_ip_update_ip(&ip, packet, &decoder->config);
1919 if (errcode < 0)
1920 return errcode;
1921
1922 /* Synthesize the overflow event. */
1923 ev = pt_evq_standalone(&decoder->evq);
1924 if (!ev)
1925 return -pte_internal;
1926
1927 ev->type = ptev_overflow;
1928
1929 /* We do need a full IP. */
1930 errcode = pt_last_ip_query(&ev->variant.overflow.ip, &ip);
1931 if (errcode < 0)
1932 return -pte_bad_context;
1933
1934 /* We continue decoding at the given offset. */
1935 decoder->pos = decoder->config.begin + offset;
1936
1937 /* Tracing is enabled. */
1938 decoder->enabled = 1;
1939 decoder->ip = ip;
1940
1941 decoder->time = *time;
1942 decoder->tcal = *tcal;
1943
1944 /* Publish the event. */
1945 decoder->event = ev;
1946
1947 return pt_qry_event_time(ev, decoder);
1948 }
1949
1950 /* Recover from SKD010 with tracing disabled.
1951 *
1952 * Creates and publishes a standalone overflow event.
1953 *
1954 * Further updates @decoder as follows:
1955 *
1956 * - set time tracking to @time and @tcal
1957 * - set the position to @offset
1958 * - set tracing to be disabled
1959 *
1960 * Returns zero on success, a negative error code otherwise.
1961 */
skd010_recover_disabled(struct pt_query_decoder * decoder,const struct pt_time_cal * tcal,const struct pt_time * time,uint64_t offset)1962 static int skd010_recover_disabled(struct pt_query_decoder *decoder,
1963 const struct pt_time_cal *tcal,
1964 const struct pt_time *time, uint64_t offset)
1965 {
1966 if (!decoder || !tcal || !time)
1967 return -pte_internal;
1968
1969 decoder->time = *time;
1970 decoder->tcal = *tcal;
1971
1972 /* We continue decoding at the given offset. */
1973 decoder->pos = decoder->config.begin + offset;
1974
1975 return pt_qry_event_ovf_disabled(decoder);
1976 }
1977
1978 /* Scan ahead for a packet at which to resume after an overflow.
1979 *
1980 * This function is called after an OVF without a corresponding FUP. This
1981 * normally means that the overflow resolved while tracing was disabled.
1982 *
1983 * With erratum SKD010 it might also mean that the FUP (or TIP.PGE) was dropped.
1984 * The overflow thus resolved while tracing was enabled (or tracing was enabled
1985 * after the overflow resolved). Search for an indication whether tracing is
1986 * enabled or disabled by scanning upcoming packets.
1987 *
1988 * If we can confirm that tracing is disabled, the erratum does not apply and we
1989 * can continue normally.
1990 *
1991 * If we can confirm that tracing is enabled, the erratum applies and we try to
1992 * recover by synchronizing at a later packet and a different IP. If we can't
1993 * recover, pretend the erratum didn't apply so we run into the error later.
1994 * Since this assumes that tracing is disabled, no harm should be done, i.e. no
1995 * bad trace should be generated.
1996 *
1997 * Returns zero if the overflow is handled.
1998 * Returns a positive value if the overflow is not yet handled.
1999 * Returns a negative error code otherwise.
2000 */
skd010_scan_for_ovf_resume(struct pt_packet_decoder * pkt,struct pt_query_decoder * decoder)2001 static int skd010_scan_for_ovf_resume(struct pt_packet_decoder *pkt,
2002 struct pt_query_decoder *decoder)
2003 {
2004 struct pt_time_cal tcal;
2005 struct pt_time time;
2006 struct {
2007 struct pt_time_cal tcal;
2008 struct pt_time time;
2009 uint64_t offset;
2010 } mode_tsx;
2011 int errcode;
2012
2013 if (!decoder)
2014 return -pte_internal;
2015
2016 /* Keep track of time as we skip packets. */
2017 time = decoder->time;
2018 tcal = decoder->tcal;
2019
2020 /* Keep track of a potential recovery point at MODE.TSX. */
2021 memset(&mode_tsx, 0, sizeof(mode_tsx));
2022
2023 for (;;) {
2024 struct pt_packet packet;
2025 uint64_t offset;
2026
2027 errcode = pt_pkt_get_offset(pkt, &offset);
2028 if (errcode < 0)
2029 return errcode;
2030
2031 errcode = pt_pkt_next(pkt, &packet, sizeof(packet));
2032 if (errcode < 0) {
2033 /* Let's assume the trace is correct if we run out
2034 * of packets.
2035 */
2036 if (errcode == -pte_eos)
2037 errcode = 1;
2038
2039 return errcode;
2040 }
2041
2042 switch (packet.type) {
2043 case ppt_tip_pge:
2044 /* Everything is fine. There is nothing to do. */
2045 return 1;
2046
2047 case ppt_tip_pgd:
2048 /* This is a clear indication that the erratum
2049 * applies.
2050 *
2051 * We synchronize after the disable.
2052 */
2053 return skd010_recover_disabled(decoder, &tcal, &time,
2054 offset + packet.size);
2055
2056 case ppt_tnt_8:
2057 case ppt_tnt_64:
2058 /* This is a clear indication that the erratum
2059 * apllies.
2060 *
2061 * Yet, we can't recover from it as we wouldn't know how
2062 * many TNT bits will have been used when we eventually
2063 * find an IP packet at which to resume tracing.
2064 */
2065 return 1;
2066
2067 case ppt_pip:
2068 case ppt_vmcs:
2069 /* We could track those changes and synthesize extra
2070 * events after the overflow event when recovering from
2071 * the erratum. This requires infrastructure that we
2072 * don't currently have, though, so we're not going to
2073 * do it.
2074 *
2075 * Instead, we ignore those changes. We already don't
2076 * know how many other changes were lost in the
2077 * overflow.
2078 */
2079 break;
2080
2081 case ppt_mode:
2082 switch (packet.payload.mode.leaf) {
2083 case pt_mol_exec:
2084 /* A MODE.EXEC packet binds to TIP, i.e.
2085 *
2086 * TIP.PGE: everything is fine
2087 * TIP: the erratum applies
2088 *
2089 * In the TIP.PGE case, we may just follow the
2090 * normal code flow.
2091 *
2092 * In the TIP case, we'd be able to re-sync at
2093 * the TIP IP but have to skip packets up to and
2094 * including the TIP.
2095 *
2096 * We'd need to synthesize the MODE.EXEC event
2097 * after the overflow event when recovering at
2098 * the TIP. We lack the infrastructure for this
2099 * - it's getting too complicated.
2100 *
2101 * Instead, we ignore the execution mode change;
2102 * we already don't know how many more such
2103 * changes were lost in the overflow.
2104 */
2105 break;
2106
2107 case pt_mol_tsx:
2108 /* A MODE.TSX packet may be standalone or bind
2109 * to FUP.
2110 *
2111 * If this is the second MODE.TSX, we're sure
2112 * that tracing is disabled and everything is
2113 * fine.
2114 */
2115 if (mode_tsx.offset)
2116 return 1;
2117
2118 /* If we find the FUP this packet binds to, we
2119 * may recover at the FUP IP and restart
2120 * processing packets from here. Remember the
2121 * current state.
2122 */
2123 mode_tsx.offset = offset;
2124 mode_tsx.time = time;
2125 mode_tsx.tcal = tcal;
2126
2127 break;
2128 }
2129
2130 break;
2131
2132 case ppt_fup:
2133 /* This is a pretty good indication that tracing
2134 * is indeed enabled and the erratum applies.
2135 */
2136
2137 /* If we got a MODE.TSX packet before, we synchronize at
2138 * the FUP IP but continue decoding packets starting
2139 * from the MODE.TSX.
2140 */
2141 if (mode_tsx.offset)
2142 return skd010_recover(decoder,
2143 &packet.payload.ip,
2144 &mode_tsx.tcal,
2145 &mode_tsx.time,
2146 mode_tsx.offset);
2147
2148 /* Without a preceding MODE.TSX, this FUP is the start
2149 * of an async branch or disable. We synchronize at the
2150 * FUP IP and continue decoding packets from here.
2151 */
2152 return skd010_recover(decoder, &packet.payload.ip,
2153 &tcal, &time, offset);
2154
2155 case ppt_tip:
2156 /* We syhchronize at the TIP IP and continue decoding
2157 * packets after the TIP packet.
2158 */
2159 return skd010_recover(decoder, &packet.payload.ip,
2160 &tcal, &time,
2161 offset + packet.size);
2162
2163 case ppt_psb:
2164 /* We reached a synchronization point. Tracing is
2165 * enabled if and only if the PSB+ contains a FUP.
2166 */
2167 errcode = pt_qry_find_header_fup(&packet, pkt);
2168 if (errcode < 0) {
2169 /* If we ran out of packets, we can't tell.
2170 * Let's assume the trace is correct.
2171 */
2172 if (errcode == -pte_eos)
2173 errcode = 1;
2174
2175 return errcode;
2176 }
2177
2178 /* If there is no FUP, tracing is disabled and
2179 * everything is fine.
2180 */
2181 if (!errcode)
2182 return 1;
2183
2184 /* We should have a FUP. */
2185 if (packet.type != ppt_fup)
2186 return -pte_internal;
2187
2188 /* Otherwise, we may synchronize at the FUP IP and
2189 * continue decoding packets at the PSB.
2190 */
2191 return skd010_recover(decoder, &packet.payload.ip,
2192 &tcal, &time, offset);
2193
2194 case ppt_psbend:
2195 /* We shouldn't see this. */
2196 return -pte_bad_context;
2197
2198 case ppt_ovf:
2199 case ppt_stop:
2200 /* It doesn't matter if it had been enabled or disabled
2201 * before. We may resume normally.
2202 */
2203 return 1;
2204
2205 case ppt_unknown:
2206 case ppt_invalid:
2207 /* We can't skip this packet. */
2208 return 1;
2209
2210 case ppt_pad:
2211 case ppt_mnt:
2212 case ppt_pwre:
2213 case ppt_pwrx:
2214 /* Ignore this packet. */
2215 break;
2216
2217 case ppt_exstop:
2218 /* We may skip a stand-alone EXSTOP. */
2219 if (!packet.payload.exstop.ip)
2220 break;
2221
2222 fallthrough;
2223 case ppt_mwait:
2224 /* To skip this packet, we'd need to take care of the
2225 * FUP it binds to. This is getting complicated.
2226 */
2227 return 1;
2228
2229 case ppt_ptw:
2230 /* We may skip a stand-alone PTW. */
2231 if (!packet.payload.ptw.ip)
2232 break;
2233
2234 /* To skip this packet, we'd need to take care of the
2235 * FUP it binds to. This is getting complicated.
2236 */
2237 return 1;
2238
2239 case ppt_tsc:
2240 /* Keep track of time. */
2241 errcode = pt_qry_apply_tsc(&time, &tcal,
2242 &packet.payload.tsc,
2243 &decoder->config);
2244 if (errcode < 0)
2245 return errcode;
2246
2247 break;
2248
2249 case ppt_cbr:
2250 /* Keep track of time. */
2251 errcode = pt_qry_apply_cbr(&time, &tcal,
2252 &packet.payload.cbr,
2253 &decoder->config);
2254 if (errcode < 0)
2255 return errcode;
2256
2257 break;
2258
2259 case ppt_tma:
2260 /* Keep track of time. */
2261 errcode = pt_qry_apply_tma(&time, &tcal,
2262 &packet.payload.tma,
2263 &decoder->config);
2264 if (errcode < 0)
2265 return errcode;
2266
2267 break;
2268
2269 case ppt_mtc:
2270 /* Keep track of time. */
2271 errcode = pt_qry_apply_mtc(&time, &tcal,
2272 &packet.payload.mtc,
2273 &decoder->config);
2274 if (errcode < 0)
2275 return errcode;
2276
2277 break;
2278
2279 case ppt_cyc:
2280 /* Keep track of time. */
2281 errcode = pt_qry_apply_cyc(&time, &tcal,
2282 &packet.payload.cyc,
2283 &decoder->config);
2284 if (errcode < 0)
2285 return errcode;
2286
2287 break;
2288 }
2289 }
2290 }
2291
pt_qry_handle_skd010(struct pt_query_decoder * decoder)2292 static int pt_qry_handle_skd010(struct pt_query_decoder *decoder)
2293 {
2294 struct pt_packet_decoder pkt;
2295 uint64_t offset;
2296 int errcode;
2297
2298 if (!decoder)
2299 return -pte_internal;
2300
2301 errcode = pt_qry_get_offset(decoder, &offset);
2302 if (errcode < 0)
2303 return errcode;
2304
2305 errcode = pt_pkt_decoder_init(&pkt, &decoder->config);
2306 if (errcode < 0)
2307 return errcode;
2308
2309 errcode = pt_pkt_sync_set(&pkt, offset);
2310 if (errcode >= 0)
2311 errcode = skd010_scan_for_ovf_resume(&pkt, decoder);
2312
2313 pt_pkt_decoder_fini(&pkt);
2314 return errcode;
2315 }
2316
2317 /* Scan ahead for an indication whether tracing is enabled or disabled.
2318 *
2319 * Returns zero if tracing is clearly disabled.
2320 * Returns a positive integer if tracing is enabled or if we can't tell.
2321 * Returns a negative error code otherwise.
2322 */
apl12_tracing_is_disabled(struct pt_packet_decoder * decoder)2323 static int apl12_tracing_is_disabled(struct pt_packet_decoder *decoder)
2324 {
2325 if (!decoder)
2326 return -pte_internal;
2327
2328 for (;;) {
2329 struct pt_packet packet;
2330 int status;
2331
2332 status = pt_pkt_next(decoder, &packet, sizeof(packet));
2333 if (status < 0) {
2334 /* Running out of packets is not an error. */
2335 if (status == -pte_eos)
2336 status = 1;
2337
2338 return status;
2339 }
2340
2341 switch (packet.type) {
2342 default:
2343 /* Skip other packets. */
2344 break;
2345
2346 case ppt_stop:
2347 /* Tracing is disabled before a stop. */
2348 return 0;
2349
2350 case ppt_tip_pge:
2351 /* Tracing gets enabled - it must have been disabled. */
2352 return 0;
2353
2354 case ppt_tnt_8:
2355 case ppt_tnt_64:
2356 case ppt_tip:
2357 case ppt_tip_pgd:
2358 /* Those packets are only generated when tracing is
2359 * enabled. We're done.
2360 */
2361 return 1;
2362
2363 case ppt_psb:
2364 /* We reached a synchronization point. Tracing is
2365 * enabled if and only if the PSB+ contains a FUP.
2366 */
2367 status = pt_qry_find_header_fup(&packet, decoder);
2368
2369 /* If we ran out of packets, we can't tell. */
2370 if (status == -pte_eos)
2371 status = 1;
2372
2373 return status;
2374
2375 case ppt_psbend:
2376 /* We shouldn't see this. */
2377 return -pte_bad_context;
2378
2379 case ppt_ovf:
2380 /* It doesn't matter - we run into the next overflow. */
2381 return 1;
2382
2383 case ppt_unknown:
2384 case ppt_invalid:
2385 /* We can't skip this packet. */
2386 return 1;
2387 }
2388 }
2389 }
2390
2391 /* Apply workaround for erratum APL12.
2392 *
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.
2395 *
2396 * Any event will be dropped.
2397 *
2398 * Returns zero on success, a negative pt_error_code otherwise.
2399 */
apl12_resume_disabled(struct pt_query_decoder * decoder,struct pt_packet_decoder * pkt,unsigned int offset)2400 static int apl12_resume_disabled(struct pt_query_decoder *decoder,
2401 struct pt_packet_decoder *pkt,
2402 unsigned int offset)
2403 {
2404 uint64_t begin, end;
2405 int errcode;
2406
2407 if (!decoder)
2408 return -pte_internal;
2409
2410 errcode = pt_qry_get_offset(decoder, &begin);
2411 if (errcode < 0)
2412 return errcode;
2413
2414 errcode = pt_pkt_sync_set(pkt, begin);
2415 if (errcode < 0)
2416 return errcode;
2417
2418 end = begin + offset;
2419 for (;;) {
2420 struct pt_packet packet;
2421 uint64_t next;
2422
2423 errcode = pt_pkt_next(pkt, &packet, sizeof(packet));
2424 if (errcode < 0) {
2425 /* Running out of packets is not an error. */
2426 if (errcode == -pte_eos)
2427 errcode = 0;
2428
2429 return errcode;
2430 }
2431
2432 /* The offset is the start of the next packet. */
2433 errcode = pt_pkt_get_offset(pkt, &next);
2434 if (errcode < 0)
2435 return errcode;
2436
2437 /* We're done when we reach @offset.
2438 *
2439 * The current @packet will be the FUP after which we started
2440 * our search. We skip it.
2441 *
2442 * Check that we're not accidentally proceeding past @offset.
2443 */
2444 if (end <= next) {
2445 if (end < next)
2446 return -pte_internal;
2447
2448 break;
2449 }
2450
2451 switch (packet.type) {
2452 default:
2453 /* Skip other packets. */
2454 break;
2455
2456 case ppt_mode:
2457 case ppt_pip:
2458 case ppt_vmcs:
2459 /* We should not encounter those.
2460 *
2461 * We should not encounter a lot of packets but those
2462 * are state-relevant; let's check them explicitly.
2463 */
2464 return -pte_internal;
2465
2466 case ppt_tsc:
2467 /* Keep track of time. */
2468 errcode = pt_qry_apply_tsc(&decoder->time,
2469 &decoder->tcal,
2470 &packet.payload.tsc,
2471 &decoder->config);
2472 if (errcode < 0)
2473 return errcode;
2474
2475 break;
2476
2477 case ppt_cbr:
2478 /* Keep track of time. */
2479 errcode = pt_qry_apply_cbr(&decoder->time,
2480 &decoder->tcal,
2481 &packet.payload.cbr,
2482 &decoder->config);
2483 if (errcode < 0)
2484 return errcode;
2485
2486 break;
2487
2488 case ppt_tma:
2489 /* Keep track of time. */
2490 errcode = pt_qry_apply_tma(&decoder->time,
2491 &decoder->tcal,
2492 &packet.payload.tma,
2493 &decoder->config);
2494 if (errcode < 0)
2495 return errcode;
2496
2497 break;
2498
2499 case ppt_mtc:
2500 /* Keep track of time. */
2501 errcode = pt_qry_apply_mtc(&decoder->time,
2502 &decoder->tcal,
2503 &packet.payload.mtc,
2504 &decoder->config);
2505 if (errcode < 0)
2506 return errcode;
2507
2508 break;
2509
2510 case ppt_cyc:
2511 /* Keep track of time. */
2512 errcode = pt_qry_apply_cyc(&decoder->time,
2513 &decoder->tcal,
2514 &packet.payload.cyc,
2515 &decoder->config);
2516 if (errcode < 0)
2517 return errcode;
2518
2519 break;
2520 }
2521 }
2522
2523 decoder->pos += offset;
2524
2525 return pt_qry_event_ovf_disabled(decoder);
2526 }
2527
2528 /* Handle erratum APL12.
2529 *
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.
2532 *
2533 * A FUP after OVF normally indicates that the overflow resolved while tracing
2534 * is enabled. Due to erratum APL12, however, the overflow may have resolved
2535 * while tracing is disabled and still generate a FUP.
2536 *
2537 * We scan ahead for an indication whether tracing is actually disabled. If we
2538 * find one, the erratum applies and we proceed from after the FUP packet.
2539 *
2540 * This will drop any CBR or MTC events. We will update @decoder's timing state
2541 * on CBR but drop the event.
2542 *
2543 * Returns zero if the erratum was handled.
2544 * Returns a positive integer if the erratum was not handled.
2545 * Returns a negative pt_error_code otherwise.
2546 */
pt_qry_handle_apl12(struct pt_query_decoder * decoder,unsigned int offset)2547 static int pt_qry_handle_apl12(struct pt_query_decoder *decoder,
2548 unsigned int offset)
2549 {
2550 struct pt_packet_decoder pkt;
2551 uint64_t here;
2552 int status;
2553
2554 if (!decoder)
2555 return -pte_internal;
2556
2557 status = pt_qry_get_offset(decoder, &here);
2558 if (status < 0)
2559 return status;
2560
2561 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2562 if (status < 0)
2563 return status;
2564
2565 status = pt_pkt_sync_set(&pkt, here + offset);
2566 if (status >= 0) {
2567 status = apl12_tracing_is_disabled(&pkt);
2568 if (!status)
2569 status = apl12_resume_disabled(decoder, &pkt, offset);
2570 }
2571
2572 pt_pkt_decoder_fini(&pkt);
2573 return status;
2574 }
2575
2576 /* Apply workaround for erratum APL11.
2577 *
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
2580 * to update our state.
2581 *
2582 * If we don't find a TIP.PGD but instead some other packet that indicates that
2583 * tracing is disabled, indicate that the erratum does not apply.
2584 *
2585 * Any event will be dropped.
2586 *
2587 * Returns zero if the erratum was handled.
2588 * Returns a positive integer if the erratum was not handled.
2589 * Returns a negative pt_error_code otherwise.
2590 */
apl11_apply(struct pt_query_decoder * decoder,struct pt_packet_decoder * pkt)2591 static int apl11_apply(struct pt_query_decoder *decoder,
2592 struct pt_packet_decoder *pkt)
2593 {
2594 struct pt_time_cal tcal;
2595 struct pt_time time;
2596
2597 if (!decoder)
2598 return -pte_internal;
2599
2600 time = decoder->time;
2601 tcal = decoder->tcal;
2602 for (;;) {
2603 struct pt_packet packet;
2604 int errcode;
2605
2606 errcode = pt_pkt_next(pkt, &packet, sizeof(packet));
2607 if (errcode < 0)
2608 return errcode;
2609
2610 switch (packet.type) {
2611 case ppt_tip_pgd: {
2612 uint64_t offset;
2613
2614 /* We found a TIP.PGD. The erratum applies.
2615 *
2616 * Resume from here with tracing disabled.
2617 */
2618 errcode = pt_pkt_get_offset(pkt, &offset);
2619 if (errcode < 0)
2620 return errcode;
2621
2622 decoder->time = time;
2623 decoder->tcal = tcal;
2624 decoder->pos = decoder->config.begin + offset;
2625
2626 return pt_qry_event_ovf_disabled(decoder);
2627 }
2628
2629 case ppt_invalid:
2630 return -pte_bad_opc;
2631
2632 case ppt_fup:
2633 case ppt_psb:
2634 case ppt_tip_pge:
2635 case ppt_stop:
2636 case ppt_ovf:
2637 case ppt_mode:
2638 case ppt_pip:
2639 case ppt_vmcs:
2640 case ppt_exstop:
2641 case ppt_mwait:
2642 case ppt_pwre:
2643 case ppt_pwrx:
2644 case ppt_ptw:
2645 /* The erratum does not apply. */
2646 return 1;
2647
2648 case ppt_unknown:
2649 case ppt_pad:
2650 case ppt_mnt:
2651 /* Skip those packets. */
2652 break;
2653
2654 case ppt_psbend:
2655 case ppt_tip:
2656 case ppt_tnt_8:
2657 case ppt_tnt_64:
2658 return -pte_bad_context;
2659
2660
2661 case ppt_tsc:
2662 /* Keep track of time. */
2663 errcode = pt_qry_apply_tsc(&time, &tcal,
2664 &packet.payload.tsc,
2665 &decoder->config);
2666 if (errcode < 0)
2667 return errcode;
2668
2669 break;
2670
2671 case ppt_cbr:
2672 /* Keep track of time. */
2673 errcode = pt_qry_apply_cbr(&time, &tcal,
2674 &packet.payload.cbr,
2675 &decoder->config);
2676 if (errcode < 0)
2677 return errcode;
2678
2679 break;
2680
2681 case ppt_tma:
2682 /* Keep track of time. */
2683 errcode = pt_qry_apply_tma(&time, &tcal,
2684 &packet.payload.tma,
2685 &decoder->config);
2686 if (errcode < 0)
2687 return errcode;
2688
2689 break;
2690
2691 case ppt_mtc:
2692 /* Keep track of time. */
2693 errcode = pt_qry_apply_mtc(&time, &tcal,
2694 &packet.payload.mtc,
2695 &decoder->config);
2696 if (errcode < 0)
2697 return errcode;
2698
2699 break;
2700
2701 case ppt_cyc:
2702 /* Keep track of time. */
2703 errcode = pt_qry_apply_cyc(&time, &tcal,
2704 &packet.payload.cyc,
2705 &decoder->config);
2706 if (errcode < 0)
2707 return errcode;
2708
2709 break;
2710 }
2711 }
2712 }
2713
2714 /* Handle erratum APL11.
2715 *
2716 * This function is called when we diagnose a bad packet while searching for a
2717 * FUP after an OVF.
2718 *
2719 * Due to erratum APL11 we may get an extra TIP.PGD after the OVF. Find that
2720 * TIP.PGD and resume from there with tracing disabled.
2721 *
2722 * This will drop any CBR or MTC events. We will update @decoder's timing state
2723 * on CBR but drop the event.
2724 *
2725 * Returns zero if the erratum was handled.
2726 * Returns a positive integer if the erratum was not handled.
2727 * Returns a negative pt_error_code otherwise.
2728 */
pt_qry_handle_apl11(struct pt_query_decoder * decoder)2729 static int pt_qry_handle_apl11(struct pt_query_decoder *decoder)
2730 {
2731 struct pt_packet_decoder pkt;
2732 uint64_t offset;
2733 int status;
2734
2735 if (!decoder)
2736 return -pte_internal;
2737
2738 status = pt_qry_get_offset(decoder, &offset);
2739 if (status < 0)
2740 return status;
2741
2742 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2743 if (status < 0)
2744 return status;
2745
2746 status = pt_pkt_sync_set(&pkt, offset);
2747 if (status >= 0)
2748 status = apl11_apply(decoder, &pkt);
2749
2750 pt_pkt_decoder_fini(&pkt);
2751 return status;
2752 }
2753
pt_pkt_find_ovf_fup(struct pt_packet_decoder * decoder)2754 static int pt_pkt_find_ovf_fup(struct pt_packet_decoder *decoder)
2755 {
2756 for (;;) {
2757 struct pt_packet packet;
2758 int errcode;
2759
2760 errcode = pt_pkt_next(decoder, &packet, sizeof(packet));
2761 if (errcode < 0)
2762 return errcode;
2763
2764 switch (packet.type) {
2765 case ppt_fup:
2766 return 1;
2767
2768 case ppt_invalid:
2769 return -pte_bad_opc;
2770
2771 case ppt_unknown:
2772 case ppt_pad:
2773 case ppt_mnt:
2774 case ppt_cbr:
2775 case ppt_tsc:
2776 case ppt_tma:
2777 case ppt_mtc:
2778 case ppt_cyc:
2779 continue;
2780
2781 case ppt_psb:
2782 case ppt_tip_pge:
2783 case ppt_mode:
2784 case ppt_pip:
2785 case ppt_vmcs:
2786 case ppt_stop:
2787 case ppt_ovf:
2788 case ppt_exstop:
2789 case ppt_mwait:
2790 case ppt_pwre:
2791 case ppt_pwrx:
2792 case ppt_ptw:
2793 return 0;
2794
2795 case ppt_psbend:
2796 case ppt_tip:
2797 case ppt_tip_pgd:
2798 case ppt_tnt_8:
2799 case ppt_tnt_64:
2800 return -pte_bad_context;
2801 }
2802 }
2803 }
2804
2805 /* Find a FUP to which the current OVF may bind.
2806 *
2807 * Scans the trace for a FUP or for a packet that indicates that tracing is
2808 * disabled.
2809 *
2810 * Return the relative offset of the packet following the found FUP on success.
2811 * Returns zero if no FUP is found and tracing is assumed to be disabled.
2812 * Returns a negative pt_error_code otherwise.
2813 */
pt_qry_find_ovf_fup(const struct pt_query_decoder * decoder)2814 static int pt_qry_find_ovf_fup(const struct pt_query_decoder *decoder)
2815 {
2816 struct pt_packet_decoder pkt;
2817 uint64_t begin, end, offset;
2818 int status;
2819
2820 if (!decoder)
2821 return -pte_internal;
2822
2823 status = pt_qry_get_offset(decoder, &begin);
2824 if (status < 0)
2825 return status;
2826
2827 status = pt_pkt_decoder_init(&pkt, &decoder->config);
2828 if (status < 0)
2829 return status;
2830
2831 status = pt_pkt_sync_set(&pkt, begin);
2832 if (status >= 0) {
2833 status = pt_pkt_find_ovf_fup(&pkt);
2834 if (status > 0) {
2835 status = pt_pkt_get_offset(&pkt, &end);
2836 if (status < 0)
2837 return status;
2838
2839 if (end <= begin)
2840 return -pte_overflow;
2841
2842 offset = end - begin;
2843 if (INT_MAX < offset)
2844 return -pte_overflow;
2845
2846 status = (int) offset;
2847 }
2848 }
2849
2850 pt_pkt_decoder_fini(&pkt);
2851 return status;
2852 }
2853
pt_qry_decode_ovf(struct pt_query_decoder * decoder)2854 int pt_qry_decode_ovf(struct pt_query_decoder *decoder)
2855 {
2856 struct pt_time_cal tcal;
2857 struct pt_time time;
2858 int status, offset;
2859
2860 if (!decoder)
2861 return -pte_internal;
2862
2863 status = pt_qry_process_pending_psb_events(decoder);
2864 if (status < 0)
2865 return status;
2866
2867 /* If we have any pending psbend events, we're done for now. */
2868 if (status)
2869 return 0;
2870
2871 /* Reset the decoder state but preserve timing. */
2872 time = decoder->time;
2873 tcal = decoder->tcal;
2874
2875 pt_qry_reset(decoder);
2876
2877 decoder->time = time;
2878 if (decoder->config.flags.variant.query.keep_tcal_on_ovf) {
2879 status = pt_tcal_update_ovf(&tcal, &decoder->config);
2880 if (status < 0)
2881 return status;
2882
2883 decoder->tcal = tcal;
2884 }
2885
2886 /* We must consume the OVF before we search for the binding packet. */
2887 decoder->pos += ptps_ovf;
2888
2889 /* Overflow binds to either FUP or TIP.PGE.
2890 *
2891 * If the overflow can be resolved while PacketEn=1 it binds to FUP. We
2892 * can see timing packets between OVF anf FUP but that's it.
2893 *
2894 * Otherwise, PacketEn will be zero when the overflow resolves and OVF
2895 * binds to TIP.PGE. There can be packets between OVF and TIP.PGE that
2896 * do not depend on PacketEn.
2897 *
2898 * We don't need to decode everything until TIP.PGE, however. As soon
2899 * as we see a non-timing non-FUP packet, we know that tracing has been
2900 * disabled before the overflow resolves.
2901 */
2902 offset = pt_qry_find_ovf_fup(decoder);
2903 if (offset <= 0) {
2904 /* Check for erratum SKD010.
2905 *
2906 * The FUP may have been dropped. If we can figure out that
2907 * tracing is enabled and hence the FUP is missing, we resume
2908 * at a later packet and a different IP.
2909 */
2910 if (decoder->config.errata.skd010) {
2911 status = pt_qry_handle_skd010(decoder);
2912 if (status <= 0)
2913 return status;
2914 }
2915
2916 /* Check for erratum APL11.
2917 *
2918 * We may have gotten an extra TIP.PGD, which should be
2919 * diagnosed by our search for a subsequent FUP.
2920 */
2921 if (decoder->config.errata.apl11 &&
2922 (offset == -pte_bad_context)) {
2923 status = pt_qry_handle_apl11(decoder);
2924 if (status <= 0)
2925 return status;
2926 }
2927
2928 /* Report the original error from searching for the FUP packet
2929 * if we were not able to fix the trace.
2930 *
2931 * We treat an overflow at the end of the trace as standalone.
2932 */
2933 if (offset < 0 && offset != -pte_eos)
2934 return offset;
2935
2936 return pt_qry_event_ovf_disabled(decoder);
2937 } else {
2938 /* Check for erratum APL12.
2939 *
2940 * We may get an extra FUP even though the overflow resolved
2941 * with tracing disabled.
2942 */
2943 if (decoder->config.errata.apl12) {
2944 status = pt_qry_handle_apl12(decoder,
2945 (unsigned int) offset);
2946 if (status <= 0)
2947 return status;
2948 }
2949
2950 return pt_qry_event_ovf_enabled(decoder);
2951 }
2952 }
2953
pt_qry_decode_mode_exec(struct pt_query_decoder * decoder,const struct pt_packet_mode_exec * packet)2954 static int pt_qry_decode_mode_exec(struct pt_query_decoder *decoder,
2955 const struct pt_packet_mode_exec *packet)
2956 {
2957 struct pt_event *event;
2958
2959 if (!decoder || !packet)
2960 return -pte_internal;
2961
2962 /* MODE.EXEC binds to TIP. */
2963 event = pt_evq_enqueue(&decoder->evq, evb_tip);
2964 if (!event)
2965 return -pte_nomem;
2966
2967 event->type = ptev_exec_mode;
2968 event->variant.exec_mode.mode = pt_get_exec_mode(packet);
2969
2970 return pt_qry_event_time(event, decoder);
2971 }
2972
pt_qry_decode_mode_tsx(struct pt_query_decoder * decoder,const struct pt_packet_mode_tsx * packet)2973 static int pt_qry_decode_mode_tsx(struct pt_query_decoder *decoder,
2974 const struct pt_packet_mode_tsx *packet)
2975 {
2976 struct pt_event *event;
2977
2978 if (!decoder || !packet)
2979 return -pte_internal;
2980
2981 /* MODE.TSX is standalone if tracing is disabled. */
2982 if (!decoder->enabled) {
2983 event = pt_evq_standalone(&decoder->evq);
2984 if (!event)
2985 return -pte_internal;
2986
2987 /* We don't have an IP in this case. */
2988 event->variant.tsx.ip = 0;
2989 event->ip_suppressed = 1;
2990
2991 /* Publish the event. */
2992 decoder->event = event;
2993 } else {
2994 /* MODE.TSX binds to FUP. */
2995 event = pt_evq_enqueue(&decoder->evq, evb_fup);
2996 if (!event)
2997 return -pte_nomem;
2998 }
2999
3000 event->type = ptev_tsx;
3001 event->variant.tsx.speculative = packet->intx;
3002 event->variant.tsx.aborted = packet->abrt;
3003
3004 return pt_qry_event_time(event, decoder);
3005 }
3006
pt_qry_decode_mode(struct pt_query_decoder * decoder)3007 int pt_qry_decode_mode(struct pt_query_decoder *decoder)
3008 {
3009 struct pt_packet_mode packet;
3010 int size, errcode;
3011
3012 if (!decoder)
3013 return -pte_internal;
3014
3015 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config);
3016 if (size < 0)
3017 return size;
3018
3019 errcode = 0;
3020 switch (packet.leaf) {
3021 case pt_mol_exec:
3022 errcode = pt_qry_decode_mode_exec(decoder, &packet.bits.exec);
3023 break;
3024
3025 case pt_mol_tsx:
3026 errcode = pt_qry_decode_mode_tsx(decoder, &packet.bits.tsx);
3027 break;
3028 }
3029
3030 if (errcode < 0)
3031 return errcode;
3032
3033 decoder->pos += size;
3034 return 0;
3035 }
3036
pt_qry_header_mode(struct pt_query_decoder * decoder)3037 int pt_qry_header_mode(struct pt_query_decoder *decoder)
3038 {
3039 struct pt_packet_mode packet;
3040 struct pt_event *event;
3041 int size;
3042
3043 if (!decoder)
3044 return -pte_internal;
3045
3046 size = pt_pkt_read_mode(&packet, decoder->pos, &decoder->config);
3047 if (size < 0)
3048 return size;
3049
3050 /* Inside the header, events are reported at the end. */
3051 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3052 if (!event)
3053 return -pte_nomem;
3054
3055 switch (packet.leaf) {
3056 case pt_mol_exec:
3057 event->type = ptev_exec_mode;
3058 event->variant.exec_mode.mode =
3059 pt_get_exec_mode(&packet.bits.exec);
3060 break;
3061
3062 case pt_mol_tsx:
3063 event->type = ptev_tsx;
3064 event->variant.tsx.speculative = packet.bits.tsx.intx;
3065 event->variant.tsx.aborted = packet.bits.tsx.abrt;
3066 break;
3067 }
3068
3069 decoder->pos += size;
3070 return 0;
3071 }
3072
pt_qry_decode_psbend(struct pt_query_decoder * decoder)3073 int pt_qry_decode_psbend(struct pt_query_decoder *decoder)
3074 {
3075 int status;
3076
3077 if (!decoder)
3078 return -pte_internal;
3079
3080 status = pt_qry_process_pending_psb_events(decoder);
3081 if (status < 0)
3082 return status;
3083
3084 /* If we had any psb events, we're done for now. */
3085 if (status)
3086 return 0;
3087
3088 /* Skip the psbend extended opcode that we fetched before if no more
3089 * psbend events are pending.
3090 */
3091 decoder->pos += ptps_psbend;
3092 return 0;
3093 }
3094
pt_qry_decode_tsc(struct pt_query_decoder * decoder)3095 int pt_qry_decode_tsc(struct pt_query_decoder *decoder)
3096 {
3097 struct pt_packet_tsc packet;
3098 int size, errcode;
3099
3100 if (!decoder)
3101 return -pte_internal;
3102
3103 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config);
3104 if (size < 0)
3105 return size;
3106
3107 errcode = pt_qry_apply_tsc(&decoder->time, &decoder->tcal,
3108 &packet, &decoder->config);
3109 if (errcode < 0)
3110 return errcode;
3111
3112 decoder->pos += size;
3113 return 0;
3114 }
3115
pt_qry_header_tsc(struct pt_query_decoder * decoder)3116 int pt_qry_header_tsc(struct pt_query_decoder *decoder)
3117 {
3118 struct pt_packet_tsc packet;
3119 int size, errcode;
3120
3121 if (!decoder)
3122 return -pte_internal;
3123
3124 size = pt_pkt_read_tsc(&packet, decoder->pos, &decoder->config);
3125 if (size < 0)
3126 return size;
3127
3128 errcode = pt_qry_apply_header_tsc(&decoder->time, &decoder->tcal,
3129 &packet, &decoder->config);
3130 if (errcode < 0)
3131 return errcode;
3132
3133 decoder->pos += size;
3134 return 0;
3135 }
3136
pt_qry_decode_cbr(struct pt_query_decoder * decoder)3137 int pt_qry_decode_cbr(struct pt_query_decoder *decoder)
3138 {
3139 struct pt_packet_cbr packet;
3140 struct pt_event *event;
3141 int size, errcode;
3142
3143 if (!decoder)
3144 return -pte_internal;
3145
3146 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config);
3147 if (size < 0)
3148 return size;
3149
3150 errcode = pt_qry_apply_cbr(&decoder->time, &decoder->tcal,
3151 &packet, &decoder->config);
3152 if (errcode < 0)
3153 return errcode;
3154
3155 event = pt_evq_standalone(&decoder->evq);
3156 if (!event)
3157 return -pte_internal;
3158
3159 event->type = ptev_cbr;
3160 event->variant.cbr.ratio = packet.ratio;
3161
3162 decoder->event = event;
3163
3164 errcode = pt_qry_event_time(event, decoder);
3165 if (errcode < 0)
3166 return errcode;
3167
3168 decoder->pos += size;
3169 return 0;
3170 }
3171
pt_qry_header_cbr(struct pt_query_decoder * decoder)3172 int pt_qry_header_cbr(struct pt_query_decoder *decoder)
3173 {
3174 struct pt_packet_cbr packet;
3175 struct pt_event *event;
3176 int size, errcode;
3177
3178 if (!decoder)
3179 return -pte_internal;
3180
3181 size = pt_pkt_read_cbr(&packet, decoder->pos, &decoder->config);
3182 if (size < 0)
3183 return size;
3184
3185 errcode = pt_qry_apply_header_cbr(&decoder->time, &decoder->tcal,
3186 &packet, &decoder->config);
3187 if (errcode < 0)
3188 return errcode;
3189
3190 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3191 if (!event)
3192 return -pte_nomem;
3193
3194 event->type = ptev_cbr;
3195 event->variant.cbr.ratio = packet.ratio;
3196
3197 decoder->pos += size;
3198 return 0;
3199 }
3200
pt_qry_decode_tma(struct pt_query_decoder * decoder)3201 int pt_qry_decode_tma(struct pt_query_decoder *decoder)
3202 {
3203 struct pt_packet_tma packet;
3204 int size, errcode;
3205
3206 if (!decoder)
3207 return -pte_internal;
3208
3209 size = pt_pkt_read_tma(&packet, decoder->pos, &decoder->config);
3210 if (size < 0)
3211 return size;
3212
3213 errcode = pt_qry_apply_tma(&decoder->time, &decoder->tcal,
3214 &packet, &decoder->config);
3215 if (errcode < 0)
3216 return errcode;
3217
3218 decoder->pos += size;
3219 return 0;
3220 }
3221
pt_qry_decode_mtc(struct pt_query_decoder * decoder)3222 int pt_qry_decode_mtc(struct pt_query_decoder *decoder)
3223 {
3224 struct pt_packet_mtc packet;
3225 int size, errcode;
3226
3227 if (!decoder)
3228 return -pte_internal;
3229
3230 size = pt_pkt_read_mtc(&packet, decoder->pos, &decoder->config);
3231 if (size < 0)
3232 return size;
3233
3234 errcode = pt_qry_apply_mtc(&decoder->time, &decoder->tcal,
3235 &packet, &decoder->config);
3236 if (errcode < 0)
3237 return errcode;
3238
3239 decoder->pos += size;
3240 return 0;
3241 }
3242
check_erratum_skd007(struct pt_query_decoder * decoder,const struct pt_packet_cyc * packet,int size)3243 static int check_erratum_skd007(struct pt_query_decoder *decoder,
3244 const struct pt_packet_cyc *packet, int size)
3245 {
3246 const uint8_t *pos;
3247 uint16_t payload;
3248
3249 if (!decoder || !packet || size < 0)
3250 return -pte_internal;
3251
3252 /* It must be a 2-byte CYC. */
3253 if (size != 2)
3254 return 0;
3255
3256 payload = (uint16_t) packet->value;
3257
3258 /* The 2nd byte of the CYC payload must look like an ext opcode. */
3259 if ((payload & ~0x1f) != 0x20)
3260 return 0;
3261
3262 /* Skip this CYC packet. */
3263 pos = decoder->pos + size;
3264 if (decoder->config.end <= pos)
3265 return 0;
3266
3267 /* See if we got a second CYC that looks like an OVF ext opcode. */
3268 if (*pos != pt_ext_ovf)
3269 return 0;
3270
3271 /* We shouldn't get back-to-back CYCs unless they are sent when the
3272 * counter wraps around. In this case, we'd expect a full payload.
3273 *
3274 * Since we got two non-full CYC packets, we assume the erratum hit.
3275 */
3276
3277 return 1;
3278 }
3279
pt_qry_decode_cyc(struct pt_query_decoder * decoder)3280 int pt_qry_decode_cyc(struct pt_query_decoder *decoder)
3281 {
3282 struct pt_packet_cyc packet;
3283 struct pt_config *config;
3284 int size, errcode;
3285
3286 if (!decoder)
3287 return -pte_internal;
3288
3289 config = &decoder->config;
3290
3291 size = pt_pkt_read_cyc(&packet, decoder->pos, config);
3292 if (size < 0)
3293 return size;
3294
3295 if (config->errata.skd007) {
3296 errcode = check_erratum_skd007(decoder, &packet, size);
3297 if (errcode < 0)
3298 return errcode;
3299
3300 /* If the erratum hits, we ignore the partial CYC and instead
3301 * process the OVF following/overlapping it.
3302 */
3303 if (errcode) {
3304 /* We skip the first byte of the CYC, which brings us
3305 * to the beginning of the OVF packet.
3306 */
3307 decoder->pos += 1;
3308 return 0;
3309 }
3310 }
3311
3312 errcode = pt_qry_apply_cyc(&decoder->time, &decoder->tcal,
3313 &packet, config);
3314 if (errcode < 0)
3315 return errcode;
3316
3317 decoder->pos += size;
3318 return 0;
3319 }
3320
pt_qry_decode_stop(struct pt_query_decoder * decoder)3321 int pt_qry_decode_stop(struct pt_query_decoder *decoder)
3322 {
3323 struct pt_event *event;
3324 int errcode;
3325
3326 if (!decoder)
3327 return -pte_internal;
3328
3329 /* Stop events are reported immediately. */
3330 event = pt_evq_standalone(&decoder->evq);
3331 if (!event)
3332 return -pte_internal;
3333
3334 event->type = ptev_stop;
3335
3336 decoder->event = event;
3337
3338 errcode = pt_qry_event_time(event, decoder);
3339 if (errcode < 0)
3340 return errcode;
3341
3342 decoder->pos += ptps_stop;
3343 return 0;
3344 }
3345
pt_qry_header_vmcs(struct pt_query_decoder * decoder)3346 int pt_qry_header_vmcs(struct pt_query_decoder *decoder)
3347 {
3348 struct pt_packet_vmcs packet;
3349 struct pt_event *event;
3350 int size;
3351
3352 if (!decoder)
3353 return -pte_internal;
3354
3355 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config);
3356 if (size < 0)
3357 return size;
3358
3359 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3360 if (!event)
3361 return -pte_nomem;
3362
3363 event->type = ptev_async_vmcs;
3364 event->variant.async_vmcs.base = packet.base;
3365
3366 decoder->pos += size;
3367 return 0;
3368 }
3369
pt_qry_decode_vmcs(struct pt_query_decoder * decoder)3370 int pt_qry_decode_vmcs(struct pt_query_decoder *decoder)
3371 {
3372 struct pt_packet_vmcs packet;
3373 struct pt_event *event;
3374 int size, errcode;
3375
3376 if (!decoder)
3377 return -pte_internal;
3378
3379 size = pt_pkt_read_vmcs(&packet, decoder->pos, &decoder->config);
3380 if (size < 0)
3381 return size;
3382
3383 /* VMCS events bind to the same IP as an in-flight async paging event.
3384 *
3385 * In that case, the VMCS event should be applied first. We reorder
3386 * events here to simplify the life of higher layers.
3387 */
3388 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_paging);
3389 if (event) {
3390 struct pt_event *paging;
3391
3392 paging = pt_evq_enqueue(&decoder->evq, evb_tip);
3393 if (!paging)
3394 return -pte_nomem;
3395
3396 *paging = *event;
3397
3398 event->type = ptev_async_vmcs;
3399 event->variant.async_vmcs.base = packet.base;
3400
3401 decoder->pos += size;
3402 return 0;
3403 }
3404
3405 /* VMCS events bind to the same TIP packet as an in-flight async
3406 * branch event.
3407 */
3408 event = pt_evq_find(&decoder->evq, evb_tip, ptev_async_branch);
3409 if (event) {
3410 event = pt_evq_enqueue(&decoder->evq, evb_tip);
3411 if (!event)
3412 return -pte_nomem;
3413
3414 event->type = ptev_async_vmcs;
3415 event->variant.async_vmcs.base = packet.base;
3416
3417 decoder->pos += size;
3418 return 0;
3419 }
3420
3421 /* VMCS events that do not bind to an in-flight async event are
3422 * stand-alone.
3423 */
3424 event = pt_evq_standalone(&decoder->evq);
3425 if (!event)
3426 return -pte_internal;
3427
3428 event->type = ptev_vmcs;
3429 event->variant.vmcs.base = packet.base;
3430
3431 decoder->event = event;
3432
3433 errcode = pt_qry_event_time(event, decoder);
3434 if (errcode < 0)
3435 return errcode;
3436
3437 decoder->pos += size;
3438 return 0;
3439 }
3440
pt_qry_decode_mnt(struct pt_query_decoder * decoder)3441 int pt_qry_decode_mnt(struct pt_query_decoder *decoder)
3442 {
3443 struct pt_packet_mnt packet;
3444 struct pt_event *event;
3445 int size, errcode;
3446
3447 if (!decoder)
3448 return -pte_internal;
3449
3450 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config);
3451 if (size < 0)
3452 return size;
3453
3454 event = pt_evq_standalone(&decoder->evq);
3455 if (!event)
3456 return -pte_internal;
3457
3458 event->type = ptev_mnt;
3459 event->variant.mnt.payload = packet.payload;
3460
3461 decoder->event = event;
3462
3463 errcode = pt_qry_event_time(event, decoder);
3464 if (errcode < 0)
3465 return errcode;
3466
3467 decoder->pos += size;
3468
3469 return 0;
3470 }
3471
pt_qry_header_mnt(struct pt_query_decoder * decoder)3472 int pt_qry_header_mnt(struct pt_query_decoder *decoder)
3473 {
3474 struct pt_packet_mnt packet;
3475 struct pt_event *event;
3476 int size;
3477
3478 if (!decoder)
3479 return -pte_internal;
3480
3481 size = pt_pkt_read_mnt(&packet, decoder->pos, &decoder->config);
3482 if (size < 0)
3483 return size;
3484
3485 event = pt_evq_enqueue(&decoder->evq, evb_psbend);
3486 if (!event)
3487 return -pte_nomem;
3488
3489 event->type = ptev_mnt;
3490 event->variant.mnt.payload = packet.payload;
3491
3492 decoder->pos += size;
3493
3494 return 0;
3495 }
3496
pt_qry_decode_exstop(struct pt_query_decoder * decoder)3497 int pt_qry_decode_exstop(struct pt_query_decoder *decoder)
3498 {
3499 struct pt_packet_exstop packet;
3500 struct pt_event *event;
3501 int size;
3502
3503 if (!decoder)
3504 return -pte_internal;
3505
3506 size = pt_pkt_read_exstop(&packet, decoder->pos, &decoder->config);
3507 if (size < 0)
3508 return size;
3509
3510 if (packet.ip) {
3511 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3512 if (!event)
3513 return -pte_internal;
3514
3515 event->type = ptev_exstop;
3516 } else {
3517 event = pt_evq_standalone(&decoder->evq);
3518 if (!event)
3519 return -pte_internal;
3520
3521 event->type = ptev_exstop;
3522
3523 event->ip_suppressed = 1;
3524 event->variant.exstop.ip = 0ull;
3525
3526 decoder->event = event;
3527 }
3528
3529 decoder->pos += size;
3530 return 0;
3531 }
3532
pt_qry_decode_mwait(struct pt_query_decoder * decoder)3533 int pt_qry_decode_mwait(struct pt_query_decoder *decoder)
3534 {
3535 struct pt_packet_mwait packet;
3536 struct pt_event *event;
3537 int size;
3538
3539 if (!decoder)
3540 return -pte_internal;
3541
3542 size = pt_pkt_read_mwait(&packet, decoder->pos, &decoder->config);
3543 if (size < 0)
3544 return size;
3545
3546 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3547 if (!event)
3548 return -pte_internal;
3549
3550 event->type = ptev_mwait;
3551 event->variant.mwait.hints = packet.hints;
3552 event->variant.mwait.ext = packet.ext;
3553
3554 decoder->pos += size;
3555 return 0;
3556 }
3557
pt_qry_decode_pwre(struct pt_query_decoder * decoder)3558 int pt_qry_decode_pwre(struct pt_query_decoder *decoder)
3559 {
3560 struct pt_packet_pwre packet;
3561 struct pt_event *event;
3562 int size;
3563
3564 if (!decoder)
3565 return -pte_internal;
3566
3567 size = pt_pkt_read_pwre(&packet, decoder->pos, &decoder->config);
3568 if (size < 0)
3569 return size;
3570
3571 event = pt_evq_standalone(&decoder->evq);
3572 if (!event)
3573 return -pte_internal;
3574
3575 event->type = ptev_pwre;
3576 event->variant.pwre.state = packet.state;
3577 event->variant.pwre.sub_state = packet.sub_state;
3578
3579 if (packet.hw)
3580 event->variant.pwre.hw = 1;
3581
3582 decoder->event = event;
3583
3584 decoder->pos += size;
3585 return 0;
3586 }
3587
pt_qry_decode_pwrx(struct pt_query_decoder * decoder)3588 int pt_qry_decode_pwrx(struct pt_query_decoder *decoder)
3589 {
3590 struct pt_packet_pwrx packet;
3591 struct pt_event *event;
3592 int size;
3593
3594 if (!decoder)
3595 return -pte_internal;
3596
3597 size = pt_pkt_read_pwrx(&packet, decoder->pos, &decoder->config);
3598 if (size < 0)
3599 return size;
3600
3601 event = pt_evq_standalone(&decoder->evq);
3602 if (!event)
3603 return -pte_internal;
3604
3605 event->type = ptev_pwrx;
3606 event->variant.pwrx.last = packet.last;
3607 event->variant.pwrx.deepest = packet.deepest;
3608
3609 if (packet.interrupt)
3610 event->variant.pwrx.interrupt = 1;
3611 if (packet.store)
3612 event->variant.pwrx.store = 1;
3613 if (packet.autonomous)
3614 event->variant.pwrx.autonomous = 1;
3615
3616 decoder->event = event;
3617
3618 decoder->pos += size;
3619 return 0;
3620 }
3621
pt_qry_decode_ptw(struct pt_query_decoder * decoder)3622 int pt_qry_decode_ptw(struct pt_query_decoder *decoder)
3623 {
3624 struct pt_packet_ptw packet;
3625 struct pt_event *event;
3626 int size, pls;
3627
3628 if (!decoder)
3629 return -pte_internal;
3630
3631 size = pt_pkt_read_ptw(&packet, decoder->pos, &decoder->config);
3632 if (size < 0)
3633 return size;
3634
3635 pls = pt_ptw_size(packet.plc);
3636 if (pls < 0)
3637 return pls;
3638
3639 if (packet.ip) {
3640 event = pt_evq_enqueue(&decoder->evq, evb_fup);
3641 if (!event)
3642 return -pte_internal;
3643 } else {
3644 event = pt_evq_standalone(&decoder->evq);
3645 if (!event)
3646 return -pte_internal;
3647
3648 event->ip_suppressed = 1;
3649
3650 decoder->event = event;
3651 }
3652
3653 event->type = ptev_ptwrite;
3654 event->variant.ptwrite.size = (uint8_t) pls;
3655 event->variant.ptwrite.payload = packet.payload;
3656
3657 decoder->pos += size;
3658 return 0;
3659 }
3660