1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __PERF_RECORD_H
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define __PERF_RECORD_H
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <limits.h>
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "../perf.h"
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "map.h"
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * PERF_SAMPLE_IP | PERF_SAMPLE_TID | *
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct ip_event {
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 ip;
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 pid, tid;
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned char __more_data[];
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct mmap_event {
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 pid, tid;
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 start;
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 len;
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 pgoff;
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char filename[PATH_MAX];
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct comm_event {
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 pid, tid;
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char comm[16];
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct fork_event {
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 pid, ppid;
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 tid, ptid;
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 time;
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct lost_event {
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 id;
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 lost;
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct read_event {
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 pid, tid;
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 value;
54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 time_enabled;
55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 time_running;
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 id;
57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PERF_SAMPLE_MASK				\
61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	(PERF_SAMPLE_IP | PERF_SAMPLE_TID |		\
62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |		\
63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct sample_event {
67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header        header;
68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 array[];
69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_sample {
72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 ip;
73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 pid, tid;
74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 time;
75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 addr;
76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 id;
77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 stream_id;
78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 period;
79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 cpu;
80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 raw_size;
81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	void *raw_data;
82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct ip_callchain *callchain;
83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define BUILD_ID_SIZE 20
86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct build_id_event {
88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	pid_t			 pid;
90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng        /* ANDROID_CHANGE_BEGIN */
917d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#if defined(__BIONIC__) || defined(__APPLE__)
92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u8			 build_id[KERNEL_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else
94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u8			 build_id[ALIGN(BUILD_ID_SIZE, sizeof(u64))];
95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng        /* ANDROID_CHANGE_END */
97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char			 filename[];
98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum perf_user_event_type { /* above any possible kernel type */
101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_USER_TYPE_START		= 64,
102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_HEADER_ATTR			= 64,
103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_HEADER_EVENT_TYPE		= 65,
104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_HEADER_TRACING_DATA		= 66,
105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_HEADER_BUILD_ID		= 67,
106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_FINISHED_ROUND		= 68,
107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	PERF_RECORD_HEADER_MAX
108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct attr_event {
111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_attr attr;
113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64 id[];
114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define MAX_EVENT_NAME 64
117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_trace_event_type {
119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u64	event_id;
120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char	name[MAX_EVENT_NAME];
121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct event_type_event {
124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_trace_event_type event_type;
126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct tracing_data_event {
129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header header;
130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	u32 size;
131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengunion perf_event {
134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct perf_event_header	header;
135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct ip_event			ip;
136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct mmap_event		mmap;
137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct comm_event		comm;
138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct fork_event		fork;
139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct lost_event		lost;
140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct read_event		read;
141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct sample_event		sample;
142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct attr_event		attr;
143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct event_type_event		event_type;
144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct tracing_data_event	tracing_data;
145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct build_id_event		build_id;
146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid perf_event__print_totals(void);
149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct perf_session;
151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct thread_map;
152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengtypedef int (*perf_event__handler_synth_t)(union perf_event *event,
154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					   struct perf_session *session);
155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengtypedef int (*perf_event__handler_t)(union perf_event *event,
156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				     struct perf_sample *sample,
157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				      struct perf_session *session);
158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__synthesize_thread_map(struct thread_map *threads,
160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				      perf_event__handler_t process,
161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				      struct perf_session *session);
162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__synthesize_threads(perf_event__handler_t process,
163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				   struct perf_session *session);
164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__synthesize_kernel_mmap(perf_event__handler_t process,
165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				       struct perf_session *session,
166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				       struct machine *machine,
167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				       const char *symbol_name);
168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__synthesize_modules(perf_event__handler_t process,
170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				   struct perf_session *session,
171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				   struct machine *machine);
172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__process_comm(union perf_event *event, struct perf_sample *sample,
174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     struct perf_session *session);
175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__process_lost(union perf_event *event, struct perf_sample *sample,
176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     struct perf_session *session);
177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__process_mmap(union perf_event *event, struct perf_sample *sample,
178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     struct perf_session *session);
179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__process_task(union perf_event *event, struct perf_sample *sample,
180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     struct perf_session *session);
181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__process(union perf_event *event, struct perf_sample *sample,
182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			struct perf_session *session);
183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct addr_location;
185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__preprocess_sample(const union perf_event *self,
186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				  struct perf_session *session,
187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				  struct addr_location *al,
188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				  struct perf_sample *sample,
189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				  symbol_filter_t filter);
190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengconst char *perf_event__name(unsigned int id);
192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint perf_event__parse_sample(const union perf_event *event, u64 type,
194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     int sample_size, bool sample_id_all,
195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     struct perf_sample *sample);
196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* __PERF_RECORD_H */
198