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