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