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