xref: /OK3568_Linux_fs/kernel/tools/perf/util/header.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __PERF_HEADER_H
3*4882a593Smuzhiyun #define __PERF_HEADER_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/stddef.h>
6*4882a593Smuzhiyun #include <linux/perf_event.h>
7*4882a593Smuzhiyun #include <sys/types.h>
8*4882a593Smuzhiyun #include <stdio.h> // FILE
9*4882a593Smuzhiyun #include <stdbool.h>
10*4882a593Smuzhiyun #include <linux/bitmap.h>
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun #include "env.h"
13*4882a593Smuzhiyun #include "pmu.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun enum {
16*4882a593Smuzhiyun 	HEADER_RESERVED		= 0,	/* always cleared */
17*4882a593Smuzhiyun 	HEADER_FIRST_FEATURE	= 1,
18*4882a593Smuzhiyun 	HEADER_TRACING_DATA	= 1,
19*4882a593Smuzhiyun 	HEADER_BUILD_ID,
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun 	HEADER_HOSTNAME,
22*4882a593Smuzhiyun 	HEADER_OSRELEASE,
23*4882a593Smuzhiyun 	HEADER_VERSION,
24*4882a593Smuzhiyun 	HEADER_ARCH,
25*4882a593Smuzhiyun 	HEADER_NRCPUS,
26*4882a593Smuzhiyun 	HEADER_CPUDESC,
27*4882a593Smuzhiyun 	HEADER_CPUID,
28*4882a593Smuzhiyun 	HEADER_TOTAL_MEM,
29*4882a593Smuzhiyun 	HEADER_CMDLINE,
30*4882a593Smuzhiyun 	HEADER_EVENT_DESC,
31*4882a593Smuzhiyun 	HEADER_CPU_TOPOLOGY,
32*4882a593Smuzhiyun 	HEADER_NUMA_TOPOLOGY,
33*4882a593Smuzhiyun 	HEADER_BRANCH_STACK,
34*4882a593Smuzhiyun 	HEADER_PMU_MAPPINGS,
35*4882a593Smuzhiyun 	HEADER_GROUP_DESC,
36*4882a593Smuzhiyun 	HEADER_AUXTRACE,
37*4882a593Smuzhiyun 	HEADER_STAT,
38*4882a593Smuzhiyun 	HEADER_CACHE,
39*4882a593Smuzhiyun 	HEADER_SAMPLE_TIME,
40*4882a593Smuzhiyun 	HEADER_MEM_TOPOLOGY,
41*4882a593Smuzhiyun 	HEADER_CLOCKID,
42*4882a593Smuzhiyun 	HEADER_DIR_FORMAT,
43*4882a593Smuzhiyun 	HEADER_BPF_PROG_INFO,
44*4882a593Smuzhiyun 	HEADER_BPF_BTF,
45*4882a593Smuzhiyun 	HEADER_COMPRESSED,
46*4882a593Smuzhiyun 	HEADER_CPU_PMU_CAPS,
47*4882a593Smuzhiyun 	HEADER_CLOCK_DATA,
48*4882a593Smuzhiyun 	HEADER_LAST_FEATURE,
49*4882a593Smuzhiyun 	HEADER_FEAT_BITS	= 256,
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun enum perf_header_version {
53*4882a593Smuzhiyun 	PERF_HEADER_VERSION_1,
54*4882a593Smuzhiyun 	PERF_HEADER_VERSION_2,
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun struct perf_file_section {
58*4882a593Smuzhiyun 	u64 offset;
59*4882a593Smuzhiyun 	u64 size;
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun struct perf_file_header {
63*4882a593Smuzhiyun 	u64				magic;
64*4882a593Smuzhiyun 	u64				size;
65*4882a593Smuzhiyun 	u64				attr_size;
66*4882a593Smuzhiyun 	struct perf_file_section	attrs;
67*4882a593Smuzhiyun 	struct perf_file_section	data;
68*4882a593Smuzhiyun 	/* event_types is ignored */
69*4882a593Smuzhiyun 	struct perf_file_section	event_types;
70*4882a593Smuzhiyun 	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun struct perf_pipe_file_header {
74*4882a593Smuzhiyun 	u64				magic;
75*4882a593Smuzhiyun 	u64				size;
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun struct perf_header;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun int perf_file_header__read(struct perf_file_header *header,
81*4882a593Smuzhiyun 			   struct perf_header *ph, int fd);
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun struct perf_header {
84*4882a593Smuzhiyun 	enum perf_header_version	version;
85*4882a593Smuzhiyun 	bool				needs_swap;
86*4882a593Smuzhiyun 	u64				data_offset;
87*4882a593Smuzhiyun 	u64				data_size;
88*4882a593Smuzhiyun 	u64				feat_offset;
89*4882a593Smuzhiyun 	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
90*4882a593Smuzhiyun 	struct perf_env 	env;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun struct feat_fd {
94*4882a593Smuzhiyun 	struct perf_header *ph;
95*4882a593Smuzhiyun 	int		   fd;
96*4882a593Smuzhiyun 	void		   *buf;	/* Either buf != NULL or fd >= 0 */
97*4882a593Smuzhiyun 	ssize_t		   offset;
98*4882a593Smuzhiyun 	size_t		   size;
99*4882a593Smuzhiyun 	struct evsel	   *events;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct perf_header_feature_ops {
103*4882a593Smuzhiyun 	int	   (*write)(struct feat_fd *ff, struct evlist *evlist);
104*4882a593Smuzhiyun 	void	   (*print)(struct feat_fd *ff, FILE *fp);
105*4882a593Smuzhiyun 	int	   (*process)(struct feat_fd *ff, void *data);
106*4882a593Smuzhiyun 	const char *name;
107*4882a593Smuzhiyun 	bool	   full_only;
108*4882a593Smuzhiyun 	bool	   synthesize;
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun struct evlist;
112*4882a593Smuzhiyun struct perf_session;
113*4882a593Smuzhiyun struct perf_tool;
114*4882a593Smuzhiyun union perf_event;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun int perf_session__read_header(struct perf_session *session);
117*4882a593Smuzhiyun int perf_session__write_header(struct perf_session *session,
118*4882a593Smuzhiyun 			       struct evlist *evlist,
119*4882a593Smuzhiyun 			       int fd, bool at_exit);
120*4882a593Smuzhiyun int perf_header__write_pipe(int fd);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun void perf_header__set_feat(struct perf_header *header, int feat);
123*4882a593Smuzhiyun void perf_header__clear_feat(struct perf_header *header, int feat);
124*4882a593Smuzhiyun bool perf_header__has_feat(const struct perf_header *header, int feat);
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun int perf_header__set_cmdline(int argc, const char **argv);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun int perf_header__process_sections(struct perf_header *header, int fd,
129*4882a593Smuzhiyun 				  void *data,
130*4882a593Smuzhiyun 				  int (*process)(struct perf_file_section *section,
131*4882a593Smuzhiyun 				  struct perf_header *ph,
132*4882a593Smuzhiyun 				  int feat, int fd, void *data));
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun int perf_event__process_feature(struct perf_session *session,
137*4882a593Smuzhiyun 				union perf_event *event);
138*4882a593Smuzhiyun int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
139*4882a593Smuzhiyun 			     struct evlist **pevlist);
140*4882a593Smuzhiyun int perf_event__process_event_update(struct perf_tool *tool,
141*4882a593Smuzhiyun 				     union perf_event *event,
142*4882a593Smuzhiyun 				     struct evlist **pevlist);
143*4882a593Smuzhiyun size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
144*4882a593Smuzhiyun int perf_event__process_tracing_data(struct perf_session *session,
145*4882a593Smuzhiyun 				     union perf_event *event);
146*4882a593Smuzhiyun int perf_event__process_build_id(struct perf_session *session,
147*4882a593Smuzhiyun 				 union perf_event *event);
148*4882a593Smuzhiyun bool is_perf_magic(u64 magic);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define NAME_ALIGN 64
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun struct feat_fd;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun int do_write(struct feat_fd *fd, const void *buf, size_t size);
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun int write_padded(struct feat_fd *fd, const void *bf,
157*4882a593Smuzhiyun 		 size_t count, size_t count_aligned);
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /*
160*4882a593Smuzhiyun  * arch specific callback
161*4882a593Smuzhiyun  */
162*4882a593Smuzhiyun int get_cpuid(char *buffer, size_t sz);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);
165*4882a593Smuzhiyun int strcmp_cpuid_str(const char *s1, const char *s2);
166*4882a593Smuzhiyun #endif /* __PERF_HEADER_H */
167