1 #ifndef __PERF_RECORD_H
2 #define __PERF_RECORD_H
3 
4 #include <limits.h>
5 #include <stdio.h>
6 
7 #include "../perf.h"
8 #include "map.h"
9 #include "build-id.h"
10 
11 struct mmap_event {
12 	struct perf_event_header header;
13 	u32 pid, tid;
14 	u64 start;
15 	u64 len;
16 	u64 pgoff;
17 	char filename[PATH_MAX];
18 };
19 
20 struct mmap2_event {
21 	struct perf_event_header header;
22 	u32 pid, tid;
23 	u64 start;
24 	u64 len;
25 	u64 pgoff;
26 	u32 maj;
27 	u32 min;
28 	u64 ino;
29 	u64 ino_generation;
30 	char filename[PATH_MAX];
31 };
32 
33 struct comm_event {
34 	struct perf_event_header header;
35 	u32 pid, tid;
36 	char comm[16];
37 };
38 
39 struct fork_event {
40 	struct perf_event_header header;
41 	u32 pid, ppid;
42 	u32 tid, ptid;
43 	u64 time;
44 };
45 
46 struct lost_event {
47 	struct perf_event_header header;
48 	u64 id;
49 	u64 lost;
50 };
51 
52 /*
53  * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
54  */
55 struct read_event {
56 	struct perf_event_header header;
57 	u32 pid, tid;
58 	u64 value;
59 	u64 time_enabled;
60 	u64 time_running;
61 	u64 id;
62 };
63 
64 
65 #define PERF_SAMPLE_MASK				\
66 	(PERF_SAMPLE_IP | PERF_SAMPLE_TID |		\
67 	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |		\
68 	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
69 	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |		\
70 	 PERF_SAMPLE_IDENTIFIER)
71 
72 struct sample_event {
73 	struct perf_event_header        header;
74 	u64 array[];
75 };
76 
77 struct regs_dump {
78 	u64 abi;
79 	u64 *regs;
80 };
81 
82 struct stack_dump {
83 	u16 offset;
84 	u64 size;
85 	char *data;
86 };
87 
88 struct sample_read_value {
89 	u64 value;
90 	u64 id;
91 };
92 
93 struct sample_read {
94 	u64 time_enabled;
95 	u64 time_running;
96 	union {
97 		struct {
98 			u64 nr;
99 			struct sample_read_value *values;
100 		} group;
101 		struct sample_read_value one;
102 	};
103 };
104 
105 struct perf_sample {
106 	u64 ip;
107 	u32 pid, tid;
108 	u64 time;
109 	u64 addr;
110 	u64 id;
111 	u64 stream_id;
112 	u64 period;
113 	u64 weight;
114 	u32 cpu;
115 	u32 raw_size;
116 	u64 data_src;
117 	void *raw_data;
118 	struct ip_callchain *callchain;
119 	struct branch_stack *branch_stack;
120 	struct regs_dump  user_regs;
121 	struct stack_dump user_stack;
122 	struct sample_read read;
123 };
124 
125 #define PERF_MEM_DATA_SRC_NONE \
126 	(PERF_MEM_S(OP, NA) |\
127 	 PERF_MEM_S(LVL, NA) |\
128 	 PERF_MEM_S(SNOOP, NA) |\
129 	 PERF_MEM_S(LOCK, NA) |\
130 	 PERF_MEM_S(TLB, NA))
131 
132 struct build_id_event {
133 	struct perf_event_header header;
134 	pid_t			 pid;
135 	u8			 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
136 	char			 filename[];
137 };
138 
139 enum perf_user_event_type { /* above any possible kernel type */
140 	PERF_RECORD_USER_TYPE_START		= 64,
141 	PERF_RECORD_HEADER_ATTR			= 64,
142 	PERF_RECORD_HEADER_EVENT_TYPE		= 65, /* depreceated */
143 	PERF_RECORD_HEADER_TRACING_DATA		= 66,
144 	PERF_RECORD_HEADER_BUILD_ID		= 67,
145 	PERF_RECORD_FINISHED_ROUND		= 68,
146 	PERF_RECORD_HEADER_MAX
147 };
148 
149 struct attr_event {
150 	struct perf_event_header header;
151 	struct perf_event_attr attr;
152 	u64 id[];
153 };
154 
155 #define MAX_EVENT_NAME 64
156 
157 struct perf_trace_event_type {
158 	u64	event_id;
159 	char	name[MAX_EVENT_NAME];
160 };
161 
162 struct event_type_event {
163 	struct perf_event_header header;
164 	struct perf_trace_event_type event_type;
165 };
166 
167 struct tracing_data_event {
168 	struct perf_event_header header;
169 	u32 size;
170 };
171 
172 union perf_event {
173 	struct perf_event_header	header;
174 	struct mmap_event		mmap;
175 	struct mmap2_event		mmap2;
176 	struct comm_event		comm;
177 	struct fork_event		fork;
178 	struct lost_event		lost;
179 	struct read_event		read;
180 	struct sample_event		sample;
181 	struct attr_event		attr;
182 	struct event_type_event		event_type;
183 	struct tracing_data_event	tracing_data;
184 	struct build_id_event		build_id;
185 };
186 
187 void perf_event__print_totals(void);
188 
189 struct perf_tool;
190 struct thread_map;
191 
192 typedef int (*perf_event__handler_t)(struct perf_tool *tool,
193 				     union perf_event *event,
194 				     struct perf_sample *sample,
195 				     struct machine *machine);
196 
197 int perf_event__synthesize_thread_map(struct perf_tool *tool,
198 				      struct thread_map *threads,
199 				      perf_event__handler_t process,
200 				      struct machine *machine);
201 int perf_event__synthesize_threads(struct perf_tool *tool,
202 				   perf_event__handler_t process,
203 				   struct machine *machine);
204 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
205 				       perf_event__handler_t process,
206 				       struct machine *machine,
207 				       const char *symbol_name);
208 
209 int perf_event__synthesize_modules(struct perf_tool *tool,
210 				   perf_event__handler_t process,
211 				   struct machine *machine);
212 
213 int perf_event__process_comm(struct perf_tool *tool,
214 			     union perf_event *event,
215 			     struct perf_sample *sample,
216 			     struct machine *machine);
217 int perf_event__process_lost(struct perf_tool *tool,
218 			     union perf_event *event,
219 			     struct perf_sample *sample,
220 			     struct machine *machine);
221 int perf_event__process_mmap(struct perf_tool *tool,
222 			     union perf_event *event,
223 			     struct perf_sample *sample,
224 			     struct machine *machine);
225 int perf_event__process_mmap2(struct perf_tool *tool,
226 			     union perf_event *event,
227 			     struct perf_sample *sample,
228 			     struct machine *machine);
229 int perf_event__process_fork(struct perf_tool *tool,
230 			     union perf_event *event,
231 			     struct perf_sample *sample,
232 			     struct machine *machine);
233 int perf_event__process_exit(struct perf_tool *tool,
234 			     union perf_event *event,
235 			     struct perf_sample *sample,
236 			     struct machine *machine);
237 int perf_event__process(struct perf_tool *tool,
238 			union perf_event *event,
239 			struct perf_sample *sample,
240 			struct machine *machine);
241 
242 struct addr_location;
243 int perf_event__preprocess_sample(const union perf_event *self,
244 				  struct machine *machine,
245 				  struct addr_location *al,
246 				  struct perf_sample *sample);
247 
248 const char *perf_event__name(unsigned int id);
249 
250 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
251 				     u64 sample_regs_user, u64 read_format);
252 int perf_event__synthesize_sample(union perf_event *event, u64 type,
253 				  u64 sample_regs_user, u64 read_format,
254 				  const struct perf_sample *sample,
255 				  bool swapped);
256 
257 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
258 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
259 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
260 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
261 size_t perf_event__fprintf(union perf_event *event, FILE *fp);
262 
263 #endif /* __PERF_RECORD_H */
264