xref: /freebsd/contrib/processor-trace/libipt/src/pt_insn_decoder.c (revision b9f654b163bce26de79705e77b872427c9f2afa1)
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 }
1766