xref: /openbmc/linux/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h (revision f4aa081949e7b6b01e711229c5a47ee3482a169c)
1*f4aa0819SAdrian Hunter /*
2*f4aa0819SAdrian Hunter  * intel_pt_decoder.h: Intel Processor Trace support
3*f4aa0819SAdrian Hunter  * Copyright (c) 2013-2014, Intel Corporation.
4*f4aa0819SAdrian Hunter  *
5*f4aa0819SAdrian Hunter  * This program is free software; you can redistribute it and/or modify it
6*f4aa0819SAdrian Hunter  * under the terms and conditions of the GNU General Public License,
7*f4aa0819SAdrian Hunter  * version 2, as published by the Free Software Foundation.
8*f4aa0819SAdrian Hunter  *
9*f4aa0819SAdrian Hunter  * This program is distributed in the hope it will be useful, but WITHOUT
10*f4aa0819SAdrian Hunter  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*f4aa0819SAdrian Hunter  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12*f4aa0819SAdrian Hunter  * more details.
13*f4aa0819SAdrian Hunter  *
14*f4aa0819SAdrian Hunter  */
15*f4aa0819SAdrian Hunter 
16*f4aa0819SAdrian Hunter #ifndef INCLUDE__INTEL_PT_DECODER_H__
17*f4aa0819SAdrian Hunter #define INCLUDE__INTEL_PT_DECODER_H__
18*f4aa0819SAdrian Hunter 
19*f4aa0819SAdrian Hunter #include <stdint.h>
20*f4aa0819SAdrian Hunter #include <stddef.h>
21*f4aa0819SAdrian Hunter #include <stdbool.h>
22*f4aa0819SAdrian Hunter 
23*f4aa0819SAdrian Hunter #include "intel-pt-insn-decoder.h"
24*f4aa0819SAdrian Hunter 
25*f4aa0819SAdrian Hunter #define INTEL_PT_IN_TX		(1 << 0)
26*f4aa0819SAdrian Hunter #define INTEL_PT_ABORT_TX	(1 << 1)
27*f4aa0819SAdrian Hunter #define INTEL_PT_ASYNC		(1 << 2)
28*f4aa0819SAdrian Hunter 
29*f4aa0819SAdrian Hunter enum intel_pt_sample_type {
30*f4aa0819SAdrian Hunter 	INTEL_PT_BRANCH		= 1 << 0,
31*f4aa0819SAdrian Hunter 	INTEL_PT_INSTRUCTION	= 1 << 1,
32*f4aa0819SAdrian Hunter 	INTEL_PT_TRANSACTION	= 1 << 2,
33*f4aa0819SAdrian Hunter };
34*f4aa0819SAdrian Hunter 
35*f4aa0819SAdrian Hunter enum intel_pt_period_type {
36*f4aa0819SAdrian Hunter 	INTEL_PT_PERIOD_NONE,
37*f4aa0819SAdrian Hunter 	INTEL_PT_PERIOD_INSTRUCTIONS,
38*f4aa0819SAdrian Hunter 	INTEL_PT_PERIOD_TICKS,
39*f4aa0819SAdrian Hunter };
40*f4aa0819SAdrian Hunter 
41*f4aa0819SAdrian Hunter enum {
42*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_NOMEM = 1,
43*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_INTERN,
44*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_BADPKT,
45*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_NODATA,
46*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_NOINSN,
47*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_MISMAT,
48*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_OVR,
49*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_LOST,
50*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_UNK,
51*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_NELOOP,
52*f4aa0819SAdrian Hunter 	INTEL_PT_ERR_MAX,
53*f4aa0819SAdrian Hunter };
54*f4aa0819SAdrian Hunter 
55*f4aa0819SAdrian Hunter struct intel_pt_state {
56*f4aa0819SAdrian Hunter 	enum intel_pt_sample_type type;
57*f4aa0819SAdrian Hunter 	int err;
58*f4aa0819SAdrian Hunter 	uint64_t from_ip;
59*f4aa0819SAdrian Hunter 	uint64_t to_ip;
60*f4aa0819SAdrian Hunter 	uint64_t cr3;
61*f4aa0819SAdrian Hunter 	uint64_t timestamp;
62*f4aa0819SAdrian Hunter 	uint64_t est_timestamp;
63*f4aa0819SAdrian Hunter 	uint64_t trace_nr;
64*f4aa0819SAdrian Hunter 	uint32_t flags;
65*f4aa0819SAdrian Hunter 	enum intel_pt_insn_op insn_op;
66*f4aa0819SAdrian Hunter 	int insn_len;
67*f4aa0819SAdrian Hunter };
68*f4aa0819SAdrian Hunter 
69*f4aa0819SAdrian Hunter struct intel_pt_insn;
70*f4aa0819SAdrian Hunter 
71*f4aa0819SAdrian Hunter struct intel_pt_buffer {
72*f4aa0819SAdrian Hunter 	const unsigned char *buf;
73*f4aa0819SAdrian Hunter 	size_t len;
74*f4aa0819SAdrian Hunter 	bool consecutive;
75*f4aa0819SAdrian Hunter 	uint64_t ref_timestamp;
76*f4aa0819SAdrian Hunter 	uint64_t trace_nr;
77*f4aa0819SAdrian Hunter };
78*f4aa0819SAdrian Hunter 
79*f4aa0819SAdrian Hunter struct intel_pt_params {
80*f4aa0819SAdrian Hunter 	int (*get_trace)(struct intel_pt_buffer *buffer, void *data);
81*f4aa0819SAdrian Hunter 	int (*walk_insn)(struct intel_pt_insn *intel_pt_insn,
82*f4aa0819SAdrian Hunter 			 uint64_t *insn_cnt_ptr, uint64_t *ip, uint64_t to_ip,
83*f4aa0819SAdrian Hunter 			 uint64_t max_insn_cnt, void *data);
84*f4aa0819SAdrian Hunter 	void *data;
85*f4aa0819SAdrian Hunter 	bool return_compression;
86*f4aa0819SAdrian Hunter 	uint64_t period;
87*f4aa0819SAdrian Hunter 	enum intel_pt_period_type period_type;
88*f4aa0819SAdrian Hunter 	unsigned max_non_turbo_ratio;
89*f4aa0819SAdrian Hunter };
90*f4aa0819SAdrian Hunter 
91*f4aa0819SAdrian Hunter struct intel_pt_decoder;
92*f4aa0819SAdrian Hunter 
93*f4aa0819SAdrian Hunter struct intel_pt_decoder *intel_pt_decoder_new(struct intel_pt_params *params);
94*f4aa0819SAdrian Hunter void intel_pt_decoder_free(struct intel_pt_decoder *decoder);
95*f4aa0819SAdrian Hunter 
96*f4aa0819SAdrian Hunter const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder);
97*f4aa0819SAdrian Hunter 
98*f4aa0819SAdrian Hunter unsigned char *intel_pt_find_overlap(unsigned char *buf_a, size_t len_a,
99*f4aa0819SAdrian Hunter 				     unsigned char *buf_b, size_t len_b,
100*f4aa0819SAdrian Hunter 				     bool have_tsc);
101*f4aa0819SAdrian Hunter 
102*f4aa0819SAdrian Hunter int intel_pt__strerror(int code, char *buf, size_t buflen);
103*f4aa0819SAdrian Hunter 
104*f4aa0819SAdrian Hunter #endif
105