xref: /freebsd/contrib/processor-trace/libipt/include/intel-pt.h (revision e6bfd18d21b225af6a0ed67ceeaf1293b7b9eba5)
1 /*
2  * Copyright (c) 2013-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 #ifndef INTEL_PT_H
30 #define INTEL_PT_H
31 
32 #include <stdint.h>
33 #include <string.h>
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 
40 /* Intel(R) Processor Trace (Intel PT) decoder library.
41  *
42  * This file is logically structured into the following sections:
43  *
44  * - Version
45  * - Errors
46  * - Configuration
47  * - Packet encoder / decoder
48  * - Query decoder
49  * - Traced image
50  * - Instruction flow decoder
51  * - Block decoder
52  */
53 
54 
55 
56 struct pt_encoder;
57 struct pt_packet_decoder;
58 struct pt_query_decoder;
59 struct pt_insn_decoder;
60 struct pt_block_decoder;
61 
62 
63 
64 /* A macro to mark functions as exported. */
65 #ifndef pt_export
66 #  if defined(__GNUC__)
67 #    define pt_export __attribute__((visibility("default")))
68 #  elif defined(_MSC_VER)
69 #    define pt_export __declspec(dllimport)
70 #  else
71 #    error "unknown compiler"
72 #  endif
73 #endif
74 
75 
76 
77 /* Version. */
78 
79 
80 /** The header version. */
81 #define LIBIPT_VERSION_MAJOR ${PT_VERSION_MAJOR}
82 #define LIBIPT_VERSION_MINOR ${PT_VERSION_MINOR}
83 #define LIBIPT_VERSION_PATCH ${PT_VERSION_PATCH}
84 
85 #define LIBIPT_VERSION ((LIBIPT_VERSION_MAJOR << 8) + LIBIPT_VERSION_MINOR)
86 
87 
88 /** The library version. */
89 struct pt_version {
90 	/** Major version number. */
91 	uint8_t major;
92 
93 	/** Minor version number. */
94 	uint8_t minor;
95 
96 	/** Patch level. */
97 	uint16_t patch;
98 
99 	/** Build number. */
100 	uint32_t build;
101 
102 	/** Version extension. */
103 	const char *ext;
104 };
105 
106 
107 /** Return the library version. */
108 extern pt_export struct pt_version pt_library_version(void);
109 
110 
111 
112 /* Errors. */
113 
114 
115 
116 /** Error codes. */
117 enum pt_error_code {
118 	/* No error. Everything is OK. */
119 	pte_ok,
120 
121 	/* Internal decoder error. */
122 	pte_internal,
123 
124 	/* Invalid argument. */
125 	pte_invalid,
126 
127 	/* Decoder out of sync. */
128 	pte_nosync,
129 
130 	/* Unknown opcode. */
131 	pte_bad_opc,
132 
133 	/* Unknown payload. */
134 	pte_bad_packet,
135 
136 	/* Unexpected packet context. */
137 	pte_bad_context,
138 
139 	/* Decoder reached end of trace stream. */
140 	pte_eos,
141 
142 	/* No packet matching the query to be found. */
143 	pte_bad_query,
144 
145 	/* Decoder out of memory. */
146 	pte_nomem,
147 
148 	/* Bad configuration. */
149 	pte_bad_config,
150 
151 	/* There is no IP. */
152 	pte_noip,
153 
154 	/* The IP has been suppressed. */
155 	pte_ip_suppressed,
156 
157 	/* There is no memory mapped at the requested address. */
158 	pte_nomap,
159 
160 	/* An instruction could not be decoded. */
161 	pte_bad_insn,
162 
163 	/* No wall-clock time is available. */
164 	pte_no_time,
165 
166 	/* No core:bus ratio available. */
167 	pte_no_cbr,
168 
169 	/* Bad traced image. */
170 	pte_bad_image,
171 
172 	/* A locking error. */
173 	pte_bad_lock,
174 
175 	/* The requested feature is not supported. */
176 	pte_not_supported,
177 
178 	/* The return address stack is empty. */
179 	pte_retstack_empty,
180 
181 	/* A compressed return is not indicated correctly by a taken branch. */
182 	pte_bad_retcomp,
183 
184 	/* The current decoder state does not match the state in the trace. */
185 	pte_bad_status_update,
186 
187 	/* The trace did not contain an expected enabled event. */
188 	pte_no_enable,
189 
190 	/* An event was ignored. */
191 	pte_event_ignored,
192 
193 	/* Something overflowed. */
194 	pte_overflow,
195 
196 	/* A file handling error. */
197 	pte_bad_file,
198 
199 	/* Unknown cpu. */
200 	pte_bad_cpu
201 };
202 
203 
204 /** Decode a function return value into an pt_error_code. */
205 static inline enum pt_error_code pt_errcode(int status)
206 {
207 	return (status >= 0) ? pte_ok : (enum pt_error_code) -status;
208 }
209 
210 /** Return a human readable error string. */
211 extern pt_export const char *pt_errstr(enum pt_error_code);
212 
213 
214 
215 /* Configuration. */
216 
217 
218 
219 /** A cpu vendor. */
220 enum pt_cpu_vendor {
221 	pcv_unknown,
222 	pcv_intel
223 };
224 
225 /** A cpu identifier. */
226 struct pt_cpu {
227 	/** The cpu vendor. */
228 	enum pt_cpu_vendor vendor;
229 
230 	/** The cpu family. */
231 	uint16_t family;
232 
233 	/** The cpu model. */
234 	uint8_t model;
235 
236 	/** The stepping. */
237 	uint8_t stepping;
238 };
239 
240 /** A collection of Intel PT errata. */
241 struct pt_errata {
242 	/** BDM70: Intel(R) Processor Trace PSB+ Packets May Contain
243 	 *         Unexpected Packets.
244 	 *
245 	 * Same as: SKD024, SKL021, KBL021.
246 	 *
247 	 * Some Intel Processor Trace packets should be issued only between
248 	 * TIP.PGE and TIP.PGD packets.  Due to this erratum, when a TIP.PGE
249 	 * packet is generated it may be preceded by a PSB+ that incorrectly
250 	 * includes FUP and MODE.Exec packets.
251 	 */
252 	uint32_t bdm70:1;
253 
254 	/** BDM64: An Incorrect LBR or Intel(R) Processor Trace Packet May Be
255 	 *         Recorded Following a Transactional Abort.
256 	 *
257 	 * Use of Intel(R) Transactional Synchronization Extensions (Intel(R)
258 	 * TSX) may result in a transactional abort.  If an abort occurs
259 	 * immediately following a branch instruction, an incorrect branch
260 	 * target may be logged in an LBR (Last Branch Record) or in an Intel(R)
261 	 * Processor Trace (Intel(R) PT) packet before the LBR or Intel PT
262 	 * packet produced by the abort.
263 	 */
264 	uint32_t bdm64:1;
265 
266 	/** SKD007: Intel(R) PT Buffer Overflow May Result in Incorrect Packets.
267 	 *
268 	 * Same as: SKL049, KBL041.
269 	 *
270 	 * Under complex micro-architectural conditions, an Intel PT (Processor
271 	 * Trace) OVF (Overflow) packet may be issued after the first byte of a
272 	 * multi-byte CYC (Cycle Count) packet, instead of any remaining bytes
273 	 * of the CYC.
274 	 */
275 	uint32_t skd007:1;
276 
277 	/** SKD022: VM Entry That Clears TraceEn May Generate a FUP.
278 	 *
279 	 * Same as: SKL024, KBL023.
280 	 *
281 	 * If VM entry clears Intel(R) PT (Intel Processor Trace)
282 	 * IA32_RTIT_CTL.TraceEn (MSR 570H, bit 0) while PacketEn is 1 then a
283 	 * FUP (Flow Update Packet) will precede the TIP.PGD (Target IP Packet,
284 	 * Packet Generation Disable).  VM entry can clear TraceEn if the
285 	 * VM-entry MSR-load area includes an entry for the IA32_RTIT_CTL MSR.
286 	 */
287 	uint32_t skd022:1;
288 
289 	/** SKD010: Intel(R) PT FUP May be Dropped After OVF.
290 	 *
291 	 * Same as: SKD014, SKL033, KBL030.
292 	 *
293 	 * Some Intel PT (Intel Processor Trace) OVF (Overflow) packets may not
294 	 * be followed by a FUP (Flow Update Packet) or TIP.PGE (Target IP
295 	 * Packet, Packet Generation Enable).
296 	 */
297 	uint32_t skd010:1;
298 
299 	/** SKL014: Intel(R) PT TIP.PGD May Not Have Target IP Payload.
300 	 *
301 	 * Same as: KBL014.
302 	 *
303 	 * When Intel PT (Intel Processor Trace) is enabled and a direct
304 	 * unconditional branch clears IA32_RTIT_STATUS.FilterEn (MSR 571H, bit
305 	 * 0), due to this erratum, the resulting TIP.PGD (Target IP Packet,
306 	 * Packet Generation Disable) may not have an IP payload with the target
307 	 * IP.
308 	 */
309 	uint32_t skl014:1;
310 
311 	/** APL12: Intel(R) PT OVF May Be Followed By An Unexpected FUP Packet.
312 	 *
313 	 * Certain Intel PT (Processor Trace) packets including FUPs (Flow
314 	 * Update Packets), should be issued only between TIP.PGE (Target IP
315 	 * Packet - Packet Generaton Enable) and TIP.PGD (Target IP Packet -
316 	 * Packet Generation Disable) packets.  When outside a TIP.PGE/TIP.PGD
317 	 * pair, as a result of IA32_RTIT_STATUS.FilterEn[0] (MSR 571H) being
318 	 * cleared, an OVF (Overflow) packet may be unexpectedly followed by a
319 	 * FUP.
320 	 */
321 	uint32_t apl12:1;
322 
323 	/** APL11: Intel(R) PT OVF Pakcet May Be Followed by TIP.PGD Packet
324 	 *
325 	 * If Intel PT (Processor Trace) encounters an internal buffer overflow
326 	 * and generates an OVF (Overflow) packet just as IA32_RTIT_CTL (MSR
327 	 * 570H) bit 0 (TraceEn) is cleared, or during a far transfer that
328 	 * causes IA32_RTIT_STATUS.ContextEn[1] (MSR 571H) to be cleared, the
329 	 * OVF may be followed by a TIP.PGD (Target Instruction Pointer - Packet
330 	 * Generation Disable) packet.
331 	 */
332 	uint32_t apl11:1;
333 
334 	/** SKL168: Intel(R) PT CYC Packets Can be Dropped When Immediately
335 	 *          Preceding PSB
336 	 *
337 	 * Due to a rare microarchitectural condition, generation of an Intel
338 	 * PT (Processor Trace) PSB (Packet Stream Boundary) packet can cause a
339 	 * single CYC (Cycle Count) packet, possibly along with an associated
340 	 * MTC (Mini Time Counter) packet, to be dropped.
341 	 */
342 	uint32_t skl168:1;
343 
344 	/* Reserve a few bytes for the future. */
345 	uint32_t reserved[15];
346 };
347 
348 /** A collection of decoder-specific configuration flags. */
349 struct pt_conf_flags {
350 	/** The decoder variant. */
351 	union {
352 		/** Flags for the block decoder. */
353 		struct {
354 			/** End a block after a call instruction. */
355 			uint32_t end_on_call:1;
356 
357 			/** Enable tick events for timing updates. */
358 			uint32_t enable_tick_events:1;
359 
360 			/** End a block after a jump instruction. */
361 			uint32_t end_on_jump:1;
362 
363 			/** Preserve timing calibration on overflow. */
364 			uint32_t keep_tcal_on_ovf:1;
365 		} block;
366 
367 		/** Flags for the instruction flow decoder. */
368 		struct {
369 			/** Enable tick events for timing updates. */
370 			uint32_t enable_tick_events:1;
371 
372 			/** Preserve timing calibration on overflow. */
373 			uint32_t keep_tcal_on_ovf:1;
374 		} insn;
375 
376 		/** Flags for the query decoder. */
377 		struct {
378 			/** Preserve timing calibration on overflow. */
379 			uint32_t keep_tcal_on_ovf:1;
380 		} query;
381 
382 		/* Reserve a few bytes for future extensions. */
383 		uint32_t reserved[4];
384 	} variant;
385 };
386 
387 /** The address filter configuration. */
388 struct pt_conf_addr_filter {
389 	/** The address filter configuration.
390 	 *
391 	 * This corresponds to the respective fields in IA32_RTIT_CTL MSR.
392 	 */
393 	union {
394 		uint64_t addr_cfg;
395 
396 		struct {
397 			uint32_t addr0_cfg:4;
398 			uint32_t addr1_cfg:4;
399 			uint32_t addr2_cfg:4;
400 			uint32_t addr3_cfg:4;
401 		} ctl;
402 	} config;
403 
404 	/** The address ranges configuration.
405 	 *
406 	 * This corresponds to the IA32_RTIT_ADDRn_A/B MSRs.
407 	 */
408 	uint64_t addr0_a;
409 	uint64_t addr0_b;
410 	uint64_t addr1_a;
411 	uint64_t addr1_b;
412 	uint64_t addr2_a;
413 	uint64_t addr2_b;
414 	uint64_t addr3_a;
415 	uint64_t addr3_b;
416 
417 	/* Reserve some space. */
418 	uint64_t reserved[8];
419 };
420 
421 /** An unknown packet. */
422 struct pt_packet_unknown;
423 
424 /** An Intel PT decoder configuration.
425  */
426 struct pt_config {
427 	/** The size of the config structure in bytes. */
428 	size_t size;
429 
430 	/** The trace buffer begin address. */
431 	uint8_t *begin;
432 
433 	/** The trace buffer end address. */
434 	uint8_t *end;
435 
436 	/** An optional callback for handling unknown packets.
437 	 *
438 	 * If \@callback is not NULL, it is called for any unknown opcode.
439 	 */
440 	struct {
441 		/** The callback function.
442 		 *
443 		 * It shall decode the packet at \@pos into \@unknown.
444 		 * It shall return the number of bytes read upon success.
445 		 * It shall return a negative pt_error_code otherwise.
446 		 * The below context is passed as \@context.
447 		 */
448 		int (*callback)(struct pt_packet_unknown *unknown,
449 				const struct pt_config *config,
450 				const uint8_t *pos, void *context);
451 
452 		/** The user-defined context for this configuration. */
453 		void *context;
454 	} decode;
455 
456 	/** The cpu on which Intel PT has been recorded. */
457 	struct pt_cpu cpu;
458 
459 	/** The errata to apply when encoding or decoding Intel PT. */
460 	struct pt_errata errata;
461 
462 	/* The CTC frequency.
463 	 *
464 	 * This is only required if MTC packets have been enabled in
465 	 * IA32_RTIT_CTRL.MTCEn.
466 	 */
467 	uint32_t cpuid_0x15_eax, cpuid_0x15_ebx;
468 
469 	/* The MTC frequency as defined in IA32_RTIT_CTL.MTCFreq.
470 	 *
471 	 * This is only required if MTC packets have been enabled in
472 	 * IA32_RTIT_CTRL.MTCEn.
473 	 */
474 	uint8_t mtc_freq;
475 
476 	/* The nominal frequency as defined in MSR_PLATFORM_INFO[15:8].
477 	 *
478 	 * This is only required if CYC packets have been enabled in
479 	 * IA32_RTIT_CTRL.CYCEn.
480 	 *
481 	 * If zero, timing calibration will only be able to use MTC and CYC
482 	 * packets.
483 	 *
484 	 * If not zero, timing calibration will also be able to use CBR
485 	 * packets.
486 	 */
487 	uint8_t nom_freq;
488 
489 	/** A collection of decoder-specific flags. */
490 	struct pt_conf_flags flags;
491 
492 	/** The address filter configuration. */
493 	struct pt_conf_addr_filter addr_filter;
494 };
495 
496 
497 /** Zero-initialize an Intel PT configuration. */
498 static inline void pt_config_init(struct pt_config *config)
499 {
500 	memset(config, 0, sizeof(*config));
501 
502 	config->size = sizeof(*config);
503 }
504 
505 /** Determine errata for a given cpu.
506  *
507  * Updates \@errata based on \@cpu.
508  *
509  * Returns 0 on success, a negative error code otherwise.
510  * Returns -pte_invalid if \@errata or \@cpu is NULL.
511  * Returns -pte_bad_cpu if \@cpu is not known.
512  */
513 extern pt_export int pt_cpu_errata(struct pt_errata *errata,
514 				   const struct pt_cpu *cpu);
515 
516 
517 
518 /* Packet encoder / decoder. */
519 
520 
521 
522 /** Intel PT packet types. */
523 enum pt_packet_type {
524 	/* An invalid packet. */
525 	ppt_invalid,
526 
527 	/* A packet decodable by the optional decoder callback. */
528 	ppt_unknown,
529 
530 	/* Actual packets supported by this library. */
531 	ppt_pad,
532 	ppt_psb,
533 	ppt_psbend,
534 	ppt_fup,
535 	ppt_tip,
536 	ppt_tip_pge,
537 	ppt_tip_pgd,
538 	ppt_tnt_8,
539 	ppt_tnt_64,
540 	ppt_mode,
541 	ppt_pip,
542 	ppt_vmcs,
543 	ppt_cbr,
544 	ppt_tsc,
545 	ppt_tma,
546 	ppt_mtc,
547 	ppt_cyc,
548 	ppt_stop,
549 	ppt_ovf,
550 	ppt_mnt,
551 	ppt_exstop,
552 	ppt_mwait,
553 	ppt_pwre,
554 	ppt_pwrx,
555 	ppt_ptw
556 };
557 
558 /** The IP compression. */
559 enum pt_ip_compression {
560 	/* The bits encode the payload size and the encoding scheme.
561 	 *
562 	 * No payload.  The IP has been suppressed.
563 	 */
564 	pt_ipc_suppressed	= 0x0,
565 
566 	/* Payload: 16 bits.  Update last IP. */
567 	pt_ipc_update_16	= 0x01,
568 
569 	/* Payload: 32 bits.  Update last IP. */
570 	pt_ipc_update_32	= 0x02,
571 
572 	/* Payload: 48 bits.  Sign extend to full address. */
573 	pt_ipc_sext_48		= 0x03,
574 
575 	/* Payload: 48 bits.  Update last IP. */
576 	pt_ipc_update_48	= 0x04,
577 
578 	/* Payload: 64 bits.  Full address. */
579 	pt_ipc_full		= 0x06
580 };
581 
582 /** An execution mode. */
583 enum pt_exec_mode {
584 	ptem_unknown,
585 	ptem_16bit,
586 	ptem_32bit,
587 	ptem_64bit
588 };
589 
590 /** Mode packet leaves. */
591 enum pt_mode_leaf {
592 	pt_mol_exec		= 0x00,
593 	pt_mol_tsx		= 0x20
594 };
595 
596 /** A TNT-8 or TNT-64 packet. */
597 struct pt_packet_tnt {
598 	/** TNT payload bit size. */
599 	uint8_t bit_size;
600 
601 	/** TNT payload excluding stop bit. */
602 	uint64_t payload;
603 };
604 
605 /** A packet with IP payload. */
606 struct pt_packet_ip {
607 	/** IP compression. */
608 	enum pt_ip_compression ipc;
609 
610 	/** Zero-extended payload ip. */
611 	uint64_t ip;
612 };
613 
614 /** A mode.exec packet. */
615 struct pt_packet_mode_exec {
616 	/** The mode.exec csl bit. */
617 	uint32_t csl:1;
618 
619 	/** The mode.exec csd bit. */
620 	uint32_t csd:1;
621 };
622 
623 static inline enum pt_exec_mode
624 pt_get_exec_mode(const struct pt_packet_mode_exec *packet)
625 {
626 	if (packet->csl)
627 		return packet->csd ? ptem_unknown : ptem_64bit;
628 	else
629 		return packet->csd ? ptem_32bit : ptem_16bit;
630 }
631 
632 static inline struct pt_packet_mode_exec
633 pt_set_exec_mode(enum pt_exec_mode mode)
634 {
635 	struct pt_packet_mode_exec packet;
636 
637 	switch (mode) {
638 	default:
639 		packet.csl = 1;
640 		packet.csd = 1;
641 		break;
642 
643 	case ptem_64bit:
644 		packet.csl = 1;
645 		packet.csd = 0;
646 		break;
647 
648 	case ptem_32bit:
649 		packet.csl = 0;
650 		packet.csd = 1;
651 		break;
652 
653 	case ptem_16bit:
654 		packet.csl = 0;
655 		packet.csd = 0;
656 		break;
657 	}
658 
659 	return packet;
660 }
661 
662 /** A mode.tsx packet. */
663 struct pt_packet_mode_tsx {
664 	/** The mode.tsx intx bit. */
665 	uint32_t intx:1;
666 
667 	/** The mode.tsx abrt bit. */
668 	uint32_t abrt:1;
669 };
670 
671 /** A mode packet. */
672 struct pt_packet_mode {
673 	/** Mode leaf. */
674 	enum pt_mode_leaf leaf;
675 
676 	/** Mode bits. */
677 	union {
678 		/** Packet: mode.exec. */
679 		struct pt_packet_mode_exec exec;
680 
681 		/** Packet: mode.tsx. */
682 		struct pt_packet_mode_tsx tsx;
683 	} bits;
684 };
685 
686 /** A PIP packet. */
687 struct pt_packet_pip {
688 	/** The CR3 value. */
689 	uint64_t cr3;
690 
691 	/** The non-root bit. */
692 	uint32_t nr:1;
693 };
694 
695 /** A TSC packet. */
696 struct pt_packet_tsc {
697 	/** The TSC value. */
698 	uint64_t tsc;
699 };
700 
701 /** A CBR packet. */
702 struct pt_packet_cbr {
703 	/** The core/bus cycle ratio. */
704 	uint8_t ratio;
705 };
706 
707 /** A TMA packet. */
708 struct pt_packet_tma {
709 	/** The crystal clock tick counter value. */
710 	uint16_t ctc;
711 
712 	/** The fast counter value. */
713 	uint16_t fc;
714 };
715 
716 /** A MTC packet. */
717 struct pt_packet_mtc {
718 	/** The crystal clock tick counter value. */
719 	uint8_t ctc;
720 };
721 
722 /** A CYC packet. */
723 struct pt_packet_cyc {
724 	/** The cycle counter value. */
725 	uint64_t value;
726 };
727 
728 /** A VMCS packet. */
729 struct pt_packet_vmcs {
730        /* The VMCS Base Address (i.e. the shifted payload). */
731 	uint64_t base;
732 };
733 
734 /** A MNT packet. */
735 struct pt_packet_mnt {
736 	/** The raw payload. */
737 	uint64_t payload;
738 };
739 
740 /** A EXSTOP packet. */
741 struct pt_packet_exstop {
742 	/** A flag specifying the binding of the packet:
743 	 *
744 	 *   set:    binds to the next FUP.
745 	 *   clear:  standalone.
746 	 */
747 	uint32_t ip:1;
748 };
749 
750 /** A MWAIT packet. */
751 struct pt_packet_mwait {
752 	/** The MWAIT hints (EAX). */
753 	uint32_t hints;
754 
755 	/** The MWAIT extensions (ECX). */
756 	uint32_t ext;
757 };
758 
759 /** A PWRE packet. */
760 struct pt_packet_pwre {
761 	/** The resolved thread C-state. */
762 	uint8_t state;
763 
764 	/** The resolved thread sub C-state. */
765 	uint8_t sub_state;
766 
767 	/** A flag indicating whether the C-state entry was initiated by h/w. */
768 	uint32_t hw:1;
769 };
770 
771 /** A PWRX packet. */
772 struct pt_packet_pwrx {
773 	/** The core C-state at the time of the wake. */
774 	uint8_t last;
775 
776 	/** The deepest core C-state achieved during sleep. */
777 	uint8_t deepest;
778 
779 	/** The wake reason:
780 	 *
781 	 * - due to external interrupt received.
782 	 */
783 	uint32_t interrupt:1;
784 
785 	/** - due to store to monitored address. */
786 	uint32_t store:1;
787 
788 	/** - due to h/w autonomous condition such as HDC. */
789 	uint32_t autonomous:1;
790 };
791 
792 /** A PTW packet. */
793 struct pt_packet_ptw {
794 	/** The raw payload. */
795 	uint64_t payload;
796 
797 	/** The payload size as encoded in the packet. */
798 	uint8_t plc;
799 
800 	/** A flag saying whether a FUP is following PTW that provides
801 	 * the IP of the corresponding PTWRITE instruction.
802 	 */
803 	uint32_t ip:1;
804 };
805 
806 static inline int pt_ptw_size(uint8_t plc)
807 {
808 	switch (plc) {
809 	case 0:
810 		return 4;
811 
812 	case 1:
813 		return 8;
814 
815 	case 2:
816 	case 3:
817 		return -pte_bad_packet;
818 	}
819 
820 	return -pte_internal;
821 }
822 
823 /** An unknown packet decodable by the optional decoder callback. */
824 struct pt_packet_unknown {
825 	/** Pointer to the raw packet bytes. */
826 	const uint8_t *packet;
827 
828 	/** Optional pointer to a user-defined structure. */
829 	void *priv;
830 };
831 
832 /** An Intel PT packet. */
833 struct pt_packet {
834 	/** The type of the packet.
835 	 *
836 	 * This also determines the \@payload field.
837 	 */
838 	enum pt_packet_type type;
839 
840 	/** The size of the packet including opcode and payload. */
841 	uint8_t size;
842 
843 	/** Packet specific data. */
844 	union {
845 		/** Packets: pad, ovf, psb, psbend, stop - no payload. */
846 
847 		/** Packet: tnt-8, tnt-64. */
848 		struct pt_packet_tnt tnt;
849 
850 		/** Packet: tip, fup, tip.pge, tip.pgd. */
851 		struct pt_packet_ip ip;
852 
853 		/** Packet: mode. */
854 		struct pt_packet_mode mode;
855 
856 		/** Packet: pip. */
857 		struct pt_packet_pip pip;
858 
859 		/** Packet: tsc. */
860 		struct pt_packet_tsc tsc;
861 
862 		/** Packet: cbr. */
863 		struct pt_packet_cbr cbr;
864 
865 		/** Packet: tma. */
866 		struct pt_packet_tma tma;
867 
868 		/** Packet: mtc. */
869 		struct pt_packet_mtc mtc;
870 
871 		/** Packet: cyc. */
872 		struct pt_packet_cyc cyc;
873 
874 		/** Packet: vmcs. */
875 		struct pt_packet_vmcs vmcs;
876 
877 		/** Packet: mnt. */
878 		struct pt_packet_mnt mnt;
879 
880 		/** Packet: exstop. */
881 		struct pt_packet_exstop exstop;
882 
883 		/** Packet: mwait. */
884 		struct pt_packet_mwait mwait;
885 
886 		/** Packet: pwre. */
887 		struct pt_packet_pwre pwre;
888 
889 		/** Packet: pwrx. */
890 		struct pt_packet_pwrx pwrx;
891 
892 		/** Packet: ptw. */
893 		struct pt_packet_ptw ptw;
894 
895 		/** Packet: unknown. */
896 		struct pt_packet_unknown unknown;
897 	} payload;
898 };
899 
900 
901 
902 /* Packet encoder. */
903 
904 
905 
906 /** Allocate an Intel PT packet encoder.
907  *
908  * The encoder will work on the buffer defined in \@config, it shall contain
909  * raw trace data and remain valid for the lifetime of the encoder.
910  *
911  * The encoder starts at the beginning of the trace buffer.
912  */
913 extern pt_export struct pt_encoder *
914 pt_alloc_encoder(const struct pt_config *config);
915 
916 /** Free an Intel PT packet encoder.
917  *
918  * The \@encoder must not be used after a successful return.
919  */
920 extern pt_export void pt_free_encoder(struct pt_encoder *encoder);
921 
922 /** Hard set synchronization point of an Intel PT packet encoder.
923  *
924  * Synchronize \@encoder to \@offset within the trace buffer.
925  *
926  * Returns zero on success, a negative error code otherwise.
927  *
928  * Returns -pte_eos if the given offset is behind the end of the trace buffer.
929  * Returns -pte_invalid if \@encoder is NULL.
930  */
931 extern pt_export int pt_enc_sync_set(struct pt_encoder *encoder,
932 				     uint64_t offset);
933 
934 /** Get the current packet encoder position.
935  *
936  * Fills the current \@encoder position into \@offset.
937  *
938  * This is useful for reporting errors.
939  *
940  * Returns zero on success, a negative error code otherwise.
941  *
942  * Returns -pte_invalid if \@encoder or \@offset is NULL.
943  */
944 extern pt_export int pt_enc_get_offset(const struct pt_encoder *encoder,
945 				       uint64_t *offset);
946 
947 /* Return a pointer to \@encoder's configuration.
948  *
949  * Returns a non-null pointer on success, NULL if \@encoder is NULL.
950  */
951 extern pt_export const struct pt_config *
952 pt_enc_get_config(const struct pt_encoder *encoder);
953 
954 /** Encode an Intel PT packet.
955  *
956  * Writes \@packet at \@encoder's current position in the Intel PT buffer and
957  * advances the \@encoder beyond the written packet.
958  *
959  * The \@packet.size field is ignored.
960  *
961  * In case of errors, the \@encoder is not advanced and nothing is written
962  * into the Intel PT buffer.
963  *
964  * Returns the number of bytes written on success, a negative error code
965  * otherwise.
966  *
967  * Returns -pte_bad_opc if \@packet.type is not known.
968  * Returns -pte_bad_packet if \@packet's payload is invalid.
969  * Returns -pte_eos if \@encoder reached the end of the Intel PT buffer.
970  * Returns -pte_invalid if \@encoder or \@packet is NULL.
971  */
972 extern pt_export int pt_enc_next(struct pt_encoder *encoder,
973 				 const struct pt_packet *packet);
974 
975 
976 
977 /* Packet decoder. */
978 
979 
980 
981 /** Allocate an Intel PT packet decoder.
982  *
983  * The decoder will work on the buffer defined in \@config, it shall contain
984  * raw trace data and remain valid for the lifetime of the decoder.
985  *
986  * The decoder needs to be synchronized before it can be used.
987  */
988 extern pt_export struct pt_packet_decoder *
989 pt_pkt_alloc_decoder(const struct pt_config *config);
990 
991 /** Free an Intel PT packet decoder.
992  *
993  * The \@decoder must not be used after a successful return.
994  */
995 extern pt_export void pt_pkt_free_decoder(struct pt_packet_decoder *decoder);
996 
997 /** Synchronize an Intel PT packet decoder.
998  *
999  * Search for the next synchronization point in forward or backward direction.
1000  *
1001  * If \@decoder has not been synchronized, yet, the search is started at the
1002  * beginning of the trace buffer in case of forward synchronization and at the
1003  * end of the trace buffer in case of backward synchronization.
1004  *
1005  * Returns zero or a positive value on success, a negative error code otherwise.
1006  *
1007  * Returns -pte_eos if no further synchronization point is found.
1008  * Returns -pte_invalid if \@decoder is NULL.
1009  */
1010 extern pt_export int pt_pkt_sync_forward(struct pt_packet_decoder *decoder);
1011 extern pt_export int pt_pkt_sync_backward(struct pt_packet_decoder *decoder);
1012 
1013 /** Hard set synchronization point of an Intel PT decoder.
1014  *
1015  * Synchronize \@decoder to \@offset within the trace buffer.
1016  *
1017  * Returns zero on success, a negative error code otherwise.
1018  *
1019  * Returns -pte_eos if the given offset is behind the end of the trace buffer.
1020  * Returns -pte_invalid if \@decoder is NULL.
1021  */
1022 extern pt_export int pt_pkt_sync_set(struct pt_packet_decoder *decoder,
1023 				     uint64_t offset);
1024 
1025 /** Get the current decoder position.
1026  *
1027  * Fills the current \@decoder position into \@offset.
1028  *
1029  * This is useful for reporting errors.
1030  *
1031  * Returns zero on success, a negative error code otherwise.
1032  *
1033  * Returns -pte_invalid if \@decoder or \@offset is NULL.
1034  * Returns -pte_nosync if \@decoder is out of sync.
1035  */
1036 extern pt_export int pt_pkt_get_offset(const struct pt_packet_decoder *decoder,
1037 				       uint64_t *offset);
1038 
1039 /** Get the position of the last synchronization point.
1040  *
1041  * Fills the last synchronization position into \@offset.
1042  *
1043  * This is useful when splitting a trace stream for parallel decoding.
1044  *
1045  * Returns zero on success, a negative error code otherwise.
1046  *
1047  * Returns -pte_invalid if \@decoder or \@offset is NULL.
1048  * Returns -pte_nosync if \@decoder is out of sync.
1049  */
1050 extern pt_export int
1051 pt_pkt_get_sync_offset(const struct pt_packet_decoder *decoder,
1052 		       uint64_t *offset);
1053 
1054 /* Return a pointer to \@decoder's configuration.
1055  *
1056  * Returns a non-null pointer on success, NULL if \@decoder is NULL.
1057  */
1058 extern pt_export const struct pt_config *
1059 pt_pkt_get_config(const struct pt_packet_decoder *decoder);
1060 
1061 /** Decode the next packet and advance the decoder.
1062  *
1063  * Decodes the packet at \@decoder's current position into \@packet and
1064  * adjusts the \@decoder's position by the number of bytes the packet had
1065  * consumed.
1066  *
1067  * The \@size argument must be set to sizeof(struct pt_packet).
1068  *
1069  * Returns the number of bytes consumed on success, a negative error code
1070  * otherwise.
1071  *
1072  * Returns -pte_bad_opc if the packet is unknown.
1073  * Returns -pte_bad_packet if an unknown packet payload is encountered.
1074  * Returns -pte_eos if \@decoder reached the end of the Intel PT buffer.
1075  * Returns -pte_invalid if \@decoder or \@packet is NULL.
1076  * Returns -pte_nosync if \@decoder is out of sync.
1077  */
1078 extern pt_export int pt_pkt_next(struct pt_packet_decoder *decoder,
1079 				 struct pt_packet *packet, size_t size);
1080 
1081 
1082 
1083 /* Query decoder. */
1084 
1085 
1086 
1087 /** Decoder status flags. */
1088 enum pt_status_flag {
1089 	/** There is an event pending. */
1090 	pts_event_pending	= 1 << 0,
1091 
1092 	/** The address has been suppressed. */
1093 	pts_ip_suppressed	= 1 << 1,
1094 
1095 	/** There is no more trace data available. */
1096 	pts_eos			= 1 << 2
1097 };
1098 
1099 /** Event types. */
1100 enum pt_event_type {
1101 	/* Tracing has been enabled/disabled. */
1102 	ptev_enabled,
1103 	ptev_disabled,
1104 
1105 	/* Tracing has been disabled asynchronously. */
1106 	ptev_async_disabled,
1107 
1108 	/* An asynchronous branch, e.g. interrupt. */
1109 	ptev_async_branch,
1110 
1111 	/* A synchronous paging event. */
1112 	ptev_paging,
1113 
1114 	/* An asynchronous paging event. */
1115 	ptev_async_paging,
1116 
1117 	/* Trace overflow. */
1118 	ptev_overflow,
1119 
1120 	/* An execution mode change. */
1121 	ptev_exec_mode,
1122 
1123 	/* A transactional execution state change. */
1124 	ptev_tsx,
1125 
1126 	/* Trace Stop. */
1127 	ptev_stop,
1128 
1129 	/* A synchronous vmcs event. */
1130 	ptev_vmcs,
1131 
1132 	/* An asynchronous vmcs event. */
1133 	ptev_async_vmcs,
1134 
1135 	/* Execution has stopped. */
1136 	ptev_exstop,
1137 
1138 	/* An MWAIT operation completed. */
1139 	ptev_mwait,
1140 
1141 	/* A power state was entered. */
1142 	ptev_pwre,
1143 
1144 	/* A power state was exited. */
1145 	ptev_pwrx,
1146 
1147 	/* A PTWRITE event. */
1148 	ptev_ptwrite,
1149 
1150 	/* A timing event. */
1151 	ptev_tick,
1152 
1153 	/* A core:bus ratio event. */
1154 	ptev_cbr,
1155 
1156 	/* A maintenance event. */
1157 	ptev_mnt
1158 };
1159 
1160 /** An event. */
1161 struct pt_event {
1162 	/** The type of the event. */
1163 	enum pt_event_type type;
1164 
1165 	/** A flag indicating that the event IP has been suppressed. */
1166 	uint32_t ip_suppressed:1;
1167 
1168 	/** A flag indicating that the event is for status update. */
1169 	uint32_t status_update:1;
1170 
1171 	/** A flag indicating that the event has timing information. */
1172 	uint32_t has_tsc:1;
1173 
1174 	/** The time stamp count of the event.
1175 	 *
1176 	 * This field is only valid if \@has_tsc is set.
1177 	 */
1178 	uint64_t tsc;
1179 
1180 	/** The number of lost mtc and cyc packets.
1181 	 *
1182 	 * This gives an idea about the quality of the \@tsc.  The more packets
1183 	 * were dropped, the less precise timing is.
1184 	 */
1185 	uint32_t lost_mtc;
1186 	uint32_t lost_cyc;
1187 
1188 	/* Reserved space for future extensions. */
1189 	uint64_t reserved[2];
1190 
1191 	/** Event specific data. */
1192 	union {
1193 		/** Event: enabled. */
1194 		struct {
1195 			/** The address at which tracing resumes. */
1196 			uint64_t ip;
1197 
1198 			/** A flag indicating that tracing resumes from the IP
1199 			 * at which tracing had been disabled before.
1200 			 */
1201 			uint32_t resumed:1;
1202 		} enabled;
1203 
1204 		/** Event: disabled. */
1205 		struct {
1206 			/** The destination of the first branch inside a
1207 			 * filtered area.
1208 			 *
1209 			 * This field is not valid if \@ip_suppressed is set.
1210 			 */
1211 			uint64_t ip;
1212 
1213 			/* The exact source ip needs to be determined using
1214 			 * disassembly and the filter configuration.
1215 			 */
1216 		} disabled;
1217 
1218 		/** Event: async disabled. */
1219 		struct {
1220 			/** The source address of the asynchronous branch that
1221 			 * disabled tracing.
1222 			 */
1223 			uint64_t at;
1224 
1225 			/** The destination of the first branch inside a
1226 			 * filtered area.
1227 			 *
1228 			 * This field is not valid if \@ip_suppressed is set.
1229 			 */
1230 			uint64_t ip;
1231 		} async_disabled;
1232 
1233 		/** Event: async branch. */
1234 		struct {
1235 			/** The branch source address. */
1236 			uint64_t from;
1237 
1238 			/** The branch destination address.
1239 			 *
1240 			 * This field is not valid if \@ip_suppressed is set.
1241 			 */
1242 			uint64_t to;
1243 		} async_branch;
1244 
1245 		/** Event: paging. */
1246 		struct {
1247 			/** The updated CR3 value.
1248 			 *
1249 			 * The lower 5 bit have been zeroed out.
1250 			 * The upper bits have been zeroed out depending on the
1251 			 * maximum possible address.
1252 			 */
1253 			uint64_t cr3;
1254 
1255 			/** A flag indicating whether the cpu is operating in
1256 			 * vmx non-root (guest) mode.
1257 			 */
1258 			uint32_t non_root:1;
1259 
1260 			/* The address at which the event is effective is
1261 			 * obvious from the disassembly.
1262 			 */
1263 		} paging;
1264 
1265 		/** Event: async paging. */
1266 		struct {
1267 			/** The updated CR3 value.
1268 			 *
1269 			 * The lower 5 bit have been zeroed out.
1270 			 * The upper bits have been zeroed out depending on the
1271 			 * maximum possible address.
1272 			 */
1273 			uint64_t cr3;
1274 
1275 			/** A flag indicating whether the cpu is operating in
1276 			 * vmx non-root (guest) mode.
1277 			 */
1278 			uint32_t non_root:1;
1279 
1280 			/** The address at which the event is effective. */
1281 			uint64_t ip;
1282 		} async_paging;
1283 
1284 		/** Event: overflow. */
1285 		struct {
1286 			/** The address at which tracing resumes after overflow.
1287 			 *
1288 			 * This field is not valid, if ip_suppressed is set.
1289 			 * In this case, the overflow resolved while tracing
1290 			 * was disabled.
1291 			 */
1292 			uint64_t ip;
1293 		} overflow;
1294 
1295 		/** Event: exec mode. */
1296 		struct {
1297 			/** The execution mode. */
1298 			enum pt_exec_mode mode;
1299 
1300 			/** The address at which the event is effective. */
1301 			uint64_t ip;
1302 		} exec_mode;
1303 
1304 		/** Event: tsx. */
1305 		struct {
1306 			/** The address at which the event is effective.
1307 			 *
1308 			 * This field is not valid if \@ip_suppressed is set.
1309 			 */
1310 			uint64_t ip;
1311 
1312 			/** A flag indicating speculative execution mode. */
1313 			uint32_t speculative:1;
1314 
1315 			/** A flag indicating speculative execution aborts. */
1316 			uint32_t aborted:1;
1317 		} tsx;
1318 
1319 		/** Event: vmcs. */
1320 		struct {
1321 			/** The VMCS base address.
1322 			 *
1323 			 * The address is zero-extended with the lower 12 bits
1324 			 * all zero.
1325 			 */
1326 			uint64_t base;
1327 
1328 			/* The new VMCS base address should be stored and
1329 			 * applied on subsequent VM entries.
1330 			 */
1331 		} vmcs;
1332 
1333 		/** Event: async vmcs. */
1334 		struct {
1335 			/** The VMCS base address.
1336 			 *
1337 			 * The address is zero-extended with the lower 12 bits
1338 			 * all zero.
1339 			 */
1340 			uint64_t base;
1341 
1342 			/** The address at which the event is effective. */
1343 			uint64_t ip;
1344 
1345 			/* An async paging event that binds to the same IP
1346 			 * will always succeed this async vmcs event.
1347 			 */
1348 		} async_vmcs;
1349 
1350 		/** Event: execution stopped. */
1351 		struct {
1352 			/** The address at which execution has stopped.  This is
1353 			 * the last instruction that did not complete.
1354 			 *
1355 			 * This field is not valid, if \@ip_suppressed is set.
1356 			 */
1357 			uint64_t ip;
1358 		} exstop;
1359 
1360 		/** Event: mwait. */
1361 		struct {
1362 			/** The address of the instruction causing the mwait.
1363 			 *
1364 			 * This field is not valid, if \@ip_suppressed is set.
1365 			 */
1366 			uint64_t ip;
1367 
1368 			/** The mwait hints (eax).
1369 			 *
1370 			 * Reserved bits are undefined.
1371 			 */
1372 			uint32_t hints;
1373 
1374 			/** The mwait extensions (ecx).
1375 			 *
1376 			 * Reserved bits are undefined.
1377 			 */
1378 			uint32_t ext;
1379 		} mwait;
1380 
1381 		/** Event: power state entry. */
1382 		struct {
1383 			/** The resolved thread C-state. */
1384 			uint8_t state;
1385 
1386 			/** The resolved thread sub C-state. */
1387 			uint8_t sub_state;
1388 
1389 			/** A flag indicating whether the C-state entry was
1390 			 * initiated by h/w.
1391 			 */
1392 			uint32_t hw:1;
1393 		} pwre;
1394 
1395 		/** Event: power state exit. */
1396 		struct {
1397 			/** The core C-state at the time of the wake. */
1398 			uint8_t last;
1399 
1400 			/** The deepest core C-state achieved during sleep. */
1401 			uint8_t deepest;
1402 
1403 			/** The wake reason:
1404 			 *
1405 			 * - due to external interrupt received.
1406 			 */
1407 			uint32_t interrupt:1;
1408 
1409 			/** - due to store to monitored address. */
1410 			uint32_t store:1;
1411 
1412 			/** - due to h/w autonomous condition such as HDC. */
1413 			uint32_t autonomous:1;
1414 		} pwrx;
1415 
1416 		/** Event: ptwrite. */
1417 		struct {
1418 			/** The address of the ptwrite instruction.
1419 			 *
1420 			 * This field is not valid, if \@ip_suppressed is set.
1421 			 *
1422 			 * In this case, the address is obvious from the
1423 			 * disassembly.
1424 			 */
1425 			uint64_t ip;
1426 
1427 			/** The size of the below \@payload in bytes. */
1428 			uint8_t size;
1429 
1430 			/** The ptwrite payload. */
1431 			uint64_t payload;
1432 		} ptwrite;
1433 
1434 		/** Event: tick. */
1435 		struct {
1436 			/** The instruction address near which the tick occured.
1437 			 *
1438 			 * A timestamp can sometimes be attributed directly to
1439 			 * an instruction (e.g. to an indirect branch that
1440 			 * receives CYC + TIP) and sometimes not (e.g. MTC).
1441 			 *
1442 			 * This field is not valid, if \@ip_suppressed is set.
1443 			 */
1444 			uint64_t ip;
1445 		} tick;
1446 
1447 		/** Event: cbr. */
1448 		struct {
1449 			/** The core:bus ratio. */
1450 			uint16_t ratio;
1451 		} cbr;
1452 
1453 		/** Event: mnt. */
1454 		struct {
1455 			/** The raw payload. */
1456 			uint64_t payload;
1457 		} mnt;
1458 	} variant;
1459 };
1460 
1461 
1462 /** Allocate an Intel PT query decoder.
1463  *
1464  * The decoder will work on the buffer defined in \@config, it shall contain
1465  * raw trace data and remain valid for the lifetime of the decoder.
1466  *
1467  * The decoder needs to be synchronized before it can be used.
1468  */
1469 extern pt_export struct pt_query_decoder *
1470 pt_qry_alloc_decoder(const struct pt_config *config);
1471 
1472 /** Free an Intel PT query decoder.
1473  *
1474  * The \@decoder must not be used after a successful return.
1475  */
1476 extern pt_export void pt_qry_free_decoder(struct pt_query_decoder *decoder);
1477 
1478 /** Synchronize an Intel PT query decoder.
1479  *
1480  * Search for the next synchronization point in forward or backward direction.
1481  *
1482  * If \@decoder has not been synchronized, yet, the search is started at the
1483  * beginning of the trace buffer in case of forward synchronization and at the
1484  * end of the trace buffer in case of backward synchronization.
1485  *
1486  * If \@ip is not NULL, set it to last ip.
1487  *
1488  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
1489  * code otherwise.
1490  *
1491  * Returns -pte_bad_opc if an unknown packet is encountered.
1492  * Returns -pte_bad_packet if an unknown packet payload is encountered.
1493  * Returns -pte_eos if no further synchronization point is found.
1494  * Returns -pte_invalid if \@decoder is NULL.
1495  */
1496 extern pt_export int pt_qry_sync_forward(struct pt_query_decoder *decoder,
1497 					 uint64_t *ip);
1498 extern pt_export int pt_qry_sync_backward(struct pt_query_decoder *decoder,
1499 					 uint64_t *ip);
1500 
1501 /** Manually synchronize an Intel PT query decoder.
1502  *
1503  * Synchronize \@decoder on the syncpoint at \@offset.  There must be a PSB
1504  * packet at \@offset.
1505  *
1506  * If \@ip is not NULL, set it to last ip.
1507  *
1508  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
1509  * code otherwise.
1510  *
1511  * Returns -pte_bad_opc if an unknown packet is encountered.
1512  * Returns -pte_bad_packet if an unknown packet payload is encountered.
1513  * Returns -pte_eos if \@offset lies outside of \@decoder's trace buffer.
1514  * Returns -pte_eos if \@decoder reaches the end of its trace buffer.
1515  * Returns -pte_invalid if \@decoder is NULL.
1516  * Returns -pte_nosync if there is no syncpoint at \@offset.
1517  */
1518 extern pt_export int pt_qry_sync_set(struct pt_query_decoder *decoder,
1519 				     uint64_t *ip, uint64_t offset);
1520 
1521 /** Get the current decoder position.
1522  *
1523  * Fills the current \@decoder position into \@offset.
1524  *
1525  * This is useful for reporting errors.
1526  *
1527  * Returns zero on success, a negative error code otherwise.
1528  *
1529  * Returns -pte_invalid if \@decoder or \@offset is NULL.
1530  * Returns -pte_nosync if \@decoder is out of sync.
1531  */
1532 extern pt_export int pt_qry_get_offset(const struct pt_query_decoder *decoder,
1533 				       uint64_t *offset);
1534 
1535 /** Get the position of the last synchronization point.
1536  *
1537  * Fills the last synchronization position into \@offset.
1538  *
1539  * This is useful for splitting a trace stream for parallel decoding.
1540  *
1541  * Returns zero on success, a negative error code otherwise.
1542  *
1543  * Returns -pte_invalid if \@decoder or \@offset is NULL.
1544  * Returns -pte_nosync if \@decoder is out of sync.
1545  */
1546 extern pt_export int
1547 pt_qry_get_sync_offset(const struct pt_query_decoder *decoder,
1548 		       uint64_t *offset);
1549 
1550 /* Return a pointer to \@decoder's configuration.
1551  *
1552  * Returns a non-null pointer on success, NULL if \@decoder is NULL.
1553  */
1554 extern pt_export const struct pt_config *
1555 pt_qry_get_config(const struct pt_query_decoder *decoder);
1556 
1557 /** Query whether the next unconditional branch has been taken.
1558  *
1559  * On success, provides 1 (taken) or 0 (not taken) in \@taken for the next
1560  * conditional branch and updates \@decoder.
1561  *
1562  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
1563  * code otherwise.
1564  *
1565  * Returns -pte_bad_opc if an unknown packet is encountered.
1566  * Returns -pte_bad_packet if an unknown packet payload is encountered.
1567  * Returns -pte_bad_query if no conditional branch is found.
1568  * Returns -pte_eos if decoding reached the end of the Intel PT buffer.
1569  * Returns -pte_invalid if \@decoder or \@taken is NULL.
1570  * Returns -pte_nosync if \@decoder is out of sync.
1571  */
1572 extern pt_export int pt_qry_cond_branch(struct pt_query_decoder *decoder,
1573 					int *taken);
1574 
1575 /** Get the next indirect branch destination.
1576  *
1577  * On success, provides the linear destination address of the next indirect
1578  * branch in \@ip and updates \@decoder.
1579  *
1580  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
1581  * code otherwise.
1582  *
1583  * Returns -pte_bad_opc if an unknown packet is encountered.
1584  * Returns -pte_bad_packet if an unknown packet payload is encountered.
1585  * Returns -pte_bad_query if no indirect branch is found.
1586  * Returns -pte_eos if decoding reached the end of the Intel PT buffer.
1587  * Returns -pte_invalid if \@decoder or \@ip is NULL.
1588  * Returns -pte_nosync if \@decoder is out of sync.
1589  */
1590 extern pt_export int pt_qry_indirect_branch(struct pt_query_decoder *decoder,
1591 					    uint64_t *ip);
1592 
1593 /** Query the next pending event.
1594  *
1595  * On success, provides the next event \@event and updates \@decoder.
1596  *
1597  * The \@size argument must be set to sizeof(struct pt_event).
1598  *
1599  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
1600  * code otherwise.
1601  *
1602  * Returns -pte_bad_opc if an unknown packet is encountered.
1603  * Returns -pte_bad_packet if an unknown packet payload is encountered.
1604  * Returns -pte_bad_query if no event is found.
1605  * Returns -pte_eos if decoding reached the end of the Intel PT buffer.
1606  * Returns -pte_invalid if \@decoder or \@event is NULL.
1607  * Returns -pte_invalid if \@size is too small.
1608  * Returns -pte_nosync if \@decoder is out of sync.
1609  */
1610 extern pt_export int pt_qry_event(struct pt_query_decoder *decoder,
1611 				  struct pt_event *event, size_t size);
1612 
1613 /** Query the current time.
1614  *
1615  * On success, provides the time at the last query in \@time.
1616  *
1617  * The time is similar to what a rdtsc instruction would return.  Depending
1618  * on the configuration, the time may not be fully accurate.  If TSC is not
1619  * enabled, the time is relative to the last synchronization and can't be used
1620  * to correlate with other TSC-based time sources.  In this case, -pte_no_time
1621  * is returned and the relative time is provided in \@time.
1622  *
1623  * Some timing-related packets may need to be dropped (mostly due to missing
1624  * calibration or incomplete configuration).  To get an idea about the quality
1625  * of the estimated time, we record the number of dropped MTC and CYC packets.
1626  *
1627  * If \@lost_mtc is not NULL, set it to the number of lost MTC packets.
1628  * If \@lost_cyc is not NULL, set it to the number of lost CYC packets.
1629  *
1630  * Returns zero on success, a negative error code otherwise.
1631  *
1632  * Returns -pte_invalid if \@decoder or \@time is NULL.
1633  * Returns -pte_no_time if there has not been a TSC packet.
1634  */
1635 extern pt_export int pt_qry_time(struct pt_query_decoder *decoder,
1636 				 uint64_t *time, uint32_t *lost_mtc,
1637 				 uint32_t *lost_cyc);
1638 
1639 /** Return the current core bus ratio.
1640  *
1641  * On success, provides the current core:bus ratio in \@cbr.  The ratio is
1642  * defined as core cycles per bus clock cycle.
1643  *
1644  * Returns zero on success, a negative error code otherwise.
1645  *
1646  * Returns -pte_invalid if \@decoder or \@cbr is NULL.
1647  * Returns -pte_no_cbr if there has not been a CBR packet.
1648  */
1649 extern pt_export int pt_qry_core_bus_ratio(struct pt_query_decoder *decoder,
1650 					   uint32_t *cbr);
1651 
1652 
1653 
1654 /* Traced image. */
1655 
1656 
1657 
1658 /** An Intel PT address space identifier.
1659  *
1660  * This identifies a particular address space when adding file sections or
1661  * when reading memory.
1662  */
1663 struct pt_asid {
1664 	/** The size of this object - set to sizeof(struct pt_asid). */
1665 	size_t size;
1666 
1667 	/** The CR3 value. */
1668 	uint64_t cr3;
1669 
1670 	/** The VMCS Base address. */
1671 	uint64_t vmcs;
1672 };
1673 
1674 /** An unknown CR3 value to be used for pt_asid objects. */
1675 static const uint64_t pt_asid_no_cr3 = 0xffffffffffffffffull;
1676 
1677 /** An unknown VMCS Base value to be used for pt_asid objects. */
1678 static const uint64_t pt_asid_no_vmcs = 0xffffffffffffffffull;
1679 
1680 /** Initialize an address space identifier. */
1681 static inline void pt_asid_init(struct pt_asid *asid)
1682 {
1683 	asid->size = sizeof(*asid);
1684 	asid->cr3 = pt_asid_no_cr3;
1685 	asid->vmcs = pt_asid_no_vmcs;
1686 }
1687 
1688 
1689 /** A cache of traced image sections. */
1690 struct pt_image_section_cache;
1691 
1692 /** Allocate a traced memory image section cache.
1693  *
1694  * An optional \@name may be given to the cache.  The name string is copied.
1695  *
1696  * Returns a new traced memory image section cache on success, NULL otherwise.
1697  */
1698 extern pt_export struct pt_image_section_cache *
1699 pt_iscache_alloc(const char *name);
1700 
1701 /** Free a traced memory image section cache.
1702  *
1703  * The \@iscache must have been allocated with pt_iscache_alloc().
1704  * The \@iscache must not be used after a successful return.
1705  */
1706 extern pt_export void pt_iscache_free(struct pt_image_section_cache *iscache);
1707 
1708 /** Set the image section cache limit.
1709  *
1710  * Set the limit for a section cache in bytes.  A non-zero limit will keep the
1711  * least recently used sections mapped until the limit is reached.  A limit of
1712  * zero disables caching.
1713  *
1714  * Returns zero on success, a negative pt_error_code otherwise.
1715  * Returns -pte_invalid if \@iscache is NULL.
1716  */
1717 extern pt_export int
1718 pt_iscache_set_limit(struct pt_image_section_cache *iscache, uint64_t limit);
1719 
1720 /** Get the image section cache name.
1721  *
1722  * Returns a pointer to \@iscache's name or NULL if there is no name.
1723  */
1724 extern pt_export const char *
1725 pt_iscache_name(const struct pt_image_section_cache *iscache);
1726 
1727 /** Add a new file section to the traced memory image section cache.
1728  *
1729  * Adds a new section consisting of \@size bytes starting at \@offset in
1730  * \@filename loaded at the virtual address \@vaddr if \@iscache does not
1731  * already contain such a section.
1732  *
1733  * Returns an image section identifier (isid) uniquely identifying that section
1734  * in \@iscache.
1735  *
1736  * The section is silently truncated to match the size of \@filename.
1737  *
1738  * Returns a positive isid on success, a negative error code otherwise.
1739  *
1740  * Returns -pte_invalid if \@iscache or \@filename is NULL.
1741  * Returns -pte_invalid if \@offset is too big.
1742  */
1743 extern pt_export int pt_iscache_add_file(struct pt_image_section_cache *iscache,
1744 					 const char *filename, uint64_t offset,
1745 					 uint64_t size, uint64_t vaddr);
1746 
1747 /** Read memory from a cached file section
1748  *
1749  * Reads \@size bytes of memory starting at virtual address \@vaddr in the
1750  * section identified by \@isid in \@iscache into \@buffer.
1751  *
1752  * The caller is responsible for allocating a \@buffer of at least \@size bytes.
1753  *
1754  * The read request may be truncated if it crosses section boundaries or if
1755  * \@size is getting too big.  We support reading at least 4Kbyte in one chunk
1756  * unless the read would cross a section boundary.
1757  *
1758  * Returns the number of bytes read on success, a negative error code otherwise.
1759  *
1760  * Returns -pte_invalid if \@iscache or \@buffer is NULL.
1761  * Returns -pte_invalid if \@size is zero.
1762  * Returns -pte_nomap if \@vaddr is not contained in section \@isid.
1763  * Returns -pte_bad_image if \@iscache does not contain \@isid.
1764  */
1765 extern pt_export int pt_iscache_read(struct pt_image_section_cache *iscache,
1766 				     uint8_t *buffer, uint64_t size, int isid,
1767 				     uint64_t vaddr);
1768 
1769 /** The traced memory image. */
1770 struct pt_image;
1771 
1772 
1773 /** Allocate a traced memory image.
1774  *
1775  * An optional \@name may be given to the image.  The name string is copied.
1776  *
1777  * Returns a new traced memory image on success, NULL otherwise.
1778  */
1779 extern pt_export struct pt_image *pt_image_alloc(const char *name);
1780 
1781 /** Free a traced memory image.
1782  *
1783  * The \@image must have been allocated with pt_image_alloc().
1784  * The \@image must not be used after a successful return.
1785  */
1786 extern pt_export void pt_image_free(struct pt_image *image);
1787 
1788 /** Get the image name.
1789  *
1790  * Returns a pointer to \@image's name or NULL if there is no name.
1791  */
1792 extern pt_export const char *pt_image_name(const struct pt_image *image);
1793 
1794 /** Add a new file section to the traced memory image.
1795  *
1796  * Adds \@size bytes starting at \@offset in \@filename. The section is
1797  * loaded at the virtual address \@vaddr in the address space \@asid.
1798  *
1799  * The \@asid may be NULL or (partially) invalid.  In that case only the valid
1800  * fields are considered when comparing with other address-spaces.  Use this
1801  * when tracing a single process or when adding sections to all processes.
1802  *
1803  * The section is silently truncated to match the size of \@filename.
1804  *
1805  * Existing sections that would overlap with the new section will be shrunk
1806  * or split.
1807  *
1808  * Returns zero on success, a negative error code otherwise.
1809  *
1810  * Returns -pte_invalid if \@image or \@filename is NULL.
1811  * Returns -pte_invalid if \@offset is too big.
1812  */
1813 extern pt_export int pt_image_add_file(struct pt_image *image,
1814 				       const char *filename, uint64_t offset,
1815 				       uint64_t size,
1816 				       const struct pt_asid *asid,
1817 				       uint64_t vaddr);
1818 
1819 /** Add a section from an image section cache.
1820  *
1821  * Add the section from \@iscache identified by \@isid in address space \@asid.
1822  *
1823  * Existing sections that would overlap with the new section will be shrunk
1824  * or split.
1825  *
1826  * Returns zero on success, a negative error code otherwise.
1827  * Returns -pte_invalid if \@image or \@iscache is NULL.
1828  * Returns -pte_bad_image if \@iscache does not contain \@isid.
1829  */
1830 extern pt_export int pt_image_add_cached(struct pt_image *image,
1831 					 struct pt_image_section_cache *iscache,
1832 					 int isid, const struct pt_asid *asid);
1833 
1834 /** Copy an image.
1835  *
1836  * Adds all sections from \@src to \@image.  Sections that could not be added
1837  * will be ignored.
1838  *
1839  * Returns the number of ignored sections on success, a negative error code
1840  * otherwise.
1841  *
1842  * Returns -pte_invalid if \@image or \@src is NULL.
1843  */
1844 extern pt_export int pt_image_copy(struct pt_image *image,
1845 				   const struct pt_image *src);
1846 
1847 /** Remove all sections loaded from a file.
1848  *
1849  * Removes all sections loaded from \@filename from the address space \@asid.
1850  * Specify the same \@asid that was used for adding sections from \@filename.
1851  *
1852  * Returns the number of removed sections on success, a negative error code
1853  * otherwise.
1854  *
1855  * Returns -pte_invalid if \@image or \@filename is NULL.
1856  */
1857 extern pt_export int pt_image_remove_by_filename(struct pt_image *image,
1858 						 const char *filename,
1859 						 const struct pt_asid *asid);
1860 
1861 /** Remove all sections loaded into an address space.
1862  *
1863  * Removes all sections loaded into \@asid.  Specify the same \@asid that was
1864  * used for adding sections.
1865  *
1866  * Returns the number of removed sections on success, a negative error code
1867  * otherwise.
1868  *
1869  * Returns -pte_invalid if \@image is NULL.
1870  */
1871 extern pt_export int pt_image_remove_by_asid(struct pt_image *image,
1872 					     const struct pt_asid *asid);
1873 
1874 /** A read memory callback function.
1875  *
1876  * It shall read \@size bytes of memory from address space \@asid starting
1877  * at \@ip into \@buffer.
1878  *
1879  * It shall return the number of bytes read on success.
1880  * It shall return a negative pt_error_code otherwise.
1881  */
1882 typedef int (read_memory_callback_t)(uint8_t *buffer, size_t size,
1883 				     const struct pt_asid *asid,
1884 				     uint64_t ip, void *context);
1885 
1886 /** Set the memory callback for the traced memory image.
1887  *
1888  * Sets \@callback for reading memory.  The callback is used for addresses
1889  * that are not found in file sections.  The \@context argument is passed
1890  * to \@callback on each use.
1891  *
1892  * There can only be one callback at any time.  A subsequent call will replace
1893  * the previous callback.  If \@callback is NULL, the callback is removed.
1894  *
1895  * Returns -pte_invalid if \@image is NULL.
1896  */
1897 extern pt_export int pt_image_set_callback(struct pt_image *image,
1898 					   read_memory_callback_t *callback,
1899 					   void *context);
1900 
1901 
1902 
1903 /* Instruction flow decoder. */
1904 
1905 
1906 
1907 /** The instruction class.
1908  *
1909  * We provide only a very coarse classification suitable for reconstructing
1910  * the execution flow.
1911  */
1912 enum pt_insn_class {
1913 	/* The instruction could not be classified. */
1914 	ptic_error,
1915 
1916 	/* The instruction is something not listed below. */
1917 	ptic_other,
1918 
1919 	/* The instruction is a near (function) call. */
1920 	ptic_call,
1921 
1922 	/* The instruction is a near (function) return. */
1923 	ptic_return,
1924 
1925 	/* The instruction is a near unconditional jump. */
1926 	ptic_jump,
1927 
1928 	/* The instruction is a near conditional jump. */
1929 	ptic_cond_jump,
1930 
1931 	/* The instruction is a call-like far transfer.
1932 	 * E.g. SYSCALL, SYSENTER, or FAR CALL.
1933 	 */
1934 	ptic_far_call,
1935 
1936 	/* The instruction is a return-like far transfer.
1937 	 * E.g. SYSRET, SYSEXIT, IRET, or FAR RET.
1938 	 */
1939 	ptic_far_return,
1940 
1941 	/* The instruction is a jump-like far transfer.
1942 	 * E.g. FAR JMP.
1943 	 */
1944 	ptic_far_jump,
1945 
1946 	/* The instruction is a PTWRITE. */
1947 	ptic_ptwrite
1948 };
1949 
1950 /** The maximal size of an instruction. */
1951 enum {
1952 	pt_max_insn_size	= 15
1953 };
1954 
1955 /** A single traced instruction. */
1956 struct pt_insn {
1957 	/** The virtual address in its process. */
1958 	uint64_t ip;
1959 
1960 	/** The image section identifier for the section containing this
1961 	 * instruction.
1962 	 *
1963 	 * A value of zero means that the section did not have an identifier.
1964 	 * The section was not added via an image section cache or the memory
1965 	 * was read via the read memory callback.
1966 	 */
1967 	int isid;
1968 
1969 	/** The execution mode. */
1970 	enum pt_exec_mode mode;
1971 
1972 	/** A coarse classification. */
1973 	enum pt_insn_class iclass;
1974 
1975 	/** The raw bytes. */
1976 	uint8_t raw[pt_max_insn_size];
1977 
1978 	/** The size in bytes. */
1979 	uint8_t size;
1980 
1981 	/** A collection of flags giving additional information:
1982 	 *
1983 	 * - the instruction was executed speculatively.
1984 	 */
1985 	uint32_t speculative:1;
1986 
1987 	/** - this instruction is truncated in its image section.
1988 	 *
1989 	 *    It starts in the image section identified by \@isid and continues
1990 	 *    in one or more other sections.
1991 	 */
1992 	uint32_t truncated:1;
1993 };
1994 
1995 
1996 /** Allocate an Intel PT instruction flow decoder.
1997  *
1998  * The decoder will work on the buffer defined in \@config, it shall contain
1999  * raw trace data and remain valid for the lifetime of the decoder.
2000  *
2001  * The decoder needs to be synchronized before it can be used.
2002  */
2003 extern pt_export struct pt_insn_decoder *
2004 pt_insn_alloc_decoder(const struct pt_config *config);
2005 
2006 /** Free an Intel PT instruction flow decoder.
2007  *
2008  * This will destroy the decoder's default image.
2009  *
2010  * The \@decoder must not be used after a successful return.
2011  */
2012 extern pt_export void pt_insn_free_decoder(struct pt_insn_decoder *decoder);
2013 
2014 /** Synchronize an Intel PT instruction flow decoder.
2015  *
2016  * Search for the next synchronization point in forward or backward direction.
2017  *
2018  * If \@decoder has not been synchronized, yet, the search is started at the
2019  * beginning of the trace buffer in case of forward synchronization and at the
2020  * end of the trace buffer in case of backward synchronization.
2021  *
2022  * Returns zero or a positive value on success, a negative error code otherwise.
2023  *
2024  * Returns -pte_bad_opc if an unknown packet is encountered.
2025  * Returns -pte_bad_packet if an unknown packet payload is encountered.
2026  * Returns -pte_eos if no further synchronization point is found.
2027  * Returns -pte_invalid if \@decoder is NULL.
2028  */
2029 extern pt_export int pt_insn_sync_forward(struct pt_insn_decoder *decoder);
2030 extern pt_export int pt_insn_sync_backward(struct pt_insn_decoder *decoder);
2031 
2032 /** Manually synchronize an Intel PT instruction flow decoder.
2033  *
2034  * Synchronize \@decoder on the syncpoint at \@offset.  There must be a PSB
2035  * packet at \@offset.
2036  *
2037  * Returns zero or a positive value on success, a negative error code otherwise.
2038  *
2039  * Returns -pte_bad_opc if an unknown packet is encountered.
2040  * Returns -pte_bad_packet if an unknown packet payload is encountered.
2041  * Returns -pte_eos if \@offset lies outside of \@decoder's trace buffer.
2042  * Returns -pte_eos if \@decoder reaches the end of its trace buffer.
2043  * Returns -pte_invalid if \@decoder is NULL.
2044  * Returns -pte_nosync if there is no syncpoint at \@offset.
2045  */
2046 extern pt_export int pt_insn_sync_set(struct pt_insn_decoder *decoder,
2047 				      uint64_t offset);
2048 
2049 /** Get the current decoder position.
2050  *
2051  * Fills the current \@decoder position into \@offset.
2052  *
2053  * This is useful for reporting errors.
2054  *
2055  * Returns zero on success, a negative error code otherwise.
2056  *
2057  * Returns -pte_invalid if \@decoder or \@offset is NULL.
2058  * Returns -pte_nosync if \@decoder is out of sync.
2059  */
2060 extern pt_export int pt_insn_get_offset(const struct pt_insn_decoder *decoder,
2061 					uint64_t *offset);
2062 
2063 /** Get the position of the last synchronization point.
2064  *
2065  * Fills the last synchronization position into \@offset.
2066  *
2067  * Returns zero on success, a negative error code otherwise.
2068  *
2069  * Returns -pte_invalid if \@decoder or \@offset is NULL.
2070  * Returns -pte_nosync if \@decoder is out of sync.
2071  */
2072 extern pt_export int
2073 pt_insn_get_sync_offset(const struct pt_insn_decoder *decoder,
2074 			uint64_t *offset);
2075 
2076 /** Get the traced image.
2077  *
2078  * The returned image may be modified as long as no decoder that uses this
2079  * image is running.
2080  *
2081  * Returns a pointer to the traced image the decoder uses for reading memory.
2082  * Returns NULL if \@decoder is NULL.
2083  */
2084 extern pt_export struct pt_image *
2085 pt_insn_get_image(struct pt_insn_decoder *decoder);
2086 
2087 /** Set the traced image.
2088  *
2089  * Sets the image that \@decoder uses for reading memory to \@image.  If \@image
2090  * is NULL, sets the image to \@decoder's default image.
2091  *
2092  * Only one image can be active at any time.
2093  *
2094  * Returns zero on success, a negative error code otherwise.
2095  * Return -pte_invalid if \@decoder is NULL.
2096  */
2097 extern pt_export int pt_insn_set_image(struct pt_insn_decoder *decoder,
2098 				       struct pt_image *image);
2099 
2100 /* Return a pointer to \@decoder's configuration.
2101  *
2102  * Returns a non-null pointer on success, NULL if \@decoder is NULL.
2103  */
2104 extern pt_export const struct pt_config *
2105 pt_insn_get_config(const struct pt_insn_decoder *decoder);
2106 
2107 /** Return the current time.
2108  *
2109  * On success, provides the time at the last preceding timing packet in \@time.
2110  *
2111  * The time is similar to what a rdtsc instruction would return.  Depending
2112  * on the configuration, the time may not be fully accurate.  If TSC is not
2113  * enabled, the time is relative to the last synchronization and can't be used
2114  * to correlate with other TSC-based time sources.  In this case, -pte_no_time
2115  * is returned and the relative time is provided in \@time.
2116  *
2117  * Some timing-related packets may need to be dropped (mostly due to missing
2118  * calibration or incomplete configuration).  To get an idea about the quality
2119  * of the estimated time, we record the number of dropped MTC and CYC packets.
2120  *
2121  * If \@lost_mtc is not NULL, set it to the number of lost MTC packets.
2122  * If \@lost_cyc is not NULL, set it to the number of lost CYC packets.
2123  *
2124  * Returns zero on success, a negative error code otherwise.
2125  *
2126  * Returns -pte_invalid if \@decoder or \@time is NULL.
2127  * Returns -pte_no_time if there has not been a TSC packet.
2128  */
2129 extern pt_export int pt_insn_time(struct pt_insn_decoder *decoder,
2130 				  uint64_t *time, uint32_t *lost_mtc,
2131 				  uint32_t *lost_cyc);
2132 
2133 /** Return the current core bus ratio.
2134  *
2135  * On success, provides the current core:bus ratio in \@cbr.  The ratio is
2136  * defined as core cycles per bus clock cycle.
2137  *
2138  * Returns zero on success, a negative error code otherwise.
2139  *
2140  * Returns -pte_invalid if \@decoder or \@cbr is NULL.
2141  * Returns -pte_no_cbr if there has not been a CBR packet.
2142  */
2143 extern pt_export int pt_insn_core_bus_ratio(struct pt_insn_decoder *decoder,
2144 					    uint32_t *cbr);
2145 
2146 /** Return the current address space identifier.
2147  *
2148  * On success, provides the current address space identifier in \@asid.
2149  *
2150  * The \@size argument must be set to sizeof(struct pt_asid).  At most \@size
2151  * bytes will be copied and \@asid->size will be set to the actual size of the
2152  * provided address space identifier.
2153  *
2154  * Returns zero on success, a negative error code otherwise.
2155  *
2156  * Returns -pte_invalid if \@decoder or \@asid is NULL.
2157  */
2158 extern pt_export int pt_insn_asid(const struct pt_insn_decoder *decoder,
2159 				  struct pt_asid *asid, size_t size);
2160 
2161 /** Determine the next instruction.
2162  *
2163  * On success, provides the next instruction in execution order in \@insn.
2164  *
2165  * The \@size argument must be set to sizeof(struct pt_insn).
2166  *
2167  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
2168  * code otherwise.
2169  *
2170  * Returns pts_eos to indicate the end of the trace stream.  Subsequent calls
2171  * to pt_insn_next() will continue to return pts_eos until trace is required
2172  * to determine the next instruction.
2173  *
2174  * Returns -pte_bad_context if the decoder encountered an unexpected packet.
2175  * Returns -pte_bad_opc if the decoder encountered unknown packets.
2176  * Returns -pte_bad_packet if the decoder encountered unknown packet payloads.
2177  * Returns -pte_bad_query if the decoder got out of sync.
2178  * Returns -pte_eos if decoding reached the end of the Intel PT buffer.
2179  * Returns -pte_invalid if \@decoder or \@insn is NULL.
2180  * Returns -pte_nomap if the memory at the instruction address can't be read.
2181  * Returns -pte_nosync if \@decoder is out of sync.
2182  */
2183 extern pt_export int pt_insn_next(struct pt_insn_decoder *decoder,
2184 				  struct pt_insn *insn, size_t size);
2185 
2186 /** Get the next pending event.
2187  *
2188  * On success, provides the next event in \@event and updates \@decoder.
2189  *
2190  * The \@size argument must be set to sizeof(struct pt_event).
2191  *
2192  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
2193  * code otherwise.
2194  *
2195  * Returns -pte_bad_query if there is no event.
2196  * Returns -pte_invalid if \@decoder or \@event is NULL.
2197  * Returns -pte_invalid if \@size is too small.
2198  */
2199 extern pt_export int pt_insn_event(struct pt_insn_decoder *decoder,
2200 				   struct pt_event *event, size_t size);
2201 
2202 
2203 
2204 /* Block decoder. */
2205 
2206 
2207 
2208 /** A block of instructions.
2209  *
2210  * Instructions in this block are executed sequentially but are not necessarily
2211  * contiguous in memory.  Users are expected to follow direct branches.
2212  */
2213 struct pt_block {
2214 	/** The IP of the first instruction in this block. */
2215 	uint64_t ip;
2216 
2217 	/** The IP of the last instruction in this block.
2218 	 *
2219 	 * This can be used for error-detection.
2220 	 */
2221 	uint64_t end_ip;
2222 
2223 	/** The image section that contains the instructions in this block.
2224 	 *
2225 	 * A value of zero means that the section did not have an identifier.
2226 	 * The section was not added via an image section cache or the memory
2227 	 * was read via the read memory callback.
2228 	 */
2229 	int isid;
2230 
2231 	/** The execution mode for all instructions in this block. */
2232 	enum pt_exec_mode mode;
2233 
2234 	/** The instruction class for the last instruction in this block.
2235 	 *
2236 	 * This field may be set to ptic_error to indicate that the instruction
2237 	 * class is not available.  The block decoder may choose to not provide
2238 	 * the instruction class in some cases for performance reasons.
2239 	 */
2240 	enum pt_insn_class iclass;
2241 
2242 	/** The number of instructions in this block. */
2243 	uint16_t ninsn;
2244 
2245 	/** The raw bytes of the last instruction in this block in case the
2246 	 * instruction does not fit entirely into this block's section.
2247 	 *
2248 	 * This field is only valid if \@truncated is set.
2249 	 */
2250 	uint8_t raw[pt_max_insn_size];
2251 
2252 	/** The size of the last instruction in this block in bytes.
2253 	 *
2254 	 * This field is only valid if \@truncated is set.
2255 	 */
2256 	uint8_t size;
2257 
2258 	/** A collection of flags giving additional information about the
2259 	 * instructions in this block.
2260 	 *
2261 	 * - all instructions in this block were executed speculatively.
2262 	 */
2263 	uint32_t speculative:1;
2264 
2265 	/** - the last instruction in this block is truncated.
2266 	 *
2267 	 *    It starts in this block's section but continues in one or more
2268 	 *    other sections depending on how fragmented the memory image is.
2269 	 *
2270 	 *    The raw bytes for the last instruction are provided in \@raw and
2271 	 *    its size in \@size in this case.
2272 	 */
2273 	uint32_t truncated:1;
2274 };
2275 
2276 /** Allocate an Intel PT block decoder.
2277  *
2278  * The decoder will work on the buffer defined in \@config, it shall contain
2279  * raw trace data and remain valid for the lifetime of the decoder.
2280  *
2281  * The decoder needs to be synchronized before it can be used.
2282  */
2283 extern pt_export struct pt_block_decoder *
2284 pt_blk_alloc_decoder(const struct pt_config *config);
2285 
2286 /** Free an Intel PT block decoder.
2287  *
2288  * This will destroy the decoder's default image.
2289  *
2290  * The \@decoder must not be used after a successful return.
2291  */
2292 extern pt_export void pt_blk_free_decoder(struct pt_block_decoder *decoder);
2293 
2294 /** Synchronize an Intel PT block decoder.
2295  *
2296  * Search for the next synchronization point in forward or backward direction.
2297  *
2298  * If \@decoder has not been synchronized, yet, the search is started at the
2299  * beginning of the trace buffer in case of forward synchronization and at the
2300  * end of the trace buffer in case of backward synchronization.
2301  *
2302  * Returns zero or a positive value on success, a negative error code otherwise.
2303  *
2304  * Returns -pte_bad_opc if an unknown packet is encountered.
2305  * Returns -pte_bad_packet if an unknown packet payload is encountered.
2306  * Returns -pte_eos if no further synchronization point is found.
2307  * Returns -pte_invalid if \@decoder is NULL.
2308  */
2309 extern pt_export int pt_blk_sync_forward(struct pt_block_decoder *decoder);
2310 extern pt_export int pt_blk_sync_backward(struct pt_block_decoder *decoder);
2311 
2312 /** Manually synchronize an Intel PT block decoder.
2313  *
2314  * Synchronize \@decoder on the syncpoint at \@offset.  There must be a PSB
2315  * packet at \@offset.
2316  *
2317  * Returns zero or a positive value on success, a negative error code otherwise.
2318  *
2319  * Returns -pte_bad_opc if an unknown packet is encountered.
2320  * Returns -pte_bad_packet if an unknown packet payload is encountered.
2321  * Returns -pte_eos if \@offset lies outside of \@decoder's trace buffer.
2322  * Returns -pte_eos if \@decoder reaches the end of its trace buffer.
2323  * Returns -pte_invalid if \@decoder is NULL.
2324  * Returns -pte_nosync if there is no syncpoint at \@offset.
2325  */
2326 extern pt_export int pt_blk_sync_set(struct pt_block_decoder *decoder,
2327 				     uint64_t offset);
2328 
2329 /** Get the current decoder position.
2330  *
2331  * Fills the current \@decoder position into \@offset.
2332  *
2333  * This is useful for reporting errors.
2334  *
2335  * Returns zero on success, a negative error code otherwise.
2336  *
2337  * Returns -pte_invalid if \@decoder or \@offset is NULL.
2338  * Returns -pte_nosync if \@decoder is out of sync.
2339  */
2340 extern pt_export int pt_blk_get_offset(const struct pt_block_decoder *decoder,
2341 				       uint64_t *offset);
2342 
2343 /** Get the position of the last synchronization point.
2344  *
2345  * Fills the last synchronization position into \@offset.
2346  *
2347  * Returns zero on success, a negative error code otherwise.
2348  *
2349  * Returns -pte_invalid if \@decoder or \@offset is NULL.
2350  * Returns -pte_nosync if \@decoder is out of sync.
2351  */
2352 extern pt_export int
2353 pt_blk_get_sync_offset(const struct pt_block_decoder *decoder,
2354 		       uint64_t *offset);
2355 
2356 /** Get the traced image.
2357  *
2358  * The returned image may be modified as long as \@decoder is not running.
2359  *
2360  * Returns a pointer to the traced image \@decoder uses for reading memory.
2361  * Returns NULL if \@decoder is NULL.
2362  */
2363 extern pt_export struct pt_image *
2364 pt_blk_get_image(struct pt_block_decoder *decoder);
2365 
2366 /** Set the traced image.
2367  *
2368  * Sets the image that \@decoder uses for reading memory to \@image.  If \@image
2369  * is NULL, sets the image to \@decoder's default image.
2370  *
2371  * Only one image can be active at any time.
2372  *
2373  * Returns zero on success, a negative error code otherwise.
2374  * Return -pte_invalid if \@decoder is NULL.
2375  */
2376 extern pt_export int pt_blk_set_image(struct pt_block_decoder *decoder,
2377 				      struct pt_image *image);
2378 
2379 /* Return a pointer to \@decoder's configuration.
2380  *
2381  * Returns a non-null pointer on success, NULL if \@decoder is NULL.
2382  */
2383 extern pt_export const struct pt_config *
2384 pt_blk_get_config(const struct pt_block_decoder *decoder);
2385 
2386 /** Return the current time.
2387  *
2388  * On success, provides the time at the last preceding timing packet in \@time.
2389  *
2390  * The time is similar to what a rdtsc instruction would return.  Depending
2391  * on the configuration, the time may not be fully accurate.  If TSC is not
2392  * enabled, the time is relative to the last synchronization and can't be used
2393  * to correlate with other TSC-based time sources.  In this case, -pte_no_time
2394  * is returned and the relative time is provided in \@time.
2395  *
2396  * Some timing-related packets may need to be dropped (mostly due to missing
2397  * calibration or incomplete configuration).  To get an idea about the quality
2398  * of the estimated time, we record the number of dropped MTC and CYC packets.
2399  *
2400  * If \@lost_mtc is not NULL, set it to the number of lost MTC packets.
2401  * If \@lost_cyc is not NULL, set it to the number of lost CYC packets.
2402  *
2403  * Returns zero on success, a negative error code otherwise.
2404  *
2405  * Returns -pte_invalid if \@decoder or \@time is NULL.
2406  * Returns -pte_no_time if there has not been a TSC packet.
2407  */
2408 extern pt_export int pt_blk_time(struct pt_block_decoder *decoder,
2409 				 uint64_t *time, uint32_t *lost_mtc,
2410 				 uint32_t *lost_cyc);
2411 
2412 /** Return the current core bus ratio.
2413  *
2414  * On success, provides the current core:bus ratio in \@cbr.  The ratio is
2415  * defined as core cycles per bus clock cycle.
2416  *
2417  * Returns zero on success, a negative error code otherwise.
2418  *
2419  * Returns -pte_invalid if \@decoder or \@cbr is NULL.
2420  * Returns -pte_no_cbr if there has not been a CBR packet.
2421  */
2422 extern pt_export int pt_blk_core_bus_ratio(struct pt_block_decoder *decoder,
2423 					   uint32_t *cbr);
2424 
2425 /** Return the current address space identifier.
2426  *
2427  * On success, provides the current address space identifier in \@asid.
2428  *
2429  * The \@size argument must be set to sizeof(struct pt_asid).  At most \@size
2430  * bytes will be copied and \@asid->size will be set to the actual size of the
2431  * provided address space identifier.
2432  *
2433  * Returns zero on success, a negative error code otherwise.
2434  *
2435  * Returns -pte_invalid if \@decoder or \@asid is NULL.
2436  */
2437 extern pt_export int pt_blk_asid(const struct pt_block_decoder *decoder,
2438 				 struct pt_asid *asid, size_t size);
2439 
2440 /** Determine the next block of instructions.
2441  *
2442  * On success, provides the next block of instructions in execution order in
2443  * \@block.
2444  *
2445  * The \@size argument must be set to sizeof(struct pt_block).
2446  *
2447  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
2448  * code otherwise.
2449  *
2450  * Returns pts_eos to indicate the end of the trace stream.  Subsequent calls
2451  * to pt_block_next() will continue to return pts_eos until trace is required
2452  * to determine the next instruction.
2453  *
2454  * Returns -pte_bad_context if the decoder encountered an unexpected packet.
2455  * Returns -pte_bad_opc if the decoder encountered unknown packets.
2456  * Returns -pte_bad_packet if the decoder encountered unknown packet payloads.
2457  * Returns -pte_bad_query if the decoder got out of sync.
2458  * Returns -pte_eos if decoding reached the end of the Intel PT buffer.
2459  * Returns -pte_invalid if \@decoder or \@block is NULL.
2460  * Returns -pte_nomap if the memory at the instruction address can't be read.
2461  * Returns -pte_nosync if \@decoder is out of sync.
2462  */
2463 extern pt_export int pt_blk_next(struct pt_block_decoder *decoder,
2464 				 struct pt_block *block, size_t size);
2465 
2466 /** Get the next pending event.
2467  *
2468  * On success, provides the next event in \@event and updates \@decoder.
2469  *
2470  * The \@size argument must be set to sizeof(struct pt_event).
2471  *
2472  * Returns a non-negative pt_status_flag bit-vector on success, a negative error
2473  * code otherwise.
2474  *
2475  * Returns -pte_bad_query if there is no event.
2476  * Returns -pte_invalid if \@decoder or \@event is NULL.
2477  * Returns -pte_invalid if \@size is too small.
2478  */
2479 extern pt_export int pt_blk_event(struct pt_block_decoder *decoder,
2480 				  struct pt_event *event, size_t size);
2481 
2482 #ifdef __cplusplus
2483 }
2484 #endif
2485 
2486 #endif /* INTEL_PT_H */
2487