Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
cdd6c482 IM |
2 | #ifndef __PERF_RECORD_H |
3 | #define __PERF_RECORD_H | |
4cb3c6d5 ACM |
4 | /* |
5 | * The linux/stddef.h isn't need here, but is needed for __always_inline used | |
6 | * in files included from uapi/linux/perf_event.h such as | |
7 | * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h, | |
8 | * detected in at least musl libc, used in Alpine Linux. -acme | |
9 | */ | |
482ad897 | 10 | #include <stdio.h> |
4cb3c6d5 | 11 | #include <linux/stddef.h> |
1345e2ee | 12 | #include <perf/event.h> |
4cb3c6d5 | 13 | #include <linux/types.h> |
4a58e611 | 14 | |
4cb3c6d5 ACM |
15 | struct dso; |
16 | struct machine; | |
17 | struct perf_event_attr; | |
9823147d | 18 | struct perf_sample; |
4cb3c6d5 | 19 | |
1345e2ee JO |
20 | #ifdef __LP64__ |
21 | /* | |
22 | * /usr/include/inttypes.h uses just 'lu' for PRIu64, but we end up defining | |
23 | * __u64 as long long unsigned int, and then -Werror=format= kicks in and | |
24 | * complains of the mismatched types, so use these two special extra PRI | |
25 | * macros to overcome that. | |
26 | */ | |
27 | #define PRI_lu64 "l" PRIu64 | |
28 | #define PRI_lx64 "l" PRIx64 | |
fecb4100 | 29 | #define PRI_ld64 "l" PRId64 |
1345e2ee JO |
30 | #else |
31 | #define PRI_lu64 PRIu64 | |
32 | #define PRI_lx64 PRIx64 | |
fecb4100 | 33 | #define PRI_ld64 PRId64 |
1345e2ee | 34 | #endif |
1fe2c106 | 35 | |
a2854124 FW |
36 | #define PERF_SAMPLE_MASK \ |
37 | (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ | |
38 | PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \ | |
39 | PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \ | |
75562573 AH |
40 | PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD | \ |
41 | PERF_SAMPLE_IDENTIFIER) | |
a2854124 | 42 | |
a65cb4b9 JO |
43 | /* perf sample has 16 bits size limit */ |
44 | #define PERF_SAMPLE_MAX_SIZE (1 << 16) | |
45 | ||
0776eb59 JO |
46 | struct ip_callchain { |
47 | u64 nr; | |
6549a8c0 | 48 | u64 ips[]; |
0776eb59 JO |
49 | }; |
50 | ||
f1a397f3 | 51 | struct branch_stack; |
0776eb59 | 52 | |
00447ccd AH |
53 | enum { |
54 | PERF_IP_FLAG_BRANCH = 1ULL << 0, | |
55 | PERF_IP_FLAG_CALL = 1ULL << 1, | |
56 | PERF_IP_FLAG_RETURN = 1ULL << 2, | |
57 | PERF_IP_FLAG_CONDITIONAL = 1ULL << 3, | |
58 | PERF_IP_FLAG_SYSCALLRET = 1ULL << 4, | |
59 | PERF_IP_FLAG_ASYNC = 1ULL << 5, | |
60 | PERF_IP_FLAG_INTERRUPT = 1ULL << 6, | |
61 | PERF_IP_FLAG_TX_ABORT = 1ULL << 7, | |
62 | PERF_IP_FLAG_TRACE_BEGIN = 1ULL << 8, | |
63 | PERF_IP_FLAG_TRACE_END = 1ULL << 9, | |
64 | PERF_IP_FLAG_IN_TX = 1ULL << 10, | |
c025d46c AH |
65 | PERF_IP_FLAG_VMENTRY = 1ULL << 11, |
66 | PERF_IP_FLAG_VMEXIT = 1ULL << 12, | |
1d0dc1dd AH |
67 | PERF_IP_FLAG_INTR_DISABLE = 1ULL << 13, |
68 | PERF_IP_FLAG_INTR_TOGGLE = 1ULL << 14, | |
00447ccd AH |
69 | }; |
70 | ||
1d0dc1dd | 71 | #define PERF_IP_FLAG_CHARS "bcrosyiABExghDt" |
400ea6d3 | 72 | |
00447ccd AH |
73 | #define PERF_BRANCH_MASK (\ |
74 | PERF_IP_FLAG_BRANCH |\ | |
75 | PERF_IP_FLAG_CALL |\ | |
76 | PERF_IP_FLAG_RETURN |\ | |
77 | PERF_IP_FLAG_CONDITIONAL |\ | |
78 | PERF_IP_FLAG_SYSCALLRET |\ | |
79 | PERF_IP_FLAG_ASYNC |\ | |
80 | PERF_IP_FLAG_INTERRUPT |\ | |
81 | PERF_IP_FLAG_TX_ABORT |\ | |
82 | PERF_IP_FLAG_TRACE_BEGIN |\ | |
c025d46c AH |
83 | PERF_IP_FLAG_TRACE_END |\ |
84 | PERF_IP_FLAG_VMENTRY |\ | |
85 | PERF_IP_FLAG_VMEXIT) | |
00447ccd | 86 | |
98a3b32c SE |
87 | #define PERF_MEM_DATA_SRC_NONE \ |
88 | (PERF_MEM_S(OP, NA) |\ | |
89 | PERF_MEM_S(LVL, NA) |\ | |
90 | PERF_MEM_S(SNOOP, NA) |\ | |
91 | PERF_MEM_S(LOCK, NA) |\ | |
fd359ec8 RB |
92 | PERF_MEM_S(TLB, NA) |\ |
93 | PERF_MEM_S(LVLNUM, NA)) | |
98a3b32c | 94 | |
1405720d AH |
95 | /* Attribute type for custom synthesized events */ |
96 | #define PERF_TYPE_SYNTH (INT_MAX + 1U) | |
97 | ||
65c5e18f AH |
98 | /* Attribute config for custom synthesized events */ |
99 | enum perf_synth_id { | |
100 | PERF_SYNTH_INTEL_PTWRITE, | |
101 | PERF_SYNTH_INTEL_MWAIT, | |
102 | PERF_SYNTH_INTEL_PWRE, | |
103 | PERF_SYNTH_INTEL_EXSTOP, | |
104 | PERF_SYNTH_INTEL_PWRX, | |
105 | PERF_SYNTH_INTEL_CBR, | |
c840cbfe | 106 | PERF_SYNTH_INTEL_PSB, |
edb4d843 | 107 | PERF_SYNTH_INTEL_EVT, |
0d26ba8f | 108 | PERF_SYNTH_INTEL_IFLAG_CHG, |
65c5e18f AH |
109 | }; |
110 | ||
111 | /* | |
112 | * Raw data formats for synthesized events. Note that 4 bytes of padding are | |
113 | * present to match the 'size' member of PERF_SAMPLE_RAW data which is always | |
114 | * 8-byte aligned. That means we must dereference raw_data with an offset of 4. | |
115 | * Refer perf_sample__synth_ptr() and perf_synth__raw_data(). It also means the | |
116 | * structure sizes are 4 bytes bigger than the raw_size, refer | |
117 | * perf_synth__raw_size(). | |
118 | */ | |
119 | ||
120 | struct perf_synth_intel_ptwrite { | |
121 | u32 padding; | |
122 | union { | |
123 | struct { | |
124 | u32 ip : 1, | |
125 | reserved : 31; | |
126 | }; | |
127 | u32 flags; | |
128 | }; | |
129 | u64 payload; | |
130 | }; | |
131 | ||
132 | struct perf_synth_intel_mwait { | |
133 | u32 padding; | |
134 | u32 reserved; | |
135 | union { | |
136 | struct { | |
137 | u64 hints : 8, | |
138 | reserved1 : 24, | |
139 | extensions : 2, | |
140 | reserved2 : 30; | |
141 | }; | |
142 | u64 payload; | |
143 | }; | |
144 | }; | |
145 | ||
146 | struct perf_synth_intel_pwre { | |
147 | u32 padding; | |
148 | u32 reserved; | |
149 | union { | |
150 | struct { | |
151 | u64 reserved1 : 7, | |
152 | hw : 1, | |
153 | subcstate : 4, | |
154 | cstate : 4, | |
155 | reserved2 : 48; | |
156 | }; | |
157 | u64 payload; | |
158 | }; | |
159 | }; | |
160 | ||
161 | struct perf_synth_intel_exstop { | |
162 | u32 padding; | |
163 | union { | |
164 | struct { | |
165 | u32 ip : 1, | |
166 | reserved : 31; | |
167 | }; | |
168 | u32 flags; | |
169 | }; | |
170 | }; | |
171 | ||
172 | struct perf_synth_intel_pwrx { | |
173 | u32 padding; | |
174 | u32 reserved; | |
175 | union { | |
176 | struct { | |
177 | u64 deepest_cstate : 4, | |
178 | last_cstate : 4, | |
179 | wake_reason : 4, | |
180 | reserved1 : 52; | |
181 | }; | |
182 | u64 payload; | |
183 | }; | |
184 | }; | |
185 | ||
186 | struct perf_synth_intel_cbr { | |
187 | u32 padding; | |
188 | union { | |
189 | struct { | |
190 | u32 cbr : 8, | |
191 | reserved1 : 8, | |
192 | max_nonturbo : 8, | |
193 | reserved2 : 8; | |
194 | }; | |
195 | u32 flags; | |
196 | }; | |
197 | u32 freq; | |
198 | u32 reserved3; | |
199 | }; | |
200 | ||
c840cbfe AH |
201 | struct perf_synth_intel_psb { |
202 | u32 padding; | |
203 | u32 reserved; | |
204 | u64 offset; | |
205 | }; | |
206 | ||
edb4d843 AH |
207 | struct perf_synth_intel_evd { |
208 | union { | |
209 | struct { | |
210 | u8 evd_type; | |
211 | u8 reserved[7]; | |
212 | }; | |
213 | u64 et; | |
214 | }; | |
215 | u64 payload; | |
216 | }; | |
217 | ||
218 | /* Intel PT Event Trace */ | |
219 | struct perf_synth_intel_evt { | |
220 | u32 padding; | |
221 | union { | |
222 | struct { | |
223 | u32 type : 5, | |
224 | reserved : 2, | |
225 | ip : 1, | |
226 | vector : 8, | |
227 | evd_cnt : 16; | |
228 | }; | |
229 | u32 cfe; | |
230 | }; | |
ef3b2ba9 | 231 | struct perf_synth_intel_evd evd[0]; |
edb4d843 AH |
232 | }; |
233 | ||
0d26ba8f AH |
234 | struct perf_synth_intel_iflag_chg { |
235 | u32 padding; | |
236 | union { | |
237 | struct { | |
238 | u32 iflag : 1, | |
239 | via_branch : 1; | |
240 | }; | |
241 | u32 flags; | |
242 | }; | |
243 | u64 branch_ip; /* If via_branch */ | |
244 | }; | |
245 | ||
65c5e18f AH |
246 | static inline void *perf_synth__raw_data(void *p) |
247 | { | |
248 | return p + 4; | |
249 | } | |
250 | ||
251 | #define perf_synth__raw_size(d) (sizeof(d) - 4) | |
252 | ||
253 | #define perf_sample__bad_synth_size(s, d) ((s)->raw_size < sizeof(d) - 4) | |
254 | ||
2d8f0f18 JO |
255 | enum { |
256 | PERF_STAT_ROUND_TYPE__INTERVAL = 0, | |
257 | PERF_STAT_ROUND_TYPE__FINAL = 1, | |
258 | }; | |
259 | ||
8115d60c | 260 | void perf_event__print_totals(void); |
62daacb5 | 261 | |
f854839b | 262 | struct perf_cpu_map; |
ea49e01c | 263 | struct perf_record_stat_config; |
67424342 | 264 | struct perf_stat_config; |
ea49e01c | 265 | struct perf_tool; |
cf553114 | 266 | |
8e381596 | 267 | void perf_event__read_stat_config(struct perf_stat_config *config, |
72932371 | 268 | struct perf_record_stat_config *event); |
8115d60c | 269 | |
45694aa7 | 270 | int perf_event__process_comm(struct perf_tool *tool, |
d20deb64 ACM |
271 | union perf_event *event, |
272 | struct perf_sample *sample, | |
743eb868 | 273 | struct machine *machine); |
45694aa7 | 274 | int perf_event__process_lost(struct perf_tool *tool, |
d20deb64 ACM |
275 | union perf_event *event, |
276 | struct perf_sample *sample, | |
743eb868 | 277 | struct machine *machine); |
c4937a91 KL |
278 | int perf_event__process_lost_samples(struct perf_tool *tool, |
279 | union perf_event *event, | |
280 | struct perf_sample *sample, | |
281 | struct machine *machine); | |
4a96f7a0 AH |
282 | int perf_event__process_aux(struct perf_tool *tool, |
283 | union perf_event *event, | |
284 | struct perf_sample *sample, | |
285 | struct machine *machine); | |
0ad21f68 AH |
286 | int perf_event__process_itrace_start(struct perf_tool *tool, |
287 | union perf_event *event, | |
288 | struct perf_sample *sample, | |
289 | struct machine *machine); | |
61750473 AH |
290 | int perf_event__process_aux_output_hw_id(struct perf_tool *tool, |
291 | union perf_event *event, | |
292 | struct perf_sample *sample, | |
293 | struct machine *machine); | |
0286039f AH |
294 | int perf_event__process_switch(struct perf_tool *tool, |
295 | union perf_event *event, | |
296 | struct perf_sample *sample, | |
297 | struct machine *machine); | |
f3b3614a HB |
298 | int perf_event__process_namespaces(struct perf_tool *tool, |
299 | union perf_event *event, | |
300 | struct perf_sample *sample, | |
301 | struct machine *machine); | |
ba78c1c5 NK |
302 | int perf_event__process_cgroup(struct perf_tool *tool, |
303 | union perf_event *event, | |
304 | struct perf_sample *sample, | |
305 | struct machine *machine); | |
45694aa7 | 306 | int perf_event__process_mmap(struct perf_tool *tool, |
d20deb64 ACM |
307 | union perf_event *event, |
308 | struct perf_sample *sample, | |
743eb868 | 309 | struct machine *machine); |
5c5e854b SE |
310 | int perf_event__process_mmap2(struct perf_tool *tool, |
311 | union perf_event *event, | |
312 | struct perf_sample *sample, | |
313 | struct machine *machine); | |
f62d3f0f ACM |
314 | int perf_event__process_fork(struct perf_tool *tool, |
315 | union perf_event *event, | |
316 | struct perf_sample *sample, | |
317 | struct machine *machine); | |
318 | int perf_event__process_exit(struct perf_tool *tool, | |
d20deb64 ACM |
319 | union perf_event *event, |
320 | struct perf_sample *sample, | |
743eb868 | 321 | struct machine *machine); |
9aa0bfa3 SL |
322 | int perf_event__process_ksymbol(struct perf_tool *tool, |
323 | union perf_event *event, | |
324 | struct perf_sample *sample, | |
325 | struct machine *machine); | |
3f604b5f ACM |
326 | int perf_event__process_bpf(struct perf_tool *tool, |
327 | union perf_event *event, | |
328 | struct perf_sample *sample, | |
329 | struct machine *machine); | |
246eba8e AH |
330 | int perf_event__process_text_poke(struct perf_tool *tool, |
331 | union perf_event *event, | |
332 | struct perf_sample *sample, | |
333 | struct machine *machine); | |
45694aa7 | 334 | int perf_event__process(struct perf_tool *tool, |
d20deb64 ACM |
335 | union perf_event *event, |
336 | struct perf_sample *sample, | |
743eb868 | 337 | struct machine *machine); |
62daacb5 | 338 | |
9b0d2d87 AH |
339 | bool is_bts_event(struct perf_event_attr *attr); |
340 | bool sample_addr_correlates_sym(struct perf_event_attr *attr); | |
9b0d2d87 | 341 | |
8115d60c | 342 | const char *perf_event__name(unsigned int id); |
c8446b9b | 343 | |
482ad897 ACM |
344 | size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); |
345 | size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); | |
5c5e854b | 346 | size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); |
482ad897 | 347 | size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); |
4a96f7a0 | 348 | size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp); |
0ad21f68 | 349 | size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp); |
61750473 | 350 | size_t perf_event__fprintf_aux_output_hw_id(union perf_event *event, FILE *fp); |
0286039f | 351 | size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp); |
ec7fa596 | 352 | size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp); |
eb12a1af | 353 | size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp); |
f3b3614a | 354 | size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp); |
ba78c1c5 | 355 | size_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp); |
9aa0bfa3 | 356 | size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp); |
3f604b5f | 357 | size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp); |
7eeb9855 AH |
358 | size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine,FILE *fp); |
359 | size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp); | |
482ad897 | 360 | |
b843f62a ACM |
361 | int kallsyms__get_function_start(const char *kallsyms_filename, |
362 | const char *symbol_name, u64 *addr); | |
f9dd531c NK |
363 | int kallsyms__get_symbol_start(const char *kallsyms_filename, |
364 | const char *symbol_name, u64 *addr); | |
29b596b5 | 365 | |
5ab8c689 ACM |
366 | void event_attr_init(struct perf_event_attr *attr); |
367 | ||
368 | int perf_event_paranoid(void); | |
c22e150e | 369 | bool perf_event_paranoid_check(int max_level); |
5ab8c689 ACM |
370 | |
371 | extern int sysctl_perf_event_max_stack; | |
372 | extern int sysctl_perf_event_max_contexts_per_stack; | |
3fcb10e4 | 373 | extern unsigned int proc_map_timeout; |
5ab8c689 | 374 | |
6b9bae63 KL |
375 | #define PAGE_SIZE_NAME_LEN 32 |
376 | char *get_page_size_name(u64 size, char *str); | |
377 | ||
fbefe9c2 KL |
378 | void arch_perf_parse_sample_weight(struct perf_sample *data, const __u64 *array, u64 type); |
379 | void arch_perf_synthesize_sample_weight(const struct perf_sample *data, __u64 *array, u64 type); | |
0a606822 | 380 | const char *arch_perf_header_entry(const char *se_header); |
50fa3a53 | 381 | int arch_support_sort_key(const char *sort_key); |
fbefe9c2 | 382 | |
f9de2f0f AH |
383 | static inline bool perf_event_header__cpumode_is_guest(u8 cpumode) |
384 | { | |
385 | return cpumode == PERF_RECORD_MISC_GUEST_KERNEL || | |
386 | cpumode == PERF_RECORD_MISC_GUEST_USER; | |
387 | } | |
388 | ||
389 | static inline bool perf_event_header__misc_is_guest(u16 misc) | |
390 | { | |
391 | return perf_event_header__cpumode_is_guest(misc & PERF_RECORD_MISC_CPUMODE_MASK); | |
392 | } | |
393 | ||
394 | static inline bool perf_event_header__is_guest(const struct perf_event_header *header) | |
395 | { | |
396 | return perf_event_header__misc_is_guest(header->misc); | |
397 | } | |
398 | ||
399 | static inline bool perf_event__is_guest(const union perf_event *event) | |
400 | { | |
401 | return perf_event_header__is_guest(&event->header); | |
402 | } | |
403 | ||
8b40f521 | 404 | #endif /* __PERF_RECORD_H */ |