xref: /openbmc/linux/tools/perf/util/header.h (revision 2b72cec9)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
28b40f521SJohn Kacur #ifndef __PERF_HEADER_H
38b40f521SJohn Kacur #define __PERF_HEADER_H
47c6a1c65SPeter Zijlstra 
544fe619bSArnaldo Carvalho de Melo #include <linux/stddef.h>
6d2709c7cSDavid Howells #include <linux/perf_event.h>
77c6a1c65SPeter Zijlstra #include <sys/types.h>
827830616SArnaldo Carvalho de Melo #include <stdio.h> // FILE
98d06367fSArnaldo Carvalho de Melo #include <stdbool.h>
10d944c4eeSBorislav Petkov #include <linux/bitmap.h>
11d944c4eeSBorislav Petkov #include <linux/types.h>
12f0ce888cSArnaldo Carvalho de Melo #include "env.h"
1354e32dc0SGanapatrao Kulkarni #include "pmu.h"
14db9f11e3SFrederic Weisbecker 
1537562eacSArnaldo Carvalho de Melo enum {
16b1e5a9beSRobert Richter 	HEADER_RESERVED		= 0,	/* always cleared */
17781ba9d2SRobert Richter 	HEADER_FIRST_FEATURE	= 1,
182eeaaa09SStephane Eranian 	HEADER_TRACING_DATA	= 1,
1937562eacSArnaldo Carvalho de Melo 	HEADER_BUILD_ID,
20fbe96f29SStephane Eranian 
21fbe96f29SStephane Eranian 	HEADER_HOSTNAME,
22fbe96f29SStephane Eranian 	HEADER_OSRELEASE,
23fbe96f29SStephane Eranian 	HEADER_VERSION,
24fbe96f29SStephane Eranian 	HEADER_ARCH,
25fbe96f29SStephane Eranian 	HEADER_NRCPUS,
26fbe96f29SStephane Eranian 	HEADER_CPUDESC,
27fbe96f29SStephane Eranian 	HEADER_CPUID,
28fbe96f29SStephane Eranian 	HEADER_TOTAL_MEM,
29fbe96f29SStephane Eranian 	HEADER_CMDLINE,
30fbe96f29SStephane Eranian 	HEADER_EVENT_DESC,
31fbe96f29SStephane Eranian 	HEADER_CPU_TOPOLOGY,
32fbe96f29SStephane Eranian 	HEADER_NUMA_TOPOLOGY,
33330aa675SStephane Eranian 	HEADER_BRANCH_STACK,
3450a9667cSRobert Richter 	HEADER_PMU_MAPPINGS,
35a8bb559bSNamhyung Kim 	HEADER_GROUP_DESC,
364025ea40SAdrian Hunter 	HEADER_AUXTRACE,
37ffa517adSJiri Olsa 	HEADER_STAT,
38720e98b5SJiri Olsa 	HEADER_CACHE,
396011518dSJin Yao 	HEADER_SAMPLE_TIME,
40e2091cedSJiri Olsa 	HEADER_MEM_TOPOLOGY,
41cf790516SAlexey Budankov 	HEADER_CLOCKID,
42258031c0SJiri Olsa 	HEADER_DIR_FORMAT,
43606f972bSSong Liu 	HEADER_BPF_PROG_INFO,
44a70a1123SSong Liu 	HEADER_BPF_BTF,
4542e1fd80SAlexey Budankov 	HEADER_COMPRESSED,
466f91ea28SKan Liang 	HEADER_CPU_PMU_CAPS,
47d1e325cfSJiri Olsa 	HEADER_CLOCK_DATA,
48f7d74ce3SJin Yao 	HEADER_HYBRID_TOPOLOGY,
492139f742SRavi Bangoria 	HEADER_PMU_CAPS,
5037562eacSArnaldo Carvalho de Melo 	HEADER_LAST_FEATURE,
51b1e5a9beSRobert Richter 	HEADER_FEAT_BITS	= 256,
5237562eacSArnaldo Carvalho de Melo };
532ba08250SFrederic Weisbecker 
542a08c3ecSJiri Olsa enum perf_header_version {
552a08c3ecSJiri Olsa 	PERF_HEADER_VERSION_1,
562a08c3ecSJiri Olsa 	PERF_HEADER_VERSION_2,
572a08c3ecSJiri Olsa };
582a08c3ecSJiri Olsa 
5937562eacSArnaldo Carvalho de Melo struct perf_file_section {
6037562eacSArnaldo Carvalho de Melo 	u64 offset;
6137562eacSArnaldo Carvalho de Melo 	u64 size;
6237562eacSArnaldo Carvalho de Melo };
6337562eacSArnaldo Carvalho de Melo 
6437562eacSArnaldo Carvalho de Melo struct perf_file_header {
6537562eacSArnaldo Carvalho de Melo 	u64				magic;
6637562eacSArnaldo Carvalho de Melo 	u64				size;
6737562eacSArnaldo Carvalho de Melo 	u64				attr_size;
6837562eacSArnaldo Carvalho de Melo 	struct perf_file_section	attrs;
6937562eacSArnaldo Carvalho de Melo 	struct perf_file_section	data;
7044b3c578SJiri Olsa 	/* event_types is ignored */
7137562eacSArnaldo Carvalho de Melo 	struct perf_file_section	event_types;
7237562eacSArnaldo Carvalho de Melo 	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
7337562eacSArnaldo Carvalho de Melo };
7437562eacSArnaldo Carvalho de Melo 
758dc58101STom Zanussi struct perf_pipe_file_header {
768dc58101STom Zanussi 	u64				magic;
778dc58101STom Zanussi 	u64				size;
788dc58101STom Zanussi };
798dc58101STom Zanussi 
8037562eacSArnaldo Carvalho de Melo struct perf_header;
8137562eacSArnaldo Carvalho de Melo 
821c0b04d1SArnaldo Carvalho de Melo int perf_file_header__read(struct perf_file_header *header,
8337562eacSArnaldo Carvalho de Melo 			   struct perf_header *ph, int fd);
8437562eacSArnaldo Carvalho de Melo 
857c6a1c65SPeter Zijlstra struct perf_header {
862a08c3ecSJiri Olsa 	enum perf_header_version	version;
87eed05fe7SArnaldo Carvalho de Melo 	bool				needs_swap;
887c6a1c65SPeter Zijlstra 	u64				data_offset;
897c6a1c65SPeter Zijlstra 	u64				data_size;
908d541e97SJiri Olsa 	u64				feat_offset;
91db9f11e3SFrederic Weisbecker 	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
92ce80d3beSKan Liang 	struct perf_env 	env;
937c6a1c65SPeter Zijlstra };
947c6a1c65SPeter Zijlstra 
95055c67edSArnaldo Carvalho de Melo struct feat_fd {
96055c67edSArnaldo Carvalho de Melo 	struct perf_header *ph;
97055c67edSArnaldo Carvalho de Melo 	int		   fd;
98055c67edSArnaldo Carvalho de Melo 	void		   *buf;	/* Either buf != NULL or fd >= 0 */
99055c67edSArnaldo Carvalho de Melo 	ssize_t		   offset;
100055c67edSArnaldo Carvalho de Melo 	size_t		   size;
101055c67edSArnaldo Carvalho de Melo 	struct evsel	   *events;
102055c67edSArnaldo Carvalho de Melo };
103055c67edSArnaldo Carvalho de Melo 
104055c67edSArnaldo Carvalho de Melo struct perf_header_feature_ops {
105055c67edSArnaldo Carvalho de Melo 	int	   (*write)(struct feat_fd *ff, struct evlist *evlist);
106055c67edSArnaldo Carvalho de Melo 	void	   (*print)(struct feat_fd *ff, FILE *fp);
107055c67edSArnaldo Carvalho de Melo 	int	   (*process)(struct feat_fd *ff, void *data);
108055c67edSArnaldo Carvalho de Melo 	const char *name;
109055c67edSArnaldo Carvalho de Melo 	bool	   full_only;
110055c67edSArnaldo Carvalho de Melo 	bool	   synthesize;
111055c67edSArnaldo Carvalho de Melo };
112055c67edSArnaldo Carvalho de Melo 
11363503dbaSJiri Olsa struct evlist;
114d20deb64SArnaldo Carvalho de Melo struct perf_session;
11527830616SArnaldo Carvalho de Melo struct perf_tool;
11627830616SArnaldo Carvalho de Melo union perf_event;
117361c99a6SArnaldo Carvalho de Melo 
1188641661cSIan Rogers extern const char perf_version_string[];
1198641661cSIan Rogers 
1200ae03893SNamhyung Kim int perf_session__read_header(struct perf_session *session, int repipe_fd);
121a91e5431SArnaldo Carvalho de Melo int perf_session__write_header(struct perf_session *session,
12263503dbaSJiri Olsa 			       struct evlist *evlist,
123361c99a6SArnaldo Carvalho de Melo 			       int fd, bool at_exit);
1248dc58101STom Zanussi int perf_header__write_pipe(int fd);
1257c6a1c65SPeter Zijlstra 
126237c96b8SAdrian Hunter /* feat_writer writes a feature section to output */
127237c96b8SAdrian Hunter struct feat_writer {
128237c96b8SAdrian Hunter 	int (*write)(struct feat_writer *fw, void *buf, size_t sz);
129237c96b8SAdrian Hunter };
130237c96b8SAdrian Hunter 
131237c96b8SAdrian Hunter /* feat_copier copies a feature section using feat_writer to output */
132237c96b8SAdrian Hunter struct feat_copier {
133237c96b8SAdrian Hunter 	int (*copy)(struct feat_copier *fc, int feat, struct feat_writer *fw);
134237c96b8SAdrian Hunter };
135237c96b8SAdrian Hunter 
136180b3d06SAdrian Hunter int perf_session__inject_header(struct perf_session *session,
137180b3d06SAdrian Hunter 				struct evlist *evlist,
138180b3d06SAdrian Hunter 				int fd,
139180b3d06SAdrian Hunter 				struct feat_copier *fc);
140180b3d06SAdrian Hunter 
14137ed2cddSRaul Silvera size_t perf_session__data_offset(const struct evlist *evlist);
14237ed2cddSRaul Silvera 
1431c0b04d1SArnaldo Carvalho de Melo void perf_header__set_feat(struct perf_header *header, int feat);
1441c0b04d1SArnaldo Carvalho de Melo void perf_header__clear_feat(struct perf_header *header, int feat);
1451c0b04d1SArnaldo Carvalho de Melo bool perf_header__has_feat(const struct perf_header *header, int feat);
1467c6a1c65SPeter Zijlstra 
147fbe96f29SStephane Eranian int perf_header__set_cmdline(int argc, const char **argv);
148fbe96f29SStephane Eranian 
1491c0b04d1SArnaldo Carvalho de Melo int perf_header__process_sections(struct perf_header *header, int fd,
150fbe96f29SStephane Eranian 				  void *data,
1511c0b04d1SArnaldo Carvalho de Melo 				  int (*process)(struct perf_file_section *section,
152ba21594cSArnaldo Carvalho de Melo 				  struct perf_header *ph,
153fbe96f29SStephane Eranian 				  int feat, int fd, void *data));
154fbe96f29SStephane Eranian 
155fbe96f29SStephane Eranian int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
15637562eacSArnaldo Carvalho de Melo 
15789f1688aSJiri Olsa int perf_event__process_feature(struct perf_session *session,
15889f1688aSJiri Olsa 				union perf_event *event);
15947c3d109SAdrian Hunter int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
16063503dbaSJiri Olsa 			     struct evlist **pevlist);
161b8f8eb84SArnaldo Carvalho de Melo int perf_event__process_event_update(struct perf_tool *tool,
162ffe77725SJiri Olsa 				     union perf_event *event,
16363503dbaSJiri Olsa 				     struct evlist **pevlist);
164c853f939SJiri Olsa size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
165378ef0f5SIan Rogers #ifdef HAVE_LIBTRACEEVENT
16689f1688aSJiri Olsa int perf_event__process_tracing_data(struct perf_session *session,
16789f1688aSJiri Olsa 				     union perf_event *event);
168378ef0f5SIan Rogers #endif
16989f1688aSJiri Olsa int perf_event__process_build_id(struct perf_session *session,
17089f1688aSJiri Olsa 				 union perf_event *event);
171e84ba4e2SFeng Tang bool is_perf_magic(u64 magic);
172fbe96f29SStephane Eranian 
173e195fac8SNamhyung Kim #define NAME_ALIGN 64
174e195fac8SNamhyung Kim 
175ccebbeb6SDavid Carrillo-Cisneros struct feat_fd;
1763b8f51a6SDavid Carrillo-Cisneros 
177ccebbeb6SDavid Carrillo-Cisneros int do_write(struct feat_fd *fd, const void *buf, size_t size);
178ccebbeb6SDavid Carrillo-Cisneros 
179ccebbeb6SDavid Carrillo-Cisneros int write_padded(struct feat_fd *fd, const void *bf,
180ccebbeb6SDavid Carrillo-Cisneros 		 size_t count, size_t count_aligned);
1811f625b0bSAdrian Hunter 
182*2b72cec9SK Prateek Nayak #define MAX_CACHE_LVL 4
183*2b72cec9SK Prateek Nayak 
1848cb7a188SAthira Rajeev int is_cpu_online(unsigned int cpu);
185*2b72cec9SK Prateek Nayak int build_caches_for_cpu(u32 cpu, struct cpu_cache_level caches[], u32 *cntp);
186*2b72cec9SK Prateek Nayak 
187fbe96f29SStephane Eranian /*
188fbe96f29SStephane Eranian  * arch specific callback
189fbe96f29SStephane Eranian  */
190fbe96f29SStephane Eranian int get_cpuid(char *buffer, size_t sz);
191fbe96f29SStephane Eranian 
19254e32dc0SGanapatrao Kulkarni char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);
1934cb7d3ecSThomas Richter int strcmp_cpuid_str(const char *s1, const char *s2);
1948b40f521SJohn Kacur #endif /* __PERF_HEADER_H */
195