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