]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/processor-trace/libipt/src/pt_insn_decoder.c
MFV r349535: less v551.
[FreeBSD/FreeBSD.git] / contrib / processor-trace / libipt / src / pt_insn_decoder.c
1 /*
2  * Copyright (c) 2013-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_insn_decoder.h"
30 #include "pt_insn.h"
31 #include "pt_config.h"
32 #include "pt_asid.h"
33 #include "pt_compiler.h"
34
35 #include "intel-pt.h"
36
37 #include <string.h>
38 #include <stdlib.h>
39
40
41 static int pt_insn_check_ip_event(struct pt_insn_decoder *,
42                                   const struct pt_insn *,
43                                   const struct pt_insn_ext *);
44
45
46 static void pt_insn_reset(struct pt_insn_decoder *decoder)
47 {
48         if (!decoder)
49                 return;
50
51         decoder->mode = ptem_unknown;
52         decoder->ip = 0ull;
53         decoder->status = 0;
54         decoder->enabled = 0;
55         decoder->process_event = 0;
56         decoder->speculative = 0;
57         decoder->process_insn = 0;
58         decoder->bound_paging = 0;
59         decoder->bound_vmcs = 0;
60         decoder->bound_ptwrite = 0;
61
62         pt_retstack_init(&decoder->retstack);
63         pt_asid_init(&decoder->asid);
64 }
65
66 static int pt_insn_status(const struct pt_insn_decoder *decoder, int flags)
67 {
68         int status;
69
70         if (!decoder)
71                 return -pte_internal;
72
73         status = decoder->status;
74
75         /* Indicate whether tracing is disabled or enabled.
76          *
77          * This duplicates the indication in struct pt_insn and covers the case
78          * where we indicate the status after synchronizing.
79          */
80         if (!decoder->enabled)
81                 flags |= pts_ip_suppressed;
82
83         /* Forward end-of-trace indications.
84          *
85          * Postpone it as long as we're still processing events, though.
86          */
87         if ((status & pts_eos) && !decoder->process_event)
88                 flags |= pts_eos;
89
90         return flags;
91 }
92
93 /* Initialize the query decoder flags based on our flags. */
94
95 static int pt_insn_init_qry_flags(struct pt_conf_flags *qflags,
96                                   const struct pt_conf_flags *flags)
97 {
98         if (!qflags || !flags)
99                 return -pte_internal;
100
101         memset(qflags, 0, sizeof(*qflags));
102
103         return 0;
104 }
105
106 int pt_insn_decoder_init(struct pt_insn_decoder *decoder,
107                          const struct pt_config *uconfig)
108 {
109         struct pt_config config;
110         int errcode;
111
112         if (!decoder)
113                 return -pte_internal;
114
115         errcode = pt_config_from_user(&config, uconfig);
116         if (errcode < 0)
117                 return errcode;
118
119         /* The user supplied decoder flags. */
120         decoder->flags = config.flags;
121
122         /* Set the flags we need for the query decoder we use. */
123         errcode = pt_insn_init_qry_flags(&config.flags, &decoder->flags);
124         if (errcode < 0)
125                 return errcode;
126
127         errcode = pt_qry_decoder_init(&decoder->query, &config);
128         if (errcode < 0)
129                 return errcode;
130
131         pt_image_init(&decoder->default_image, NULL);
132         decoder->image = &decoder->default_image;
133
134         errcode = pt_msec_cache_init(&decoder->scache);
135         if (errcode < 0)
136                 return errcode;
137
138         pt_insn_reset(decoder);
139
140         return 0;
141 }
142
143 void pt_insn_decoder_fini(struct pt_insn_decoder *decoder)
144 {
145         if (!decoder)
146                 return;
147
148         pt_msec_cache_fini(&decoder->scache);
149         pt_image_fini(&decoder->default_image);
150         pt_qry_decoder_fini(&decoder->query);
151 }
152
153 struct pt_insn_decoder *pt_insn_alloc_decoder(const struct pt_config *config)
154 {
155         struct pt_insn_decoder *decoder;
156         int errcode;
157
158         decoder = malloc(sizeof(*decoder));
159         if (!decoder)
160                 return NULL;
161
162         errcode = pt_insn_decoder_init(decoder, config);
163         if (errcode < 0) {
164                 free(decoder);
165                 return NULL;
166         }
167
168         return decoder;
169 }
170
171 void pt_insn_free_decoder(struct pt_insn_decoder *decoder)
172 {
173         if (!decoder)
174                 return;
175
176         pt_insn_decoder_fini(decoder);
177         free(decoder);
178 }
179
180 /* Maybe synthesize a tick event.
181  *
182  * If we're not already processing events, check the current time against the
183  * last event's time.  If it changed, synthesize a tick event with the new time.
184  *
185  * Returns zero if no tick event has been created.
186  * Returns a positive integer if a tick event has been created.
187  * Returns a negative error code otherwise.
188  */
189 static int pt_insn_tick(struct pt_insn_decoder *decoder, uint64_t ip)
190 {
191         struct pt_event *ev;
192         uint64_t tsc;
193         uint32_t lost_mtc, lost_cyc;
194         int errcode;
195
196         if (!decoder)
197                 return -pte_internal;
198
199         /* We're not generating tick events if tracing is disabled. */
200         if (!decoder->enabled)
201                 return -pte_internal;
202
203         /* Events already provide a timestamp so there is no need to synthesize
204          * an artificial tick event.  There's no room, either, since this would
205          * overwrite the in-progress event.
206          *
207          * In rare cases where we need to proceed to an event location using
208          * trace this may cause us to miss a timing update if the event is not
209          * forwarded to the user.
210          *
211          * The only case I can come up with at the moment is a MODE.EXEC binding
212          * to the TIP IP of a far branch.
213          */
214         if (decoder->process_event)
215                 return 0;
216
217         errcode = pt_qry_time(&decoder->query, &tsc, &lost_mtc, &lost_cyc);
218         if (errcode < 0) {
219                 /* If we don't have wall-clock time, we use relative time. */
220                 if (errcode != -pte_no_time)
221                         return errcode;
222         }
223
224         ev = &decoder->event;
225
226         /* We're done if time has not changed since the last event. */
227         if (tsc == ev->tsc)
228                 return 0;
229
230         /* Time has changed so we create a new tick event. */
231         memset(ev, 0, sizeof(*ev));
232         ev->type = ptev_tick;
233         ev->variant.tick.ip = ip;
234
235         /* Indicate if we have wall-clock time or only relative time. */
236         if (errcode != -pte_no_time)
237                 ev->has_tsc = 1;
238         ev->tsc = tsc;
239         ev->lost_mtc = lost_mtc;
240         ev->lost_cyc = lost_cyc;
241
242         /* We now have an event to process. */
243         decoder->process_event = 1;
244
245         return 1;
246 }
247
248 /* Query an indirect branch.
249  *
250  * Returns zero on success, a negative error code otherwise.
251  */
252 static int pt_insn_indirect_branch(struct pt_insn_decoder *decoder,
253                                    uint64_t *ip)
254 {
255         uint64_t evip;
256         int status, errcode;
257
258         if (!decoder)
259                 return -pte_internal;
260
261         evip = decoder->ip;
262
263         status = pt_qry_indirect_branch(&decoder->query, ip);
264         if (status < 0)
265                 return status;
266
267         if (decoder->flags.variant.insn.enable_tick_events) {
268                 errcode = pt_insn_tick(decoder, evip);
269                 if (errcode < 0)
270                         return errcode;
271         }
272
273         return status;
274 }
275
276 /* Query a conditional branch.
277  *
278  * Returns zero on success, a negative error code otherwise.
279  */
280 static int pt_insn_cond_branch(struct pt_insn_decoder *decoder, int *taken)
281 {
282         int status, errcode;
283
284         if (!decoder)
285                 return -pte_internal;
286
287         status = pt_qry_cond_branch(&decoder->query, taken);
288         if (status < 0)
289                 return status;
290
291         if (decoder->flags.variant.insn.enable_tick_events) {
292                 errcode = pt_insn_tick(decoder, decoder->ip);
293                 if (errcode < 0)
294                         return errcode;
295         }
296
297         return status;
298 }
299
300 static int pt_insn_start(struct pt_insn_decoder *decoder, int status)
301 {
302         if (!decoder)
303                 return -pte_internal;
304
305         if (status < 0)
306                 return status;
307
308         decoder->status = status;
309
310         if (!(status & pts_ip_suppressed))
311                 decoder->enabled = 1;
312
313         /* Process any initial events.
314          *
315          * Some events are processed after proceeding to the next IP in order to
316          * indicate things like tracing disable or trace stop in the preceding
317          * instruction.  Those events will be processed without such an
318          * indication before decoding the current instruction.
319          *
320          * We do this already here so we can indicate user-events that precede
321          * the first instruction.
322          */
323         return pt_insn_check_ip_event(decoder, NULL, NULL);
324 }
325
326 int pt_insn_sync_forward(struct pt_insn_decoder *decoder)
327 {
328         int status;
329
330         if (!decoder)
331                 return -pte_invalid;
332
333         pt_insn_reset(decoder);
334
335         status = pt_qry_sync_forward(&decoder->query, &decoder->ip);
336
337         return pt_insn_start(decoder, status);
338 }
339
340 int pt_insn_sync_backward(struct pt_insn_decoder *decoder)
341 {
342         int status;
343
344         if (!decoder)
345                 return -pte_invalid;
346
347         pt_insn_reset(decoder);
348
349         status = pt_qry_sync_backward(&decoder->query, &decoder->ip);
350
351         return pt_insn_start(decoder, status);
352 }
353
354 int pt_insn_sync_set(struct pt_insn_decoder *decoder, uint64_t offset)
355 {
356         int status;
357
358         if (!decoder)
359                 return -pte_invalid;
360
361         pt_insn_reset(decoder);
362
363         status = pt_qry_sync_set(&decoder->query, &decoder->ip, offset);
364
365         return pt_insn_start(decoder, status);
366 }
367
368 int pt_insn_get_offset(const struct pt_insn_decoder *decoder, uint64_t *offset)
369 {
370         if (!decoder)
371                 return -pte_invalid;
372
373         return pt_qry_get_offset(&decoder->query, offset);
374 }
375
376 int pt_insn_get_sync_offset(const struct pt_insn_decoder *decoder,
377                             uint64_t *offset)
378 {
379         if (!decoder)
380                 return -pte_invalid;
381
382         return pt_qry_get_sync_offset(&decoder->query, offset);
383 }
384
385 struct pt_image *pt_insn_get_image(struct pt_insn_decoder *decoder)
386 {
387         if (!decoder)
388                 return NULL;
389
390         return decoder->image;
391 }
392
393 int pt_insn_set_image(struct pt_insn_decoder *decoder,
394                       struct pt_image *image)
395 {
396         if (!decoder)
397                 return -pte_invalid;
398
399         if (!image)
400                 image = &decoder->default_image;
401
402         decoder->image = image;
403         return 0;
404 }
405
406 const struct pt_config *
407 pt_insn_get_config(const struct pt_insn_decoder *decoder)
408 {
409         if (!decoder)
410                 return NULL;
411
412         return pt_qry_get_config(&decoder->query);
413 }
414
415 int pt_insn_time(struct pt_insn_decoder *decoder, uint64_t *time,
416                  uint32_t *lost_mtc, uint32_t *lost_cyc)
417 {
418         if (!decoder || !time)
419                 return -pte_invalid;
420
421         return pt_qry_time(&decoder->query, time, lost_mtc, lost_cyc);
422 }
423
424 int pt_insn_core_bus_ratio(struct pt_insn_decoder *decoder, uint32_t *cbr)
425 {
426         if (!decoder || !cbr)
427                 return -pte_invalid;
428
429         return pt_qry_core_bus_ratio(&decoder->query, cbr);
430 }
431
432 int pt_insn_asid(const struct pt_insn_decoder *decoder, struct pt_asid *asid,
433                  size_t size)
434 {
435         if (!decoder || !asid)
436                 return -pte_invalid;
437
438         return pt_asid_to_user(asid, &decoder->asid, size);
439 }
440
441 static inline int event_pending(struct pt_insn_decoder *decoder)
442 {
443         int status;
444
445         if (!decoder)
446                 return -pte_invalid;
447
448         if (decoder->process_event)
449                 return 1;
450
451         status = decoder->status;
452         if (!(status & pts_event_pending))
453                 return 0;
454
455         status = pt_qry_event(&decoder->query, &decoder->event,
456                               sizeof(decoder->event));
457         if (status < 0)
458                 return status;
459
460         decoder->process_event = 1;
461         decoder->status = status;
462         return 1;
463 }
464
465 static int check_erratum_skd022(struct pt_insn_decoder *decoder)
466 {
467         struct pt_insn_ext iext;
468         struct pt_insn insn;
469         int errcode;
470
471         if (!decoder)
472                 return -pte_internal;
473
474         insn.mode = decoder->mode;
475         insn.ip = decoder->ip;
476
477         errcode = pt_insn_decode(&insn, &iext, decoder->image, &decoder->asid);
478         if (errcode < 0)
479                 return 0;
480
481         switch (iext.iclass) {
482         default:
483                 return 0;
484
485         case PTI_INST_VMLAUNCH:
486         case PTI_INST_VMRESUME:
487                 return 1;
488         }
489 }
490
491 static inline int handle_erratum_skd022(struct pt_insn_decoder *decoder)
492 {
493         struct pt_event *ev;
494         uint64_t ip;
495         int errcode;
496
497         if (!decoder)
498                 return -pte_internal;
499
500         errcode = check_erratum_skd022(decoder);
501         if (errcode <= 0)
502                 return errcode;
503
504         /* We turn the async disable into a sync disable.  It will be processed
505          * after decoding the instruction.
506          */
507         ev = &decoder->event;
508
509         ip = ev->variant.async_disabled.ip;
510
511         ev->type = ptev_disabled;
512         ev->variant.disabled.ip = ip;
513
514         return 1;
515 }
516
517 static int pt_insn_proceed(struct pt_insn_decoder *decoder,
518                            const struct pt_insn *insn,
519                            const struct pt_insn_ext *iext)
520 {
521         if (!decoder || !insn || !iext)
522                 return -pte_internal;
523
524         /* Branch displacements apply to the next instruction. */
525         decoder->ip += insn->size;
526
527         /* We handle non-branches, non-taken conditional branches, and
528          * compressed returns directly in the switch and do some pre-work for
529          * calls.
530          *
531          * All kinds of branches are handled below the switch.
532          */
533         switch (insn->iclass) {
534         case ptic_ptwrite:
535         case ptic_other:
536                 return 0;
537
538         case ptic_cond_jump: {
539                 int status, taken;
540
541                 status = pt_insn_cond_branch(decoder, &taken);
542                 if (status < 0)
543                         return status;
544
545                 decoder->status = status;
546                 if (!taken)
547                         return 0;
548
549                 break;
550         }
551
552         case ptic_call:
553                 /* Log the call for return compression.
554                  *
555                  * Unless this is a call to the next instruction as is used
556                  * for position independent code.
557                  */
558                 if (iext->variant.branch.displacement ||
559                     !iext->variant.branch.is_direct)
560                         pt_retstack_push(&decoder->retstack, decoder->ip);
561
562                 break;
563
564         case ptic_return: {
565                 int taken, status;
566
567                 /* Check for a compressed return. */
568                 status = pt_insn_cond_branch(decoder, &taken);
569                 if (status >= 0) {
570                         decoder->status = status;
571
572                         /* A compressed return is indicated by a taken
573                          * conditional branch.
574                          */
575                         if (!taken)
576                                 return -pte_bad_retcomp;
577
578                         return pt_retstack_pop(&decoder->retstack,
579                                                &decoder->ip);
580                 }
581
582                 break;
583         }
584
585         case ptic_jump:
586         case ptic_far_call:
587         case ptic_far_return:
588         case ptic_far_jump:
589                 break;
590
591         case ptic_error:
592                 return -pte_bad_insn;
593         }
594
595         /* Process a direct or indirect branch.
596          *
597          * This combines calls, uncompressed returns, taken conditional jumps,
598          * and all flavors of far transfers.
599          */
600         if (iext->variant.branch.is_direct)
601                 decoder->ip += iext->variant.branch.displacement;
602         else {
603                 int status;
604
605                 status = pt_insn_indirect_branch(decoder, &decoder->ip);
606
607                 if (status < 0)
608                         return status;
609
610                 decoder->status = status;
611
612                 /* We do need an IP to proceed. */
613                 if (status & pts_ip_suppressed)
614                         return -pte_noip;
615         }
616
617         return 0;
618 }
619
620 static int pt_insn_at_skl014(const struct pt_event *ev,
621                              const struct pt_insn *insn,
622                              const struct pt_insn_ext *iext,
623                              const struct pt_config *config)
624 {
625         uint64_t ip;
626         int status;
627
628         if (!ev || !insn || !iext || !config)
629                 return -pte_internal;
630
631         if (!ev->ip_suppressed)
632                 return 0;
633
634         switch (insn->iclass) {
635         case ptic_call:
636         case ptic_jump:
637                 /* The erratum only applies to unconditional direct branches. */
638                 if (!iext->variant.branch.is_direct)
639                         break;
640
641                 /* Check the filter against the branch target. */
642                 ip = insn->ip;
643                 ip += insn->size;
644                 ip += iext->variant.branch.displacement;
645
646                 status = pt_filter_addr_check(&config->addr_filter, ip);
647                 if (status <= 0) {
648                         if (status < 0)
649                                 return status;
650
651                         return 1;
652                 }
653                 break;
654
655         default:
656                 break;
657         }
658
659         return 0;
660 }
661
662 static int pt_insn_at_disabled_event(const struct pt_event *ev,
663                                      const struct pt_insn *insn,
664                                      const struct pt_insn_ext *iext,
665                                      const struct pt_config *config)
666 {
667         if (!ev || !insn || !iext || !config)
668                 return -pte_internal;
669
670         if (ev->ip_suppressed) {
671                 if (pt_insn_is_far_branch(insn, iext) ||
672                     pt_insn_changes_cpl(insn, iext) ||
673                     pt_insn_changes_cr3(insn, iext))
674                         return 1;
675
676                 /* If we don't have a filter configuration we assume that no
677                  * address filters were used and the erratum does not apply.
678                  *
679                  * We might otherwise disable tracing too early.
680                  */
681                 if (config->addr_filter.config.addr_cfg &&
682                     config->errata.skl014 &&
683                     pt_insn_at_skl014(ev, insn, iext, config))
684                         return 1;
685         } else {
686                 switch (insn->iclass) {
687                 case ptic_ptwrite:
688                 case ptic_other:
689                         break;
690
691                 case ptic_call:
692                 case ptic_jump:
693                         /* If we got an IP with the disabled event, we may
694                          * ignore direct branches that go to a different IP.
695                          */
696                         if (iext->variant.branch.is_direct) {
697                                 uint64_t ip;
698
699                                 ip = insn->ip;
700                                 ip += insn->size;
701                                 ip += iext->variant.branch.displacement;
702
703                                 if (ip != ev->variant.disabled.ip)
704                                         break;
705                         }
706
707                         fallthrough;
708                 case ptic_return:
709                 case ptic_far_call:
710                 case ptic_far_return:
711                 case ptic_far_jump:
712                 case ptic_cond_jump:
713                         return 1;
714
715                 case ptic_error:
716                         return -pte_bad_insn;
717                 }
718         }
719
720         return 0;
721 }
722
723 /* Postpone proceeding past @insn/@iext and indicate a pending event.
724  *
725  * There may be further events pending on @insn/@iext.  Postpone proceeding past
726  * @insn/@iext until we processed all events that bind to it.
727  *
728  * Returns a non-negative pt_status_flag bit-vector indicating a pending event
729  * on success, a negative pt_error_code otherwise.
730  */
731 static int pt_insn_postpone(struct pt_insn_decoder *decoder,
732                             const struct pt_insn *insn,
733                             const struct pt_insn_ext *iext)
734 {
735         if (!decoder || !insn || !iext)
736                 return -pte_internal;
737
738         if (!decoder->process_insn) {
739                 decoder->process_insn = 1;
740                 decoder->insn = *insn;
741                 decoder->iext = *iext;
742         }
743
744         return pt_insn_status(decoder, pts_event_pending);
745 }
746
747 /* Remove any postponed instruction from @decoder.
748  *
749  * Returns zero on success, a negative pt_error_code otherwise.
750  */
751 static int pt_insn_clear_postponed(struct pt_insn_decoder *decoder)
752 {
753         if (!decoder)
754                 return -pte_internal;
755
756         decoder->process_insn = 0;
757         decoder->bound_paging = 0;
758         decoder->bound_vmcs = 0;
759         decoder->bound_ptwrite = 0;
760
761         return 0;
762 }
763
764 /* Proceed past a postponed instruction.
765  *
766  * Returns zero on success, a negative pt_error_code otherwise.
767  */
768 static int pt_insn_proceed_postponed(struct pt_insn_decoder *decoder)
769 {
770         int status;
771
772         if (!decoder)
773                 return -pte_internal;
774
775         if (!decoder->process_insn)
776                 return -pte_internal;
777
778         /* There's nothing to do if tracing got disabled. */
779         if (!decoder->enabled)
780                 return pt_insn_clear_postponed(decoder);
781
782         status = pt_insn_proceed(decoder, &decoder->insn, &decoder->iext);
783         if (status < 0)
784                 return status;
785
786         return pt_insn_clear_postponed(decoder);
787 }
788
789 /* Check for events that bind to instruction.
790  *
791  * Check whether an event is pending that binds to @insn/@iext, and, if that is
792  * the case, proceed past @insn/@iext and indicate the event by setting
793  * pts_event_pending.
794  *
795  * If that is not the case, we return zero.  This is what pt_insn_status() would
796  * return since:
797  *
798  *   - we suppress pts_eos as long as we're processing events
799  *   - we do not set pts_ip_suppressed since tracing must be enabled
800  *
801  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
802  * code otherwise.
803  */
804 static int pt_insn_check_insn_event(struct pt_insn_decoder *decoder,
805                                     const struct pt_insn *insn,
806                                     const struct pt_insn_ext *iext)
807 {
808         struct pt_event *ev;
809         int status;
810
811         if (!decoder)
812                 return -pte_internal;
813
814         status = event_pending(decoder);
815         if (status <= 0)
816                 return status;
817
818         ev = &decoder->event;
819         switch (ev->type) {
820         case ptev_enabled:
821         case ptev_overflow:
822         case ptev_async_paging:
823         case ptev_async_vmcs:
824         case ptev_async_disabled:
825         case ptev_async_branch:
826         case ptev_exec_mode:
827         case ptev_tsx:
828         case ptev_stop:
829         case ptev_exstop:
830         case ptev_mwait:
831         case ptev_pwre:
832         case ptev_pwrx:
833         case ptev_tick:
834         case ptev_cbr:
835         case ptev_mnt:
836                 /* We're only interested in events that bind to instructions. */
837                 return 0;
838
839         case ptev_disabled:
840                 status = pt_insn_at_disabled_event(ev, insn, iext,
841                                                    &decoder->query.config);
842                 if (status <= 0)
843                         return status;
844
845                 /* We're at a synchronous disable event location.
846                  *
847                  * Let's determine the IP at which we expect tracing to resume.
848                  */
849                 status = pt_insn_next_ip(&decoder->ip, insn, iext);
850                 if (status < 0) {
851                         /* We don't know the IP on error. */
852                         decoder->ip = 0ull;
853
854                         /* For indirect calls, assume that we return to the next
855                          * instruction.
856                          *
857                          * We only check the instruction class, not the
858                          * is_direct property, since direct calls would have
859                          * been handled by pt_insn_nex_ip() or would have
860                          * provoked a different error.
861                          */
862                         if (status != -pte_bad_query)
863                                 return status;
864
865                         switch (insn->iclass) {
866                         case ptic_call:
867                         case ptic_far_call:
868                                 decoder->ip = insn->ip + insn->size;
869                                 break;
870
871                         default:
872                                 break;
873                         }
874                 }
875
876                 break;
877
878         case ptev_paging:
879                 /* We bind at most one paging event to an instruction. */
880                 if (decoder->bound_paging)
881                         return 0;
882
883                 if (!pt_insn_binds_to_pip(insn, iext))
884                         return 0;
885
886                 /* We bound a paging event.  Make sure we do not bind further
887                  * paging events to this instruction.
888                  */
889                 decoder->bound_paging = 1;
890
891                 return pt_insn_postpone(decoder, insn, iext);
892
893         case ptev_vmcs:
894                 /* We bind at most one vmcs event to an instruction. */
895                 if (decoder->bound_vmcs)
896                         return 0;
897
898                 if (!pt_insn_binds_to_vmcs(insn, iext))
899                         return 0;
900
901                 /* We bound a vmcs event.  Make sure we do not bind further vmcs
902                  * events to this instruction.
903                  */
904                 decoder->bound_vmcs = 1;
905
906                 return pt_insn_postpone(decoder, insn, iext);
907
908         case ptev_ptwrite:
909                 /* We bind at most one ptwrite event to an instruction. */
910                 if (decoder->bound_ptwrite)
911                         return 0;
912
913                 if (ev->ip_suppressed) {
914                         if (!pt_insn_is_ptwrite(insn, iext))
915                                 return 0;
916
917                         /* Fill in the event IP.  Our users will need them to
918                          * make sense of the PTWRITE payload.
919                          */
920                         ev->variant.ptwrite.ip = decoder->ip;
921                         ev->ip_suppressed = 0;
922                 } else {
923                         /* The ptwrite event contains the IP of the ptwrite
924                          * instruction (CLIP) unlike most events that contain
925                          * the IP of the first instruction that did not complete
926                          * (NLIP).
927                          *
928                          * It's easier to handle this case here, as well.
929                          */
930                         if (decoder->ip != ev->variant.ptwrite.ip)
931                                 return 0;
932                 }
933
934                 /* We bound a ptwrite event.  Make sure we do not bind further
935                  * ptwrite events to this instruction.
936                  */
937                 decoder->bound_ptwrite = 1;
938
939                 return pt_insn_postpone(decoder, insn, iext);
940         }
941
942         return pt_insn_status(decoder, pts_event_pending);
943 }
944
945 enum {
946         /* The maximum number of steps to take when determining whether the
947          * event location can be reached.
948          */
949         bdm64_max_steps = 0x100
950 };
951
952 /* Try to work around erratum BDM64.
953  *
954  * If we got a transaction abort immediately following a branch that produced
955  * trace, the trace for that branch might have been corrupted.
956  *
957  * Returns a positive integer if the erratum was handled.
958  * Returns zero if the erratum does not seem to apply.
959  * Returns a negative error code otherwise.
960  */
961 static int handle_erratum_bdm64(struct pt_insn_decoder *decoder,
962                                 const struct pt_event *ev,
963                                 const struct pt_insn *insn,
964                                 const struct pt_insn_ext *iext)
965 {
966         int status;
967
968         if (!decoder || !ev || !insn || !iext)
969                 return -pte_internal;
970
971         /* This only affects aborts. */
972         if (!ev->variant.tsx.aborted)
973                 return 0;
974
975         /* This only affects branches. */
976         if (!pt_insn_is_branch(insn, iext))
977                 return 0;
978
979         /* Let's check if we can reach the event location from here.
980          *
981          * If we can, let's assume the erratum did not hit.  We might still be
982          * wrong but we're not able to tell.
983          */
984         status = pt_insn_range_is_contiguous(decoder->ip, ev->variant.tsx.ip,
985                                              decoder->mode, decoder->image,
986                                              &decoder->asid, bdm64_max_steps);
987         if (status > 0)
988                 return 0;
989
990         /* We can't reach the event location.  This could either mean that we
991          * stopped too early (and status is zero) or that the erratum hit.
992          *
993          * We assume the latter and pretend that the previous branch brought us
994          * to the event location, instead.
995          */
996         decoder->ip = ev->variant.tsx.ip;
997
998         return 1;
999 }
1000
1001 /* Check whether a peek TSX event should be postponed.
1002  *
1003  * This involves handling erratum BDM64.
1004  *
1005  * Returns a positive integer if the event is to be postponed.
1006  * Returns zero if the event should be processed.
1007  * Returns a negative error code otherwise.
1008  */
1009 static inline int pt_insn_postpone_tsx(struct pt_insn_decoder *decoder,
1010                                        const struct pt_insn *insn,
1011                                        const struct pt_insn_ext *iext,
1012                                        const struct pt_event *ev)
1013 {
1014         int status;
1015
1016         if (!decoder || !ev)
1017                 return -pte_internal;
1018
1019         if (ev->ip_suppressed)
1020                 return 0;
1021
1022         if (insn && iext && decoder->query.config.errata.bdm64) {
1023                 status = handle_erratum_bdm64(decoder, ev, insn, iext);
1024                 if (status < 0)
1025                         return status;
1026         }
1027
1028         if (decoder->ip != ev->variant.tsx.ip)
1029                 return 1;
1030
1031         return 0;
1032 }
1033
1034 /* Check for events that bind to an IP.
1035  *
1036  * Check whether an event is pending that binds to @decoder->ip, and, if that is
1037  * the case, indicate the event by setting pt_pts_event_pending.
1038  *
1039  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
1040  * code otherwise.
1041  */
1042 static int pt_insn_check_ip_event(struct pt_insn_decoder *decoder,
1043                                   const struct pt_insn *insn,
1044                                   const struct pt_insn_ext *iext)
1045 {
1046         struct pt_event *ev;
1047         int status;
1048
1049         if (!decoder)
1050                 return -pte_internal;
1051
1052         status = event_pending(decoder);
1053         if (status <= 0) {
1054                 if (status < 0)
1055                         return status;
1056
1057                 return pt_insn_status(decoder, 0);
1058         }
1059
1060         ev = &decoder->event;
1061         switch (ev->type) {
1062         case ptev_disabled:
1063                 break;
1064
1065         case ptev_enabled:
1066                 return pt_insn_status(decoder, pts_event_pending);
1067
1068         case ptev_async_disabled:
1069                 if (ev->variant.async_disabled.at != decoder->ip)
1070                         break;
1071
1072                 if (decoder->query.config.errata.skd022) {
1073                         int errcode;
1074
1075                         errcode = handle_erratum_skd022(decoder);
1076                         if (errcode != 0) {
1077                                 if (errcode < 0)
1078                                         return errcode;
1079
1080                                 /* If the erratum applies, we postpone the
1081                                  * modified event to the next call to
1082                                  * pt_insn_next().
1083                                  */
1084                                 break;
1085                         }
1086                 }
1087
1088                 return pt_insn_status(decoder, pts_event_pending);
1089
1090         case ptev_tsx:
1091                 status = pt_insn_postpone_tsx(decoder, insn, iext, ev);
1092                 if (status != 0) {
1093                         if (status < 0)
1094                                 return status;
1095
1096                         break;
1097                 }
1098
1099                 return pt_insn_status(decoder, pts_event_pending);
1100
1101         case ptev_async_branch:
1102                 if (ev->variant.async_branch.from != decoder->ip)
1103                         break;
1104
1105                 return pt_insn_status(decoder, pts_event_pending);
1106
1107         case ptev_overflow:
1108                 return pt_insn_status(decoder, pts_event_pending);
1109
1110         case ptev_exec_mode:
1111                 if (!ev->ip_suppressed &&
1112                     ev->variant.exec_mode.ip != decoder->ip)
1113                         break;
1114
1115                 return pt_insn_status(decoder, pts_event_pending);
1116
1117         case ptev_paging:
1118                 if (decoder->enabled)
1119                         break;
1120
1121                 return pt_insn_status(decoder, pts_event_pending);
1122
1123         case ptev_async_paging:
1124                 if (!ev->ip_suppressed &&
1125                     ev->variant.async_paging.ip != decoder->ip)
1126                         break;
1127
1128                 return pt_insn_status(decoder, pts_event_pending);
1129
1130         case ptev_vmcs:
1131                 if (decoder->enabled)
1132                         break;
1133
1134                 return pt_insn_status(decoder, pts_event_pending);
1135
1136         case ptev_async_vmcs:
1137                 if (!ev->ip_suppressed &&
1138                     ev->variant.async_vmcs.ip != decoder->ip)
1139                         break;
1140
1141                 return pt_insn_status(decoder, pts_event_pending);
1142
1143         case ptev_stop:
1144                 return pt_insn_status(decoder, pts_event_pending);
1145
1146         case ptev_exstop:
1147                 if (!ev->ip_suppressed && decoder->enabled &&
1148                     decoder->ip != ev->variant.exstop.ip)
1149                         break;
1150
1151                 return pt_insn_status(decoder, pts_event_pending);
1152
1153         case ptev_mwait:
1154                 if (!ev->ip_suppressed && decoder->enabled &&
1155                     decoder->ip != ev->variant.mwait.ip)
1156                         break;
1157
1158                 return pt_insn_status(decoder, pts_event_pending);
1159
1160         case ptev_pwre:
1161         case ptev_pwrx:
1162                 return pt_insn_status(decoder, pts_event_pending);
1163
1164         case ptev_ptwrite:
1165                 /* Any event binding to the current PTWRITE instruction is
1166                  * handled in pt_insn_check_insn_event().
1167                  *
1168                  * Any subsequent ptwrite event binds to a different instruction
1169                  * and must wait until the next iteration - as long as tracing
1170                  * is enabled.
1171                  *
1172                  * When tracing is disabled, we forward all ptwrite events
1173                  * immediately to the user.
1174                  */
1175                 if (decoder->enabled)
1176                         break;
1177
1178                 return pt_insn_status(decoder, pts_event_pending);
1179
1180         case ptev_tick:
1181         case ptev_cbr:
1182         case ptev_mnt:
1183                 return pt_insn_status(decoder, pts_event_pending);
1184         }
1185
1186         return pt_insn_status(decoder, 0);
1187 }
1188
1189 static inline int insn_to_user(struct pt_insn *uinsn, size_t size,
1190                                const struct pt_insn *insn)
1191 {
1192         if (!uinsn || !insn)
1193                 return -pte_internal;
1194
1195         if (uinsn == insn)
1196                 return 0;
1197
1198         /* Zero out any unknown bytes. */
1199         if (sizeof(*insn) < size) {
1200                 memset(uinsn + sizeof(*insn), 0, size - sizeof(*insn));
1201
1202                 size = sizeof(*insn);
1203         }
1204
1205         memcpy(uinsn, insn, size);
1206
1207         return 0;
1208 }
1209
1210 static int pt_insn_decode_cached(struct pt_insn_decoder *decoder,
1211                                  const struct pt_mapped_section *msec,
1212                                  struct pt_insn *insn, struct pt_insn_ext *iext)
1213 {
1214         int status;
1215
1216         if (!decoder || !insn || !iext)
1217                 return -pte_internal;
1218
1219         /* Try reading the memory containing @insn from the cached section.  If
1220          * that fails, if we don't have a cached section, or if decode fails
1221          * later on, fall back to decoding @insn from @decoder->image.
1222          *
1223          * The latter will also handle truncated instructions that cross section
1224          * boundaries.
1225          */
1226
1227         if (!msec)
1228                 return pt_insn_decode(insn, iext, decoder->image,
1229                                       &decoder->asid);
1230
1231         status = pt_msec_read(msec, insn->raw, sizeof(insn->raw), insn->ip);
1232         if (status < 0) {
1233                 if (status != -pte_nomap)
1234                         return status;
1235
1236                 return pt_insn_decode(insn, iext, decoder->image,
1237                                       &decoder->asid);
1238         }
1239
1240         /* We initialize @insn->size to the maximal possible size.  It will be
1241          * set to the actual size during instruction decode.
1242          */
1243         insn->size = (uint8_t) status;
1244
1245         status = pt_ild_decode(insn, iext);
1246         if (status < 0) {
1247                 if (status != -pte_bad_insn)
1248                         return status;
1249
1250                 return pt_insn_decode(insn, iext, decoder->image,
1251                                       &decoder->asid);
1252         }
1253
1254         return status;
1255 }
1256
1257 static int pt_insn_msec_lookup(struct pt_insn_decoder *decoder,
1258                                const struct pt_mapped_section **pmsec)
1259 {
1260         struct pt_msec_cache *scache;
1261         struct pt_image *image;
1262         uint64_t ip;
1263         int isid;
1264
1265         if (!decoder || !pmsec)
1266                 return -pte_internal;
1267
1268         scache = &decoder->scache;
1269         image = decoder->image;
1270         ip = decoder->ip;
1271
1272         isid = pt_msec_cache_read(scache, pmsec, image, ip);
1273         if (isid < 0) {
1274                 if (isid != -pte_nomap)
1275                         return isid;
1276
1277                 return pt_msec_cache_fill(scache, pmsec, image,
1278                                           &decoder->asid, ip);
1279         }
1280
1281         return isid;
1282 }
1283
1284 int pt_insn_next(struct pt_insn_decoder *decoder, struct pt_insn *uinsn,
1285                  size_t size)
1286 {
1287         const struct pt_mapped_section *msec;
1288         struct pt_insn_ext iext;
1289         struct pt_insn insn, *pinsn;
1290         int status, isid;
1291
1292         if (!uinsn || !decoder)
1293                 return -pte_invalid;
1294
1295         /* Tracing must be enabled.
1296          *
1297          * If it isn't we should be processing events until we either run out of
1298          * trace or process a tracing enabled event.
1299          */
1300         if (!decoder->enabled) {
1301                 if (decoder->status & pts_eos)
1302                         return -pte_eos;
1303
1304                 return -pte_no_enable;
1305         }
1306
1307         pinsn = size == sizeof(insn) ? uinsn : &insn;
1308
1309         /* Zero-initialize the instruction in case of error returns. */
1310         memset(pinsn, 0, sizeof(*pinsn));
1311
1312         /* Fill in a few things from the current decode state.
1313          *
1314          * This reflects the state of the last pt_insn_next(), pt_insn_event()
1315          * or pt_insn_start() call.
1316          */
1317         if (decoder->speculative)
1318                 pinsn->speculative = 1;
1319         pinsn->ip = decoder->ip;
1320         pinsn->mode = decoder->mode;
1321
1322         isid = pt_insn_msec_lookup(decoder, &msec);
1323         if (isid < 0) {
1324                 if (isid != -pte_nomap)
1325                         return isid;
1326
1327                 msec = NULL;
1328         }
1329
1330         /* We set an incorrect isid if @msec is NULL.  This will be corrected
1331          * when we read the memory from the image later on.
1332          */
1333         pinsn->isid = isid;
1334
1335         status = pt_insn_decode_cached(decoder, msec, pinsn, &iext);
1336         if (status < 0) {
1337                 /* Provide the incomplete instruction - the IP and mode fields
1338                  * are valid and may help diagnose the error.
1339                  */
1340                 (void) insn_to_user(uinsn, size, pinsn);
1341                 return status;
1342         }
1343
1344         /* Provide the decoded instruction to the user.  It won't change during
1345          * event processing.
1346          */
1347         status = insn_to_user(uinsn, size, pinsn);
1348         if (status < 0)
1349                 return status;
1350
1351         /* Check for events that bind to the current instruction.
1352          *
1353          * If an event is indicated, we're done.
1354          */
1355         status = pt_insn_check_insn_event(decoder, pinsn, &iext);
1356         if (status != 0) {
1357                 if (status < 0)
1358                         return status;
1359
1360                 if (status & pts_event_pending)
1361                         return status;
1362         }
1363
1364         /* Determine the next instruction's IP. */
1365         status = pt_insn_proceed(decoder, pinsn, &iext);
1366         if (status < 0)
1367                 return status;
1368
1369         /* Indicate events that bind to the new IP.
1370          *
1371          * Although we only look at the IP for binding events, we pass the
1372          * decoded instruction in order to handle errata.
1373          */
1374         return pt_insn_check_ip_event(decoder, pinsn, &iext);
1375 }
1376
1377 static int pt_insn_process_enabled(struct pt_insn_decoder *decoder)
1378 {
1379         struct pt_event *ev;
1380
1381         if (!decoder)
1382                 return -pte_internal;
1383
1384         ev = &decoder->event;
1385
1386         /* This event can't be a status update. */
1387         if (ev->status_update)
1388                 return -pte_bad_context;
1389
1390         /* We must have an IP in order to start decoding. */
1391         if (ev->ip_suppressed)
1392                 return -pte_noip;
1393
1394         /* We must currently be disabled. */
1395         if (decoder->enabled)
1396                 return -pte_bad_context;
1397
1398         decoder->ip = ev->variant.enabled.ip;
1399         decoder->enabled = 1;
1400
1401         return 0;
1402 }
1403
1404 static int pt_insn_process_disabled(struct pt_insn_decoder *decoder)
1405 {
1406         struct pt_event *ev;
1407
1408         if (!decoder)
1409                 return -pte_internal;
1410
1411         ev = &decoder->event;
1412
1413         /* This event can't be a status update. */
1414         if (ev->status_update)
1415                 return -pte_bad_context;
1416
1417         /* We must currently be enabled. */
1418         if (!decoder->enabled)
1419                 return -pte_bad_context;
1420
1421         /* We preserve @decoder->ip.  This is where we expect tracing to resume
1422          * and we'll indicate that on the subsequent enabled event if tracing
1423          * actually does resume from there.
1424          */
1425         decoder->enabled = 0;
1426
1427         return 0;
1428 }
1429
1430 static int pt_insn_process_async_branch(struct pt_insn_decoder *decoder)
1431 {
1432         struct pt_event *ev;
1433
1434         if (!decoder)
1435                 return -pte_internal;
1436
1437         ev = &decoder->event;
1438
1439         /* This event can't be a status update. */
1440         if (ev->status_update)
1441                 return -pte_bad_context;
1442
1443         /* Tracing must be enabled in order to make sense of the event. */
1444         if (!decoder->enabled)
1445                 return -pte_bad_context;
1446
1447         decoder->ip = ev->variant.async_branch.to;
1448
1449         return 0;
1450 }
1451
1452 static int pt_insn_process_paging(struct pt_insn_decoder *decoder)
1453 {
1454         uint64_t cr3;
1455         int errcode;
1456
1457         if (!decoder)
1458                 return -pte_internal;
1459
1460         cr3 = decoder->event.variant.paging.cr3;
1461         if (decoder->asid.cr3 != cr3) {
1462                 errcode = pt_msec_cache_invalidate(&decoder->scache);
1463                 if (errcode < 0)
1464                         return errcode;
1465
1466                 decoder->asid.cr3 = cr3;
1467         }
1468
1469         return 0;
1470 }
1471
1472 static int pt_insn_process_overflow(struct pt_insn_decoder *decoder)
1473 {
1474         struct pt_event *ev;
1475
1476         if (!decoder)
1477                 return -pte_internal;
1478
1479         ev = &decoder->event;
1480
1481         /* This event can't be a status update. */
1482         if (ev->status_update)
1483                 return -pte_bad_context;
1484
1485         /* If the IP is suppressed, the overflow resolved while tracing was
1486          * disabled.  Otherwise it resolved while tracing was enabled.
1487          */
1488         if (ev->ip_suppressed) {
1489                 /* Tracing is disabled.
1490                  *
1491                  * It doesn't make sense to preserve the previous IP.  This will
1492                  * just be misleading.  Even if tracing had been disabled
1493                  * before, as well, we might have missed the re-enable in the
1494                  * overflow.
1495                  */
1496                 decoder->enabled = 0;
1497                 decoder->ip = 0ull;
1498         } else {
1499                 /* Tracing is enabled and we're at the IP at which the overflow
1500                  * resolved.
1501                  */
1502                 decoder->ip = ev->variant.overflow.ip;
1503                 decoder->enabled = 1;
1504         }
1505
1506         /* We don't know the TSX state.  Let's assume we execute normally.
1507          *
1508          * We also don't know the execution mode.  Let's keep what we have
1509          * in case we don't get an update before we have to decode the next
1510          * instruction.
1511          */
1512         decoder->speculative = 0;
1513
1514         return 0;
1515 }
1516
1517 static int pt_insn_process_exec_mode(struct pt_insn_decoder *decoder)
1518 {
1519         enum pt_exec_mode mode;
1520         struct pt_event *ev;
1521
1522         if (!decoder)
1523                 return -pte_internal;
1524
1525         ev = &decoder->event;
1526         mode = ev->variant.exec_mode.mode;
1527
1528         /* Use status update events to diagnose inconsistencies. */
1529         if (ev->status_update && decoder->enabled &&
1530             decoder->mode != ptem_unknown && decoder->mode != mode)
1531                 return -pte_bad_status_update;
1532
1533         decoder->mode = mode;
1534
1535         return 0;
1536 }
1537
1538 static int pt_insn_process_tsx(struct pt_insn_decoder *decoder)
1539 {
1540         if (!decoder)
1541                 return -pte_internal;
1542
1543         decoder->speculative = decoder->event.variant.tsx.speculative;
1544
1545         return 0;
1546 }
1547
1548 static int pt_insn_process_stop(struct pt_insn_decoder *decoder)
1549 {
1550         struct pt_event *ev;
1551
1552         if (!decoder)
1553                 return -pte_internal;
1554
1555         ev = &decoder->event;
1556
1557         /* This event can't be a status update. */
1558         if (ev->status_update)
1559                 return -pte_bad_context;
1560
1561         /* Tracing is always disabled before it is stopped. */
1562         if (decoder->enabled)
1563                 return -pte_bad_context;
1564
1565         return 0;
1566 }
1567
1568 static int pt_insn_process_vmcs(struct pt_insn_decoder *decoder)
1569 {
1570         uint64_t vmcs;
1571         int errcode;
1572
1573         if (!decoder)
1574                 return -pte_internal;
1575
1576         vmcs = decoder->event.variant.vmcs.base;
1577         if (decoder->asid.vmcs != vmcs) {
1578                 errcode = pt_msec_cache_invalidate(&decoder->scache);
1579                 if (errcode < 0)
1580                         return errcode;
1581
1582                 decoder->asid.vmcs = vmcs;
1583         }
1584
1585         return 0;
1586 }
1587
1588 int pt_insn_event(struct pt_insn_decoder *decoder, struct pt_event *uevent,
1589                   size_t size)
1590 {
1591         struct pt_event *ev;
1592         int status;
1593
1594         if (!decoder || !uevent)
1595                 return -pte_invalid;
1596
1597         /* We must currently process an event. */
1598         if (!decoder->process_event)
1599                 return -pte_bad_query;
1600
1601         ev = &decoder->event;
1602         switch (ev->type) {
1603         default:
1604                 /* This is not a user event.
1605                  *
1606                  * We either indicated it wrongly or the user called
1607                  * pt_insn_event() without a pts_event_pending indication.
1608                  */
1609                 return -pte_bad_query;
1610
1611         case ptev_enabled:
1612                 /* Indicate that tracing resumes from the IP at which tracing
1613                  * had been disabled before (with some special treatment for
1614                  * calls).
1615                  */
1616                 if (decoder->ip == ev->variant.enabled.ip)
1617                         ev->variant.enabled.resumed = 1;
1618
1619                 status = pt_insn_process_enabled(decoder);
1620                 if (status < 0)
1621                         return status;
1622
1623                 break;
1624
1625         case ptev_async_disabled:
1626                 if (!ev->ip_suppressed &&
1627                     decoder->ip != ev->variant.async_disabled.at)
1628                         return -pte_bad_query;
1629
1630                 fallthrough;
1631         case ptev_disabled:
1632                 status = pt_insn_process_disabled(decoder);
1633                 if (status < 0)
1634                         return status;
1635
1636                 break;
1637
1638         case ptev_async_branch:
1639                 if (decoder->ip != ev->variant.async_branch.from)
1640                         return -pte_bad_query;
1641
1642                 status = pt_insn_process_async_branch(decoder);
1643                 if (status < 0)
1644                         return status;
1645
1646                 break;
1647
1648         case ptev_async_paging:
1649                 if (!ev->ip_suppressed &&
1650                     decoder->ip != ev->variant.async_paging.ip)
1651                         return -pte_bad_query;
1652
1653                 fallthrough;
1654         case ptev_paging:
1655                 status = pt_insn_process_paging(decoder);
1656                 if (status < 0)
1657                         return status;
1658
1659                 break;
1660
1661         case ptev_async_vmcs:
1662                 if (!ev->ip_suppressed &&
1663                     decoder->ip != ev->variant.async_vmcs.ip)
1664                         return -pte_bad_query;
1665
1666                 fallthrough;
1667         case ptev_vmcs:
1668                 status = pt_insn_process_vmcs(decoder);
1669                 if (status < 0)
1670                         return status;
1671
1672                 break;
1673
1674         case ptev_overflow:
1675                 status = pt_insn_process_overflow(decoder);
1676                 if (status < 0)
1677                         return status;
1678
1679                 break;
1680
1681         case ptev_exec_mode:
1682                 status = pt_insn_process_exec_mode(decoder);
1683                 if (status < 0)
1684                         return status;
1685
1686                 break;
1687
1688         case ptev_tsx:
1689                 status = pt_insn_process_tsx(decoder);
1690                 if (status < 0)
1691                         return status;
1692
1693                 break;
1694
1695         case ptev_stop:
1696                 status = pt_insn_process_stop(decoder);
1697                 if (status < 0)
1698                         return status;
1699
1700                 break;
1701
1702         case ptev_exstop:
1703                 if (!ev->ip_suppressed && decoder->enabled &&
1704                     decoder->ip != ev->variant.exstop.ip)
1705                         return -pte_bad_query;
1706
1707                 break;
1708
1709         case ptev_mwait:
1710                 if (!ev->ip_suppressed && decoder->enabled &&
1711                     decoder->ip != ev->variant.mwait.ip)
1712                         return -pte_bad_query;
1713
1714                 break;
1715
1716         case ptev_pwre:
1717         case ptev_pwrx:
1718         case ptev_ptwrite:
1719         case ptev_tick:
1720         case ptev_cbr:
1721         case ptev_mnt:
1722                 break;
1723         }
1724
1725         /* Copy the event to the user.  Make sure we're not writing beyond the
1726          * memory provided by the user.
1727          *
1728          * We might truncate details of an event but only for those events the
1729          * user can't know about, anyway.
1730          */
1731         if (sizeof(*ev) < size)
1732                 size = sizeof(*ev);
1733
1734         memcpy(uevent, ev, size);
1735
1736         /* This completes processing of the current event. */
1737         decoder->process_event = 0;
1738
1739         /* If we just handled an instruction event, check for further events
1740          * that bind to this instruction.
1741          *
1742          * If we don't have further events, proceed beyond the instruction so we
1743          * can check for IP events, as well.
1744          */
1745         if (decoder->process_insn) {
1746                 status = pt_insn_check_insn_event(decoder, &decoder->insn,
1747                                                   &decoder->iext);
1748
1749                 if (status != 0) {
1750                         if (status < 0)
1751                                 return status;
1752
1753                         if (status & pts_event_pending)
1754                                 return status;
1755                 }
1756
1757                 /* Proceed to the next instruction. */
1758                 status = pt_insn_proceed_postponed(decoder);
1759                 if (status < 0)
1760                         return status;
1761         }
1762
1763         /* Indicate further events that bind to the same IP. */
1764         return pt_insn_check_ip_event(decoder, NULL, NULL);
1765 }