1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __PERF_RECORD_H
3*4882a593Smuzhiyun #define __PERF_RECORD_H
4*4882a593Smuzhiyun /*
5*4882a593Smuzhiyun * The linux/stddef.h isn't need here, but is needed for __always_inline used
6*4882a593Smuzhiyun * in files included from uapi/linux/perf_event.h such as
7*4882a593Smuzhiyun * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,
8*4882a593Smuzhiyun * detected in at least musl libc, used in Alpine Linux. -acme
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun #include <stdio.h>
11*4882a593Smuzhiyun #include <linux/stddef.h>
12*4882a593Smuzhiyun #include <perf/event.h>
13*4882a593Smuzhiyun #include <linux/types.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include "perf_regs.h"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun struct dso;
18*4882a593Smuzhiyun struct machine;
19*4882a593Smuzhiyun struct perf_event_attr;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #ifdef __LP64__
22*4882a593Smuzhiyun /*
23*4882a593Smuzhiyun * /usr/include/inttypes.h uses just 'lu' for PRIu64, but we end up defining
24*4882a593Smuzhiyun * __u64 as long long unsigned int, and then -Werror=format= kicks in and
25*4882a593Smuzhiyun * complains of the mismatched types, so use these two special extra PRI
26*4882a593Smuzhiyun * macros to overcome that.
27*4882a593Smuzhiyun */
28*4882a593Smuzhiyun #define PRI_lu64 "l" PRIu64
29*4882a593Smuzhiyun #define PRI_lx64 "l" PRIx64
30*4882a593Smuzhiyun #define PRI_ld64 "l" PRId64
31*4882a593Smuzhiyun #else
32*4882a593Smuzhiyun #define PRI_lu64 PRIu64
33*4882a593Smuzhiyun #define PRI_lx64 PRIx64
34*4882a593Smuzhiyun #define PRI_ld64 PRId64
35*4882a593Smuzhiyun #endif
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #define PERF_SAMPLE_MASK \
38*4882a593Smuzhiyun (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \
39*4882a593Smuzhiyun PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \
40*4882a593Smuzhiyun PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \
41*4882a593Smuzhiyun PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD | \
42*4882a593Smuzhiyun PERF_SAMPLE_IDENTIFIER)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* perf sample has 16 bits size limit */
45*4882a593Smuzhiyun #define PERF_SAMPLE_MAX_SIZE (1 << 16)
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun struct regs_dump {
48*4882a593Smuzhiyun u64 abi;
49*4882a593Smuzhiyun u64 mask;
50*4882a593Smuzhiyun u64 *regs;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /* Cached values/mask filled by first register access. */
53*4882a593Smuzhiyun u64 cache_regs[PERF_REGS_MAX];
54*4882a593Smuzhiyun u64 cache_mask;
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun struct stack_dump {
58*4882a593Smuzhiyun u16 offset;
59*4882a593Smuzhiyun u64 size;
60*4882a593Smuzhiyun char *data;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun struct sample_read_value {
64*4882a593Smuzhiyun u64 value;
65*4882a593Smuzhiyun u64 id;
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun struct sample_read {
69*4882a593Smuzhiyun u64 time_enabled;
70*4882a593Smuzhiyun u64 time_running;
71*4882a593Smuzhiyun union {
72*4882a593Smuzhiyun struct {
73*4882a593Smuzhiyun u64 nr;
74*4882a593Smuzhiyun struct sample_read_value *values;
75*4882a593Smuzhiyun } group;
76*4882a593Smuzhiyun struct sample_read_value one;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun struct ip_callchain {
81*4882a593Smuzhiyun u64 nr;
82*4882a593Smuzhiyun u64 ips[];
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun struct branch_stack;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun enum {
88*4882a593Smuzhiyun PERF_IP_FLAG_BRANCH = 1ULL << 0,
89*4882a593Smuzhiyun PERF_IP_FLAG_CALL = 1ULL << 1,
90*4882a593Smuzhiyun PERF_IP_FLAG_RETURN = 1ULL << 2,
91*4882a593Smuzhiyun PERF_IP_FLAG_CONDITIONAL = 1ULL << 3,
92*4882a593Smuzhiyun PERF_IP_FLAG_SYSCALLRET = 1ULL << 4,
93*4882a593Smuzhiyun PERF_IP_FLAG_ASYNC = 1ULL << 5,
94*4882a593Smuzhiyun PERF_IP_FLAG_INTERRUPT = 1ULL << 6,
95*4882a593Smuzhiyun PERF_IP_FLAG_TX_ABORT = 1ULL << 7,
96*4882a593Smuzhiyun PERF_IP_FLAG_TRACE_BEGIN = 1ULL << 8,
97*4882a593Smuzhiyun PERF_IP_FLAG_TRACE_END = 1ULL << 9,
98*4882a593Smuzhiyun PERF_IP_FLAG_IN_TX = 1ULL << 10,
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun #define PERF_IP_FLAG_CHARS "bcrosyiABEx"
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun #define PERF_BRANCH_MASK (\
104*4882a593Smuzhiyun PERF_IP_FLAG_BRANCH |\
105*4882a593Smuzhiyun PERF_IP_FLAG_CALL |\
106*4882a593Smuzhiyun PERF_IP_FLAG_RETURN |\
107*4882a593Smuzhiyun PERF_IP_FLAG_CONDITIONAL |\
108*4882a593Smuzhiyun PERF_IP_FLAG_SYSCALLRET |\
109*4882a593Smuzhiyun PERF_IP_FLAG_ASYNC |\
110*4882a593Smuzhiyun PERF_IP_FLAG_INTERRUPT |\
111*4882a593Smuzhiyun PERF_IP_FLAG_TX_ABORT |\
112*4882a593Smuzhiyun PERF_IP_FLAG_TRACE_BEGIN |\
113*4882a593Smuzhiyun PERF_IP_FLAG_TRACE_END)
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun #define MAX_INSN 16
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun struct aux_sample {
118*4882a593Smuzhiyun u64 size;
119*4882a593Smuzhiyun void *data;
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun struct perf_sample {
123*4882a593Smuzhiyun u64 ip;
124*4882a593Smuzhiyun u32 pid, tid;
125*4882a593Smuzhiyun u64 time;
126*4882a593Smuzhiyun u64 addr;
127*4882a593Smuzhiyun u64 id;
128*4882a593Smuzhiyun u64 stream_id;
129*4882a593Smuzhiyun u64 period;
130*4882a593Smuzhiyun u64 weight;
131*4882a593Smuzhiyun u64 transaction;
132*4882a593Smuzhiyun u64 insn_cnt;
133*4882a593Smuzhiyun u64 cyc_cnt;
134*4882a593Smuzhiyun u32 cpu;
135*4882a593Smuzhiyun u32 raw_size;
136*4882a593Smuzhiyun u64 data_src;
137*4882a593Smuzhiyun u64 phys_addr;
138*4882a593Smuzhiyun u64 cgroup;
139*4882a593Smuzhiyun u32 flags;
140*4882a593Smuzhiyun u16 insn_len;
141*4882a593Smuzhiyun u8 cpumode;
142*4882a593Smuzhiyun u16 misc;
143*4882a593Smuzhiyun bool no_hw_idx; /* No hw_idx collected in branch_stack */
144*4882a593Smuzhiyun char insn[MAX_INSN];
145*4882a593Smuzhiyun void *raw_data;
146*4882a593Smuzhiyun struct ip_callchain *callchain;
147*4882a593Smuzhiyun struct branch_stack *branch_stack;
148*4882a593Smuzhiyun struct regs_dump user_regs;
149*4882a593Smuzhiyun struct regs_dump intr_regs;
150*4882a593Smuzhiyun struct stack_dump user_stack;
151*4882a593Smuzhiyun struct sample_read read;
152*4882a593Smuzhiyun struct aux_sample aux_sample;
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun #define PERF_MEM_DATA_SRC_NONE \
156*4882a593Smuzhiyun (PERF_MEM_S(OP, NA) |\
157*4882a593Smuzhiyun PERF_MEM_S(LVL, NA) |\
158*4882a593Smuzhiyun PERF_MEM_S(SNOOP, NA) |\
159*4882a593Smuzhiyun PERF_MEM_S(LOCK, NA) |\
160*4882a593Smuzhiyun PERF_MEM_S(TLB, NA))
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /* Attribute type for custom synthesized events */
163*4882a593Smuzhiyun #define PERF_TYPE_SYNTH (INT_MAX + 1U)
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun /* Attribute config for custom synthesized events */
166*4882a593Smuzhiyun enum perf_synth_id {
167*4882a593Smuzhiyun PERF_SYNTH_INTEL_PTWRITE,
168*4882a593Smuzhiyun PERF_SYNTH_INTEL_MWAIT,
169*4882a593Smuzhiyun PERF_SYNTH_INTEL_PWRE,
170*4882a593Smuzhiyun PERF_SYNTH_INTEL_EXSTOP,
171*4882a593Smuzhiyun PERF_SYNTH_INTEL_PWRX,
172*4882a593Smuzhiyun PERF_SYNTH_INTEL_CBR,
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun /*
176*4882a593Smuzhiyun * Raw data formats for synthesized events. Note that 4 bytes of padding are
177*4882a593Smuzhiyun * present to match the 'size' member of PERF_SAMPLE_RAW data which is always
178*4882a593Smuzhiyun * 8-byte aligned. That means we must dereference raw_data with an offset of 4.
179*4882a593Smuzhiyun * Refer perf_sample__synth_ptr() and perf_synth__raw_data(). It also means the
180*4882a593Smuzhiyun * structure sizes are 4 bytes bigger than the raw_size, refer
181*4882a593Smuzhiyun * perf_synth__raw_size().
182*4882a593Smuzhiyun */
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun struct perf_synth_intel_ptwrite {
185*4882a593Smuzhiyun u32 padding;
186*4882a593Smuzhiyun union {
187*4882a593Smuzhiyun struct {
188*4882a593Smuzhiyun u32 ip : 1,
189*4882a593Smuzhiyun reserved : 31;
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun u32 flags;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun u64 payload;
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun struct perf_synth_intel_mwait {
197*4882a593Smuzhiyun u32 padding;
198*4882a593Smuzhiyun u32 reserved;
199*4882a593Smuzhiyun union {
200*4882a593Smuzhiyun struct {
201*4882a593Smuzhiyun u64 hints : 8,
202*4882a593Smuzhiyun reserved1 : 24,
203*4882a593Smuzhiyun extensions : 2,
204*4882a593Smuzhiyun reserved2 : 30;
205*4882a593Smuzhiyun };
206*4882a593Smuzhiyun u64 payload;
207*4882a593Smuzhiyun };
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun struct perf_synth_intel_pwre {
211*4882a593Smuzhiyun u32 padding;
212*4882a593Smuzhiyun u32 reserved;
213*4882a593Smuzhiyun union {
214*4882a593Smuzhiyun struct {
215*4882a593Smuzhiyun u64 reserved1 : 7,
216*4882a593Smuzhiyun hw : 1,
217*4882a593Smuzhiyun subcstate : 4,
218*4882a593Smuzhiyun cstate : 4,
219*4882a593Smuzhiyun reserved2 : 48;
220*4882a593Smuzhiyun };
221*4882a593Smuzhiyun u64 payload;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun struct perf_synth_intel_exstop {
226*4882a593Smuzhiyun u32 padding;
227*4882a593Smuzhiyun union {
228*4882a593Smuzhiyun struct {
229*4882a593Smuzhiyun u32 ip : 1,
230*4882a593Smuzhiyun reserved : 31;
231*4882a593Smuzhiyun };
232*4882a593Smuzhiyun u32 flags;
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun };
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun struct perf_synth_intel_pwrx {
237*4882a593Smuzhiyun u32 padding;
238*4882a593Smuzhiyun u32 reserved;
239*4882a593Smuzhiyun union {
240*4882a593Smuzhiyun struct {
241*4882a593Smuzhiyun u64 deepest_cstate : 4,
242*4882a593Smuzhiyun last_cstate : 4,
243*4882a593Smuzhiyun wake_reason : 4,
244*4882a593Smuzhiyun reserved1 : 52;
245*4882a593Smuzhiyun };
246*4882a593Smuzhiyun u64 payload;
247*4882a593Smuzhiyun };
248*4882a593Smuzhiyun };
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun struct perf_synth_intel_cbr {
251*4882a593Smuzhiyun u32 padding;
252*4882a593Smuzhiyun union {
253*4882a593Smuzhiyun struct {
254*4882a593Smuzhiyun u32 cbr : 8,
255*4882a593Smuzhiyun reserved1 : 8,
256*4882a593Smuzhiyun max_nonturbo : 8,
257*4882a593Smuzhiyun reserved2 : 8;
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun u32 flags;
260*4882a593Smuzhiyun };
261*4882a593Smuzhiyun u32 freq;
262*4882a593Smuzhiyun u32 reserved3;
263*4882a593Smuzhiyun };
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun /*
266*4882a593Smuzhiyun * raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get
267*4882a593Smuzhiyun * 8-byte alignment.
268*4882a593Smuzhiyun */
perf_sample__synth_ptr(struct perf_sample * sample)269*4882a593Smuzhiyun static inline void *perf_sample__synth_ptr(struct perf_sample *sample)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun return sample->raw_data - 4;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
perf_synth__raw_data(void * p)274*4882a593Smuzhiyun static inline void *perf_synth__raw_data(void *p)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun return p + 4;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun #define perf_synth__raw_size(d) (sizeof(d) - 4)
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun #define perf_sample__bad_synth_size(s, d) ((s)->raw_size < sizeof(d) - 4)
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun enum {
284*4882a593Smuzhiyun PERF_STAT_ROUND_TYPE__INTERVAL = 0,
285*4882a593Smuzhiyun PERF_STAT_ROUND_TYPE__FINAL = 1,
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun void perf_event__print_totals(void);
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun struct perf_cpu_map;
291*4882a593Smuzhiyun struct perf_record_stat_config;
292*4882a593Smuzhiyun struct perf_stat_config;
293*4882a593Smuzhiyun struct perf_tool;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun void perf_event__read_stat_config(struct perf_stat_config *config,
296*4882a593Smuzhiyun struct perf_record_stat_config *event);
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun int perf_event__process_comm(struct perf_tool *tool,
299*4882a593Smuzhiyun union perf_event *event,
300*4882a593Smuzhiyun struct perf_sample *sample,
301*4882a593Smuzhiyun struct machine *machine);
302*4882a593Smuzhiyun int perf_event__process_lost(struct perf_tool *tool,
303*4882a593Smuzhiyun union perf_event *event,
304*4882a593Smuzhiyun struct perf_sample *sample,
305*4882a593Smuzhiyun struct machine *machine);
306*4882a593Smuzhiyun int perf_event__process_lost_samples(struct perf_tool *tool,
307*4882a593Smuzhiyun union perf_event *event,
308*4882a593Smuzhiyun struct perf_sample *sample,
309*4882a593Smuzhiyun struct machine *machine);
310*4882a593Smuzhiyun int perf_event__process_aux(struct perf_tool *tool,
311*4882a593Smuzhiyun union perf_event *event,
312*4882a593Smuzhiyun struct perf_sample *sample,
313*4882a593Smuzhiyun struct machine *machine);
314*4882a593Smuzhiyun int perf_event__process_itrace_start(struct perf_tool *tool,
315*4882a593Smuzhiyun union perf_event *event,
316*4882a593Smuzhiyun struct perf_sample *sample,
317*4882a593Smuzhiyun struct machine *machine);
318*4882a593Smuzhiyun int perf_event__process_switch(struct perf_tool *tool,
319*4882a593Smuzhiyun union perf_event *event,
320*4882a593Smuzhiyun struct perf_sample *sample,
321*4882a593Smuzhiyun struct machine *machine);
322*4882a593Smuzhiyun int perf_event__process_namespaces(struct perf_tool *tool,
323*4882a593Smuzhiyun union perf_event *event,
324*4882a593Smuzhiyun struct perf_sample *sample,
325*4882a593Smuzhiyun struct machine *machine);
326*4882a593Smuzhiyun int perf_event__process_cgroup(struct perf_tool *tool,
327*4882a593Smuzhiyun union perf_event *event,
328*4882a593Smuzhiyun struct perf_sample *sample,
329*4882a593Smuzhiyun struct machine *machine);
330*4882a593Smuzhiyun int perf_event__process_mmap(struct perf_tool *tool,
331*4882a593Smuzhiyun union perf_event *event,
332*4882a593Smuzhiyun struct perf_sample *sample,
333*4882a593Smuzhiyun struct machine *machine);
334*4882a593Smuzhiyun int perf_event__process_mmap2(struct perf_tool *tool,
335*4882a593Smuzhiyun union perf_event *event,
336*4882a593Smuzhiyun struct perf_sample *sample,
337*4882a593Smuzhiyun struct machine *machine);
338*4882a593Smuzhiyun int perf_event__process_fork(struct perf_tool *tool,
339*4882a593Smuzhiyun union perf_event *event,
340*4882a593Smuzhiyun struct perf_sample *sample,
341*4882a593Smuzhiyun struct machine *machine);
342*4882a593Smuzhiyun int perf_event__process_exit(struct perf_tool *tool,
343*4882a593Smuzhiyun union perf_event *event,
344*4882a593Smuzhiyun struct perf_sample *sample,
345*4882a593Smuzhiyun struct machine *machine);
346*4882a593Smuzhiyun int perf_event__process_ksymbol(struct perf_tool *tool,
347*4882a593Smuzhiyun union perf_event *event,
348*4882a593Smuzhiyun struct perf_sample *sample,
349*4882a593Smuzhiyun struct machine *machine);
350*4882a593Smuzhiyun int perf_event__process_bpf(struct perf_tool *tool,
351*4882a593Smuzhiyun union perf_event *event,
352*4882a593Smuzhiyun struct perf_sample *sample,
353*4882a593Smuzhiyun struct machine *machine);
354*4882a593Smuzhiyun int perf_event__process_text_poke(struct perf_tool *tool,
355*4882a593Smuzhiyun union perf_event *event,
356*4882a593Smuzhiyun struct perf_sample *sample,
357*4882a593Smuzhiyun struct machine *machine);
358*4882a593Smuzhiyun int perf_event__process(struct perf_tool *tool,
359*4882a593Smuzhiyun union perf_event *event,
360*4882a593Smuzhiyun struct perf_sample *sample,
361*4882a593Smuzhiyun struct machine *machine);
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun struct addr_location;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun int machine__resolve(struct machine *machine, struct addr_location *al,
366*4882a593Smuzhiyun struct perf_sample *sample);
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun void addr_location__put(struct addr_location *al);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun struct thread;
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun bool is_bts_event(struct perf_event_attr *attr);
373*4882a593Smuzhiyun bool sample_addr_correlates_sym(struct perf_event_attr *attr);
374*4882a593Smuzhiyun void thread__resolve(struct thread *thread, struct addr_location *al,
375*4882a593Smuzhiyun struct perf_sample *sample);
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun const char *perf_event__name(unsigned int id);
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
380*4882a593Smuzhiyun size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
381*4882a593Smuzhiyun size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
382*4882a593Smuzhiyun size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
383*4882a593Smuzhiyun size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp);
384*4882a593Smuzhiyun size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp);
385*4882a593Smuzhiyun size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp);
386*4882a593Smuzhiyun size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp);
387*4882a593Smuzhiyun size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp);
388*4882a593Smuzhiyun size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
389*4882a593Smuzhiyun size_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp);
390*4882a593Smuzhiyun size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp);
391*4882a593Smuzhiyun size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp);
392*4882a593Smuzhiyun size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine,FILE *fp);
393*4882a593Smuzhiyun size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp);
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun int kallsyms__get_function_start(const char *kallsyms_filename,
396*4882a593Smuzhiyun const char *symbol_name, u64 *addr);
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun void *cpu_map_data__alloc(struct perf_cpu_map *map, size_t *size, u16 *type, int *max);
399*4882a593Smuzhiyun void cpu_map_data__synthesize(struct perf_record_cpu_map_data *data, struct perf_cpu_map *map,
400*4882a593Smuzhiyun u16 type, int max);
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun void event_attr_init(struct perf_event_attr *attr);
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun int perf_event_paranoid(void);
405*4882a593Smuzhiyun bool perf_event_paranoid_check(int max_level);
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun extern int sysctl_perf_event_max_stack;
408*4882a593Smuzhiyun extern int sysctl_perf_event_max_contexts_per_stack;
409*4882a593Smuzhiyun extern unsigned int proc_map_timeout;
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun #endif /* __PERF_RECORD_H */
412