xref: /OK3568_Linux_fs/kernel/tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * intel_pt_pkt_decoder.h: Intel Processor Trace support
4*4882a593Smuzhiyun  * Copyright (c) 2013-2014, Intel Corporation.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef INCLUDE__INTEL_PT_PKT_DECODER_H__
8*4882a593Smuzhiyun #define INCLUDE__INTEL_PT_PKT_DECODER_H__
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <stddef.h>
11*4882a593Smuzhiyun #include <stdint.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define INTEL_PT_PKT_DESC_MAX	256
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define INTEL_PT_NEED_MORE_BYTES	-1
16*4882a593Smuzhiyun #define INTEL_PT_BAD_PACKET		-2
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define INTEL_PT_PSB_STR		"\002\202\002\202\002\202\002\202" \
19*4882a593Smuzhiyun 					"\002\202\002\202\002\202\002\202"
20*4882a593Smuzhiyun #define INTEL_PT_PSB_LEN		16
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define INTEL_PT_PKT_MAX_SZ		16
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun enum intel_pt_pkt_type {
25*4882a593Smuzhiyun 	INTEL_PT_BAD,
26*4882a593Smuzhiyun 	INTEL_PT_PAD,
27*4882a593Smuzhiyun 	INTEL_PT_TNT,
28*4882a593Smuzhiyun 	INTEL_PT_TIP_PGD,
29*4882a593Smuzhiyun 	INTEL_PT_TIP_PGE,
30*4882a593Smuzhiyun 	INTEL_PT_TSC,
31*4882a593Smuzhiyun 	INTEL_PT_TMA,
32*4882a593Smuzhiyun 	INTEL_PT_MODE_EXEC,
33*4882a593Smuzhiyun 	INTEL_PT_MODE_TSX,
34*4882a593Smuzhiyun 	INTEL_PT_MTC,
35*4882a593Smuzhiyun 	INTEL_PT_TIP,
36*4882a593Smuzhiyun 	INTEL_PT_FUP,
37*4882a593Smuzhiyun 	INTEL_PT_CYC,
38*4882a593Smuzhiyun 	INTEL_PT_VMCS,
39*4882a593Smuzhiyun 	INTEL_PT_PSB,
40*4882a593Smuzhiyun 	INTEL_PT_PSBEND,
41*4882a593Smuzhiyun 	INTEL_PT_CBR,
42*4882a593Smuzhiyun 	INTEL_PT_TRACESTOP,
43*4882a593Smuzhiyun 	INTEL_PT_PIP,
44*4882a593Smuzhiyun 	INTEL_PT_OVF,
45*4882a593Smuzhiyun 	INTEL_PT_MNT,
46*4882a593Smuzhiyun 	INTEL_PT_PTWRITE,
47*4882a593Smuzhiyun 	INTEL_PT_PTWRITE_IP,
48*4882a593Smuzhiyun 	INTEL_PT_EXSTOP,
49*4882a593Smuzhiyun 	INTEL_PT_EXSTOP_IP,
50*4882a593Smuzhiyun 	INTEL_PT_MWAIT,
51*4882a593Smuzhiyun 	INTEL_PT_PWRE,
52*4882a593Smuzhiyun 	INTEL_PT_PWRX,
53*4882a593Smuzhiyun 	INTEL_PT_BBP,
54*4882a593Smuzhiyun 	INTEL_PT_BIP,
55*4882a593Smuzhiyun 	INTEL_PT_BEP,
56*4882a593Smuzhiyun 	INTEL_PT_BEP_IP,
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun struct intel_pt_pkt {
60*4882a593Smuzhiyun 	enum intel_pt_pkt_type	type;
61*4882a593Smuzhiyun 	int			count;
62*4882a593Smuzhiyun 	uint64_t		payload;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun  * Decoding of BIP packets conflicts with single-byte TNT packets. Since BIP
67*4882a593Smuzhiyun  * packets only occur in the context of a block (i.e. between BBP and BEP), that
68*4882a593Smuzhiyun  * context must be recorded and passed to the packet decoder.
69*4882a593Smuzhiyun  */
70*4882a593Smuzhiyun enum intel_pt_pkt_ctx {
71*4882a593Smuzhiyun 	INTEL_PT_NO_CTX,	/* BIP packets are invalid */
72*4882a593Smuzhiyun 	INTEL_PT_BLK_4_CTX,	/* 4-byte BIP packets */
73*4882a593Smuzhiyun 	INTEL_PT_BLK_8_CTX,	/* 8-byte BIP packets */
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun const char *intel_pt_pkt_name(enum intel_pt_pkt_type);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun int intel_pt_get_packet(const unsigned char *buf, size_t len,
79*4882a593Smuzhiyun 			struct intel_pt_pkt *packet,
80*4882a593Smuzhiyun 			enum intel_pt_pkt_ctx *ctx);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun void intel_pt_upd_pkt_ctx(const struct intel_pt_pkt *packet,
83*4882a593Smuzhiyun 			  enum intel_pt_pkt_ctx *ctx);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun int intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf, size_t len);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #endif
88