162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __PERF_RECORD_H
362306a36Sopenharmony_ci#define __PERF_RECORD_H
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * The linux/stddef.h isn't need here, but is needed for __always_inline used
662306a36Sopenharmony_ci * in files included from uapi/linux/perf_event.h such as
762306a36Sopenharmony_ci * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,
862306a36Sopenharmony_ci * detected in at least musl libc, used in Alpine Linux. -acme
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#include <stdio.h>
1162306a36Sopenharmony_ci#include <linux/stddef.h>
1262306a36Sopenharmony_ci#include <perf/event.h>
1362306a36Sopenharmony_ci#include <linux/types.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct dso;
1662306a36Sopenharmony_cistruct machine;
1762306a36Sopenharmony_cistruct perf_event_attr;
1862306a36Sopenharmony_cistruct perf_sample;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#ifdef __LP64__
2162306a36Sopenharmony_ci/*
2262306a36Sopenharmony_ci * /usr/include/inttypes.h uses just 'lu' for PRIu64, but we end up defining
2362306a36Sopenharmony_ci * __u64 as long long unsigned int, and then -Werror=format= kicks in and
2462306a36Sopenharmony_ci * complains of the mismatched types, so use these two special extra PRI
2562306a36Sopenharmony_ci * macros to overcome that.
2662306a36Sopenharmony_ci */
2762306a36Sopenharmony_ci#define PRI_lu64 "l" PRIu64
2862306a36Sopenharmony_ci#define PRI_lx64 "l" PRIx64
2962306a36Sopenharmony_ci#define PRI_ld64 "l" PRId64
3062306a36Sopenharmony_ci#else
3162306a36Sopenharmony_ci#define PRI_lu64 PRIu64
3262306a36Sopenharmony_ci#define PRI_lx64 PRIx64
3362306a36Sopenharmony_ci#define PRI_ld64 PRId64
3462306a36Sopenharmony_ci#endif
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define PERF_SAMPLE_MASK				\
3762306a36Sopenharmony_ci	(PERF_SAMPLE_IP | PERF_SAMPLE_TID |		\
3862306a36Sopenharmony_ci	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |		\
3962306a36Sopenharmony_ci	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
4062306a36Sopenharmony_ci	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |		\
4162306a36Sopenharmony_ci	 PERF_SAMPLE_IDENTIFIER)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* perf sample has 16 bits size limit */
4462306a36Sopenharmony_ci#define PERF_SAMPLE_MAX_SIZE (1 << 16)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistruct ip_callchain {
4762306a36Sopenharmony_ci	u64 nr;
4862306a36Sopenharmony_ci	u64 ips[];
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct branch_stack;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cienum {
5462306a36Sopenharmony_ci	PERF_IP_FLAG_BRANCH		= 1ULL << 0,
5562306a36Sopenharmony_ci	PERF_IP_FLAG_CALL		= 1ULL << 1,
5662306a36Sopenharmony_ci	PERF_IP_FLAG_RETURN		= 1ULL << 2,
5762306a36Sopenharmony_ci	PERF_IP_FLAG_CONDITIONAL	= 1ULL << 3,
5862306a36Sopenharmony_ci	PERF_IP_FLAG_SYSCALLRET		= 1ULL << 4,
5962306a36Sopenharmony_ci	PERF_IP_FLAG_ASYNC		= 1ULL << 5,
6062306a36Sopenharmony_ci	PERF_IP_FLAG_INTERRUPT		= 1ULL << 6,
6162306a36Sopenharmony_ci	PERF_IP_FLAG_TX_ABORT		= 1ULL << 7,
6262306a36Sopenharmony_ci	PERF_IP_FLAG_TRACE_BEGIN	= 1ULL << 8,
6362306a36Sopenharmony_ci	PERF_IP_FLAG_TRACE_END		= 1ULL << 9,
6462306a36Sopenharmony_ci	PERF_IP_FLAG_IN_TX		= 1ULL << 10,
6562306a36Sopenharmony_ci	PERF_IP_FLAG_VMENTRY		= 1ULL << 11,
6662306a36Sopenharmony_ci	PERF_IP_FLAG_VMEXIT		= 1ULL << 12,
6762306a36Sopenharmony_ci	PERF_IP_FLAG_INTR_DISABLE	= 1ULL << 13,
6862306a36Sopenharmony_ci	PERF_IP_FLAG_INTR_TOGGLE	= 1ULL << 14,
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#define PERF_IP_FLAG_CHARS "bcrosyiABExghDt"
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define PERF_BRANCH_MASK		(\
7462306a36Sopenharmony_ci	PERF_IP_FLAG_BRANCH		|\
7562306a36Sopenharmony_ci	PERF_IP_FLAG_CALL		|\
7662306a36Sopenharmony_ci	PERF_IP_FLAG_RETURN		|\
7762306a36Sopenharmony_ci	PERF_IP_FLAG_CONDITIONAL	|\
7862306a36Sopenharmony_ci	PERF_IP_FLAG_SYSCALLRET		|\
7962306a36Sopenharmony_ci	PERF_IP_FLAG_ASYNC		|\
8062306a36Sopenharmony_ci	PERF_IP_FLAG_INTERRUPT		|\
8162306a36Sopenharmony_ci	PERF_IP_FLAG_TX_ABORT		|\
8262306a36Sopenharmony_ci	PERF_IP_FLAG_TRACE_BEGIN	|\
8362306a36Sopenharmony_ci	PERF_IP_FLAG_TRACE_END		|\
8462306a36Sopenharmony_ci	PERF_IP_FLAG_VMENTRY		|\
8562306a36Sopenharmony_ci	PERF_IP_FLAG_VMEXIT)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define PERF_MEM_DATA_SRC_NONE \
8862306a36Sopenharmony_ci	(PERF_MEM_S(OP, NA) |\
8962306a36Sopenharmony_ci	 PERF_MEM_S(LVL, NA) |\
9062306a36Sopenharmony_ci	 PERF_MEM_S(SNOOP, NA) |\
9162306a36Sopenharmony_ci	 PERF_MEM_S(LOCK, NA) |\
9262306a36Sopenharmony_ci	 PERF_MEM_S(TLB, NA) |\
9362306a36Sopenharmony_ci	 PERF_MEM_S(LVLNUM, NA))
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/* Attribute type for custom synthesized events */
9662306a36Sopenharmony_ci#define PERF_TYPE_SYNTH		(INT_MAX + 1U)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/* Attribute config for custom synthesized events */
9962306a36Sopenharmony_cienum perf_synth_id {
10062306a36Sopenharmony_ci	PERF_SYNTH_INTEL_PTWRITE,
10162306a36Sopenharmony_ci	PERF_SYNTH_INTEL_MWAIT,
10262306a36Sopenharmony_ci	PERF_SYNTH_INTEL_PWRE,
10362306a36Sopenharmony_ci	PERF_SYNTH_INTEL_EXSTOP,
10462306a36Sopenharmony_ci	PERF_SYNTH_INTEL_PWRX,
10562306a36Sopenharmony_ci	PERF_SYNTH_INTEL_CBR,
10662306a36Sopenharmony_ci	PERF_SYNTH_INTEL_PSB,
10762306a36Sopenharmony_ci	PERF_SYNTH_INTEL_EVT,
10862306a36Sopenharmony_ci	PERF_SYNTH_INTEL_IFLAG_CHG,
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci/*
11262306a36Sopenharmony_ci * Raw data formats for synthesized events. Note that 4 bytes of padding are
11362306a36Sopenharmony_ci * present to match the 'size' member of PERF_SAMPLE_RAW data which is always
11462306a36Sopenharmony_ci * 8-byte aligned. That means we must dereference raw_data with an offset of 4.
11562306a36Sopenharmony_ci * Refer perf_sample__synth_ptr() and perf_synth__raw_data().  It also means the
11662306a36Sopenharmony_ci * structure sizes are 4 bytes bigger than the raw_size, refer
11762306a36Sopenharmony_ci * perf_synth__raw_size().
11862306a36Sopenharmony_ci */
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct perf_synth_intel_ptwrite {
12162306a36Sopenharmony_ci	u32 padding;
12262306a36Sopenharmony_ci	union {
12362306a36Sopenharmony_ci		struct {
12462306a36Sopenharmony_ci			u32	ip		:  1,
12562306a36Sopenharmony_ci				reserved	: 31;
12662306a36Sopenharmony_ci		};
12762306a36Sopenharmony_ci		u32	flags;
12862306a36Sopenharmony_ci	};
12962306a36Sopenharmony_ci	u64	payload;
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistruct perf_synth_intel_mwait {
13362306a36Sopenharmony_ci	u32 padding;
13462306a36Sopenharmony_ci	u32 reserved;
13562306a36Sopenharmony_ci	union {
13662306a36Sopenharmony_ci		struct {
13762306a36Sopenharmony_ci			u64	hints		:  8,
13862306a36Sopenharmony_ci				reserved1	: 24,
13962306a36Sopenharmony_ci				extensions	:  2,
14062306a36Sopenharmony_ci				reserved2	: 30;
14162306a36Sopenharmony_ci		};
14262306a36Sopenharmony_ci		u64	payload;
14362306a36Sopenharmony_ci	};
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistruct perf_synth_intel_pwre {
14762306a36Sopenharmony_ci	u32 padding;
14862306a36Sopenharmony_ci	u32 reserved;
14962306a36Sopenharmony_ci	union {
15062306a36Sopenharmony_ci		struct {
15162306a36Sopenharmony_ci			u64	reserved1	:  7,
15262306a36Sopenharmony_ci				hw		:  1,
15362306a36Sopenharmony_ci				subcstate	:  4,
15462306a36Sopenharmony_ci				cstate		:  4,
15562306a36Sopenharmony_ci				reserved2	: 48;
15662306a36Sopenharmony_ci		};
15762306a36Sopenharmony_ci		u64	payload;
15862306a36Sopenharmony_ci	};
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistruct perf_synth_intel_exstop {
16262306a36Sopenharmony_ci	u32 padding;
16362306a36Sopenharmony_ci	union {
16462306a36Sopenharmony_ci		struct {
16562306a36Sopenharmony_ci			u32	ip		:  1,
16662306a36Sopenharmony_ci				reserved	: 31;
16762306a36Sopenharmony_ci		};
16862306a36Sopenharmony_ci		u32	flags;
16962306a36Sopenharmony_ci	};
17062306a36Sopenharmony_ci};
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cistruct perf_synth_intel_pwrx {
17362306a36Sopenharmony_ci	u32 padding;
17462306a36Sopenharmony_ci	u32 reserved;
17562306a36Sopenharmony_ci	union {
17662306a36Sopenharmony_ci		struct {
17762306a36Sopenharmony_ci			u64	deepest_cstate	:  4,
17862306a36Sopenharmony_ci				last_cstate	:  4,
17962306a36Sopenharmony_ci				wake_reason	:  4,
18062306a36Sopenharmony_ci				reserved1	: 52;
18162306a36Sopenharmony_ci		};
18262306a36Sopenharmony_ci		u64	payload;
18362306a36Sopenharmony_ci	};
18462306a36Sopenharmony_ci};
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_cistruct perf_synth_intel_cbr {
18762306a36Sopenharmony_ci	u32 padding;
18862306a36Sopenharmony_ci	union {
18962306a36Sopenharmony_ci		struct {
19062306a36Sopenharmony_ci			u32	cbr		:  8,
19162306a36Sopenharmony_ci				reserved1	:  8,
19262306a36Sopenharmony_ci				max_nonturbo	:  8,
19362306a36Sopenharmony_ci				reserved2	:  8;
19462306a36Sopenharmony_ci		};
19562306a36Sopenharmony_ci		u32	flags;
19662306a36Sopenharmony_ci	};
19762306a36Sopenharmony_ci	u32 freq;
19862306a36Sopenharmony_ci	u32 reserved3;
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistruct perf_synth_intel_psb {
20262306a36Sopenharmony_ci	u32 padding;
20362306a36Sopenharmony_ci	u32 reserved;
20462306a36Sopenharmony_ci	u64 offset;
20562306a36Sopenharmony_ci};
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistruct perf_synth_intel_evd {
20862306a36Sopenharmony_ci	union {
20962306a36Sopenharmony_ci		struct {
21062306a36Sopenharmony_ci			u8	evd_type;
21162306a36Sopenharmony_ci			u8	reserved[7];
21262306a36Sopenharmony_ci		};
21362306a36Sopenharmony_ci		u64	et;
21462306a36Sopenharmony_ci	};
21562306a36Sopenharmony_ci	u64	payload;
21662306a36Sopenharmony_ci};
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci/* Intel PT Event Trace */
21962306a36Sopenharmony_cistruct perf_synth_intel_evt {
22062306a36Sopenharmony_ci	u32 padding;
22162306a36Sopenharmony_ci	union {
22262306a36Sopenharmony_ci		struct {
22362306a36Sopenharmony_ci			u32	type		:  5,
22462306a36Sopenharmony_ci				reserved	:  2,
22562306a36Sopenharmony_ci				ip		:  1,
22662306a36Sopenharmony_ci				vector		:  8,
22762306a36Sopenharmony_ci				evd_cnt		: 16;
22862306a36Sopenharmony_ci		};
22962306a36Sopenharmony_ci		u32	cfe;
23062306a36Sopenharmony_ci	};
23162306a36Sopenharmony_ci	struct perf_synth_intel_evd evd[0];
23262306a36Sopenharmony_ci};
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cistruct perf_synth_intel_iflag_chg {
23562306a36Sopenharmony_ci	u32 padding;
23662306a36Sopenharmony_ci	union {
23762306a36Sopenharmony_ci		struct {
23862306a36Sopenharmony_ci			u32	iflag		:  1,
23962306a36Sopenharmony_ci				via_branch	:  1;
24062306a36Sopenharmony_ci		};
24162306a36Sopenharmony_ci		u32	flags;
24262306a36Sopenharmony_ci	};
24362306a36Sopenharmony_ci	u64	branch_ip; /* If via_branch */
24462306a36Sopenharmony_ci};
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_cistatic inline void *perf_synth__raw_data(void *p)
24762306a36Sopenharmony_ci{
24862306a36Sopenharmony_ci	return p + 4;
24962306a36Sopenharmony_ci}
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci#define perf_synth__raw_size(d) (sizeof(d) - 4)
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci#define perf_sample__bad_synth_size(s, d) ((s)->raw_size < sizeof(d) - 4)
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_cienum {
25662306a36Sopenharmony_ci	PERF_STAT_ROUND_TYPE__INTERVAL	= 0,
25762306a36Sopenharmony_ci	PERF_STAT_ROUND_TYPE__FINAL	= 1,
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_civoid perf_event__print_totals(void);
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_cistruct perf_cpu_map;
26362306a36Sopenharmony_cistruct perf_record_stat_config;
26462306a36Sopenharmony_cistruct perf_stat_config;
26562306a36Sopenharmony_cistruct perf_tool;
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_civoid perf_event__read_stat_config(struct perf_stat_config *config,
26862306a36Sopenharmony_ci				  struct perf_record_stat_config *event);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ciint perf_event__process_comm(struct perf_tool *tool,
27162306a36Sopenharmony_ci			     union perf_event *event,
27262306a36Sopenharmony_ci			     struct perf_sample *sample,
27362306a36Sopenharmony_ci			     struct machine *machine);
27462306a36Sopenharmony_ciint perf_event__process_lost(struct perf_tool *tool,
27562306a36Sopenharmony_ci			     union perf_event *event,
27662306a36Sopenharmony_ci			     struct perf_sample *sample,
27762306a36Sopenharmony_ci			     struct machine *machine);
27862306a36Sopenharmony_ciint perf_event__process_lost_samples(struct perf_tool *tool,
27962306a36Sopenharmony_ci				     union perf_event *event,
28062306a36Sopenharmony_ci				     struct perf_sample *sample,
28162306a36Sopenharmony_ci				     struct machine *machine);
28262306a36Sopenharmony_ciint perf_event__process_aux(struct perf_tool *tool,
28362306a36Sopenharmony_ci			    union perf_event *event,
28462306a36Sopenharmony_ci			    struct perf_sample *sample,
28562306a36Sopenharmony_ci			    struct machine *machine);
28662306a36Sopenharmony_ciint perf_event__process_itrace_start(struct perf_tool *tool,
28762306a36Sopenharmony_ci				     union perf_event *event,
28862306a36Sopenharmony_ci				     struct perf_sample *sample,
28962306a36Sopenharmony_ci				     struct machine *machine);
29062306a36Sopenharmony_ciint perf_event__process_aux_output_hw_id(struct perf_tool *tool,
29162306a36Sopenharmony_ci					 union perf_event *event,
29262306a36Sopenharmony_ci					 struct perf_sample *sample,
29362306a36Sopenharmony_ci					 struct machine *machine);
29462306a36Sopenharmony_ciint perf_event__process_switch(struct perf_tool *tool,
29562306a36Sopenharmony_ci			       union perf_event *event,
29662306a36Sopenharmony_ci			       struct perf_sample *sample,
29762306a36Sopenharmony_ci			       struct machine *machine);
29862306a36Sopenharmony_ciint perf_event__process_namespaces(struct perf_tool *tool,
29962306a36Sopenharmony_ci				   union perf_event *event,
30062306a36Sopenharmony_ci				   struct perf_sample *sample,
30162306a36Sopenharmony_ci				   struct machine *machine);
30262306a36Sopenharmony_ciint perf_event__process_cgroup(struct perf_tool *tool,
30362306a36Sopenharmony_ci			       union perf_event *event,
30462306a36Sopenharmony_ci			       struct perf_sample *sample,
30562306a36Sopenharmony_ci			       struct machine *machine);
30662306a36Sopenharmony_ciint perf_event__process_mmap(struct perf_tool *tool,
30762306a36Sopenharmony_ci			     union perf_event *event,
30862306a36Sopenharmony_ci			     struct perf_sample *sample,
30962306a36Sopenharmony_ci			     struct machine *machine);
31062306a36Sopenharmony_ciint perf_event__process_mmap2(struct perf_tool *tool,
31162306a36Sopenharmony_ci			     union perf_event *event,
31262306a36Sopenharmony_ci			     struct perf_sample *sample,
31362306a36Sopenharmony_ci			     struct machine *machine);
31462306a36Sopenharmony_ciint perf_event__process_fork(struct perf_tool *tool,
31562306a36Sopenharmony_ci			     union perf_event *event,
31662306a36Sopenharmony_ci			     struct perf_sample *sample,
31762306a36Sopenharmony_ci			     struct machine *machine);
31862306a36Sopenharmony_ciint perf_event__process_exit(struct perf_tool *tool,
31962306a36Sopenharmony_ci			     union perf_event *event,
32062306a36Sopenharmony_ci			     struct perf_sample *sample,
32162306a36Sopenharmony_ci			     struct machine *machine);
32262306a36Sopenharmony_ciint perf_event__process_ksymbol(struct perf_tool *tool,
32362306a36Sopenharmony_ci				union perf_event *event,
32462306a36Sopenharmony_ci				struct perf_sample *sample,
32562306a36Sopenharmony_ci				struct machine *machine);
32662306a36Sopenharmony_ciint perf_event__process_bpf(struct perf_tool *tool,
32762306a36Sopenharmony_ci			    union perf_event *event,
32862306a36Sopenharmony_ci			    struct perf_sample *sample,
32962306a36Sopenharmony_ci			    struct machine *machine);
33062306a36Sopenharmony_ciint perf_event__process_text_poke(struct perf_tool *tool,
33162306a36Sopenharmony_ci				  union perf_event *event,
33262306a36Sopenharmony_ci				  struct perf_sample *sample,
33362306a36Sopenharmony_ci				  struct machine *machine);
33462306a36Sopenharmony_ciint perf_event__process(struct perf_tool *tool,
33562306a36Sopenharmony_ci			union perf_event *event,
33662306a36Sopenharmony_ci			struct perf_sample *sample,
33762306a36Sopenharmony_ci			struct machine *machine);
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cibool is_bts_event(struct perf_event_attr *attr);
34062306a36Sopenharmony_cibool sample_addr_correlates_sym(struct perf_event_attr *attr);
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ciconst char *perf_event__name(unsigned int id);
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_cisize_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
34562306a36Sopenharmony_cisize_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
34662306a36Sopenharmony_cisize_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
34762306a36Sopenharmony_cisize_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
34862306a36Sopenharmony_cisize_t perf_event__fprintf_aux(union perf_event *event, FILE *fp);
34962306a36Sopenharmony_cisize_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp);
35062306a36Sopenharmony_cisize_t perf_event__fprintf_aux_output_hw_id(union perf_event *event, FILE *fp);
35162306a36Sopenharmony_cisize_t perf_event__fprintf_switch(union perf_event *event, FILE *fp);
35262306a36Sopenharmony_cisize_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp);
35362306a36Sopenharmony_cisize_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp);
35462306a36Sopenharmony_cisize_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
35562306a36Sopenharmony_cisize_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp);
35662306a36Sopenharmony_cisize_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp);
35762306a36Sopenharmony_cisize_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp);
35862306a36Sopenharmony_cisize_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine,FILE *fp);
35962306a36Sopenharmony_cisize_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp);
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ciint kallsyms__get_function_start(const char *kallsyms_filename,
36262306a36Sopenharmony_ci				 const char *symbol_name, u64 *addr);
36362306a36Sopenharmony_ciint kallsyms__get_symbol_start(const char *kallsyms_filename,
36462306a36Sopenharmony_ci			       const char *symbol_name, u64 *addr);
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_civoid event_attr_init(struct perf_event_attr *attr);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ciint perf_event_paranoid(void);
36962306a36Sopenharmony_cibool perf_event_paranoid_check(int max_level);
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ciextern int sysctl_perf_event_max_stack;
37262306a36Sopenharmony_ciextern int sysctl_perf_event_max_contexts_per_stack;
37362306a36Sopenharmony_ciextern unsigned int proc_map_timeout;
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci#define PAGE_SIZE_NAME_LEN	32
37662306a36Sopenharmony_cichar *get_page_size_name(u64 size, char *str);
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_civoid arch_perf_parse_sample_weight(struct perf_sample *data, const __u64 *array, u64 type);
37962306a36Sopenharmony_civoid arch_perf_synthesize_sample_weight(const struct perf_sample *data, __u64 *array, u64 type);
38062306a36Sopenharmony_ciconst char *arch_perf_header_entry(const char *se_header);
38162306a36Sopenharmony_ciint arch_support_sort_key(const char *sort_key);
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_cistatic inline bool perf_event_header__cpumode_is_guest(u8 cpumode)
38462306a36Sopenharmony_ci{
38562306a36Sopenharmony_ci	return cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
38662306a36Sopenharmony_ci	       cpumode == PERF_RECORD_MISC_GUEST_USER;
38762306a36Sopenharmony_ci}
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_cistatic inline bool perf_event_header__misc_is_guest(u16 misc)
39062306a36Sopenharmony_ci{
39162306a36Sopenharmony_ci	return perf_event_header__cpumode_is_guest(misc & PERF_RECORD_MISC_CPUMODE_MASK);
39262306a36Sopenharmony_ci}
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_cistatic inline bool perf_event_header__is_guest(const struct perf_event_header *header)
39562306a36Sopenharmony_ci{
39662306a36Sopenharmony_ci	return perf_event_header__misc_is_guest(header->misc);
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistatic inline bool perf_event__is_guest(const union perf_event *event)
40062306a36Sopenharmony_ci{
40162306a36Sopenharmony_ci	return perf_event_header__is_guest(&event->header);
40262306a36Sopenharmony_ci}
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci#endif /* __PERF_RECORD_H */
405