]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/processor-trace/libipt/include/intel-pt.h.in
MFV r353608: 10165 libzpool: passing argument 1 to restrict-qualified parameter
[FreeBSD/FreeBSD.git] / contrib / processor-trace / libipt / include / intel-pt.h.in
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 */