xref: /openbmc/linux/tools/perf/util/header.h (revision 63503dba)
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>
88d06367fSArnaldo Carvalho de Melo #include <stdbool.h>
9d944c4eeSBorislav Petkov #include <linux/bitmap.h>
10d944c4eeSBorislav Petkov #include <linux/types.h>
11ef12a141SArnaldo Carvalho de Melo #include "event.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,
4637562eacSArnaldo Carvalho de Melo 	HEADER_LAST_FEATURE,
47b1e5a9beSRobert Richter 	HEADER_FEAT_BITS	= 256,
4837562eacSArnaldo Carvalho de Melo };
492ba08250SFrederic Weisbecker 
502a08c3ecSJiri Olsa enum perf_header_version {
512a08c3ecSJiri Olsa 	PERF_HEADER_VERSION_1,
522a08c3ecSJiri Olsa 	PERF_HEADER_VERSION_2,
532a08c3ecSJiri Olsa };
542a08c3ecSJiri Olsa 
55258031c0SJiri Olsa enum perf_dir_version {
56258031c0SJiri Olsa 	PERF_DIR_VERSION	= 1,
57258031c0SJiri Olsa };
58258031c0SJiri 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 
9563503dbaSJiri Olsa struct evlist;
96d20deb64SArnaldo Carvalho de Melo struct perf_session;
97361c99a6SArnaldo Carvalho de Melo 
98d4339569SJiri Olsa int perf_session__read_header(struct perf_session *session);
99a91e5431SArnaldo Carvalho de Melo int perf_session__write_header(struct perf_session *session,
10063503dbaSJiri Olsa 			       struct evlist *evlist,
101361c99a6SArnaldo Carvalho de Melo 			       int fd, bool at_exit);
1028dc58101STom Zanussi int perf_header__write_pipe(int fd);
1037c6a1c65SPeter Zijlstra 
1041c0b04d1SArnaldo Carvalho de Melo void perf_header__set_feat(struct perf_header *header, int feat);
1051c0b04d1SArnaldo Carvalho de Melo void perf_header__clear_feat(struct perf_header *header, int feat);
1061c0b04d1SArnaldo Carvalho de Melo bool perf_header__has_feat(const struct perf_header *header, int feat);
1077c6a1c65SPeter Zijlstra 
108fbe96f29SStephane Eranian int perf_header__set_cmdline(int argc, const char **argv);
109fbe96f29SStephane Eranian 
1101c0b04d1SArnaldo Carvalho de Melo int perf_header__process_sections(struct perf_header *header, int fd,
111fbe96f29SStephane Eranian 				  void *data,
1121c0b04d1SArnaldo Carvalho de Melo 				  int (*process)(struct perf_file_section *section,
113ba21594cSArnaldo Carvalho de Melo 				  struct perf_header *ph,
114fbe96f29SStephane Eranian 				  int feat, int fd, void *data));
115fbe96f29SStephane Eranian 
116fbe96f29SStephane Eranian int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
11737562eacSArnaldo Carvalho de Melo 
118e9def1b2SDavid Carrillo-Cisneros int perf_event__synthesize_features(struct perf_tool *tool,
119e9def1b2SDavid Carrillo-Cisneros 				    struct perf_session *session,
12063503dbaSJiri Olsa 				    struct evlist *evlist,
121e9def1b2SDavid Carrillo-Cisneros 				    perf_event__handler_t process);
122e9def1b2SDavid Carrillo-Cisneros 
123bfd8f72cSAndi Kleen int perf_event__synthesize_extra_attr(struct perf_tool *tool,
12463503dbaSJiri Olsa 				      struct evlist *evsel_list,
125bfd8f72cSAndi Kleen 				      perf_event__handler_t process,
126bfd8f72cSAndi Kleen 				      bool is_pipe);
127bfd8f72cSAndi Kleen 
12889f1688aSJiri Olsa int perf_event__process_feature(struct perf_session *session,
12989f1688aSJiri Olsa 				union perf_event *event);
130e9def1b2SDavid Carrillo-Cisneros 
13145694aa7SArnaldo Carvalho de Melo int perf_event__synthesize_attr(struct perf_tool *tool,
132f4d83436SRobert Richter 				struct perf_event_attr *attr, u32 ids, u64 *id,
133743eb868SArnaldo Carvalho de Melo 				perf_event__handler_t process);
13445694aa7SArnaldo Carvalho de Melo int perf_event__synthesize_attrs(struct perf_tool *tool,
13563503dbaSJiri Olsa 				 struct evlist *evlist,
136a91e5431SArnaldo Carvalho de Melo 				 perf_event__handler_t process);
137a6e52817SJiri Olsa int perf_event__synthesize_event_update_unit(struct perf_tool *tool,
13832dcd021SJiri Olsa 					     struct evsel *evsel,
139a6e52817SJiri Olsa 					     perf_event__handler_t process);
140daeecbc0SJiri Olsa int perf_event__synthesize_event_update_scale(struct perf_tool *tool,
14132dcd021SJiri Olsa 					      struct evsel *evsel,
142daeecbc0SJiri Olsa 					      perf_event__handler_t process);
143802c9048SJiri Olsa int perf_event__synthesize_event_update_name(struct perf_tool *tool,
14432dcd021SJiri Olsa 					     struct evsel *evsel,
145802c9048SJiri Olsa 					     perf_event__handler_t process);
14686ebb09fSJiri Olsa int perf_event__synthesize_event_update_cpus(struct perf_tool *tool,
14732dcd021SJiri Olsa 					     struct evsel *evsel,
14886ebb09fSJiri Olsa 					     perf_event__handler_t process);
14947c3d109SAdrian Hunter int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
15063503dbaSJiri Olsa 			     struct evlist **pevlist);
151b8f8eb84SArnaldo Carvalho de Melo int perf_event__process_event_update(struct perf_tool *tool,
152ffe77725SJiri Olsa 				     union perf_event *event,
15363503dbaSJiri Olsa 				     struct evlist **pevlist);
154c853f939SJiri Olsa size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
1552c46dbb5STom Zanussi 
15645694aa7SArnaldo Carvalho de Melo int perf_event__synthesize_tracing_data(struct perf_tool *tool,
15763503dbaSJiri Olsa 					int fd, struct evlist *evlist,
158743eb868SArnaldo Carvalho de Melo 					perf_event__handler_t process);
15989f1688aSJiri Olsa int perf_event__process_tracing_data(struct perf_session *session,
16089f1688aSJiri Olsa 				     union perf_event *event);
161cd19a035STom Zanussi 
16245694aa7SArnaldo Carvalho de Melo int perf_event__synthesize_build_id(struct perf_tool *tool,
163d20deb64SArnaldo Carvalho de Melo 				    struct dso *pos, u16 misc,
1648115d60cSArnaldo Carvalho de Melo 				    perf_event__handler_t process,
165743eb868SArnaldo Carvalho de Melo 				    struct machine *machine);
16689f1688aSJiri Olsa int perf_event__process_build_id(struct perf_session *session,
16789f1688aSJiri Olsa 				 union perf_event *event);
168e84ba4e2SFeng Tang bool is_perf_magic(u64 magic);
169fbe96f29SStephane Eranian 
170e195fac8SNamhyung Kim #define NAME_ALIGN 64
171e195fac8SNamhyung Kim 
172ccebbeb6SDavid Carrillo-Cisneros struct feat_fd;
1733b8f51a6SDavid Carrillo-Cisneros 
174ccebbeb6SDavid Carrillo-Cisneros int do_write(struct feat_fd *fd, const void *buf, size_t size);
175ccebbeb6SDavid Carrillo-Cisneros 
176ccebbeb6SDavid Carrillo-Cisneros int write_padded(struct feat_fd *fd, const void *bf,
177ccebbeb6SDavid Carrillo-Cisneros 		 size_t count, size_t count_aligned);
1781f625b0bSAdrian Hunter 
179fbe96f29SStephane Eranian /*
180fbe96f29SStephane Eranian  * arch specific callback
181fbe96f29SStephane Eranian  */
182fbe96f29SStephane Eranian int get_cpuid(char *buffer, size_t sz);
183fbe96f29SStephane Eranian 
18454e32dc0SGanapatrao Kulkarni char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);
1854cb7d3ecSThomas Richter int strcmp_cpuid_str(const char *s1, const char *s2);
1868b40f521SJohn Kacur #endif /* __PERF_HEADER_H */
187