1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_HEADER_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_HEADER_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/perf_event.h>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/types.h>
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h>
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "types.h"
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "event.h"
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/bitmap.h>
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum {
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_RESERVED		= 0,	/* always cleared */
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_FIRST_FEATURE	= 1,
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_TRACING_DATA	= 1,
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_BUILD_ID,
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_HOSTNAME,
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_OSRELEASE,
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_VERSION,
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_ARCH,
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_NRCPUS,
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_CPUDESC,
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_CPUID,
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_TOTAL_MEM,
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_CMDLINE,
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_EVENT_DESC,
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_CPU_TOPOLOGY,
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_NUMA_TOPOLOGY,
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_BRANCH_STACK,
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_PMU_MAPPINGS,
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_GROUP_DESC,
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_LAST_FEATURE,
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	HEADER_FEAT_BITS	= 256,
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_header_version {
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_HEADER_VERSION_1,
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_HEADER_VERSION_2,
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_file_section {
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64 offset;
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64 size;
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_file_header {
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				magic;
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				size;
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				attr_size;
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct perf_file_section	attrs;
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct perf_file_section	data;
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* event_types is ignored */
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct perf_file_section	event_types;
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_pipe_file_header {
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				magic;
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				size;
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_header;
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_file_header__read(struct perf_file_header *header,
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   struct perf_header *ph, int fd);
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_session_env {
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*hostname;
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*os_release;
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*version;
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*arch;
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_cpus_online;
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_cpus_avail;
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*cpu_desc;
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*cpuid;
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long	total_mem;
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_cmdline;
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*cmdline;
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_sibling_cores;
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*sibling_cores;
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_sibling_threads;
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*sibling_threads;
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_numa_nodes;
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*numa_nodes;
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_pmu_mappings;
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*pmu_mappings;
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_groups;
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_header {
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum perf_header_version	version;
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bool				needs_swap;
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				data_offset;
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				data_size;
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	u64				feat_offset;
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct perf_session_env 	env;
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evlist;
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_session;
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session__read_header(struct perf_session *session);
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_session__write_header(struct perf_session *session,
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			       struct perf_evlist *evlist,
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			       int fd, bool at_exit);
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_header__write_pipe(int fd);
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_header__set_feat(struct perf_header *header, int feat);
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_header__clear_feat(struct perf_header *header, int feat);
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool perf_header__has_feat(const struct perf_header *header, int feat);
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_header__set_cmdline(int argc, const char **argv);
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_header__process_sections(struct perf_header *header, int fd,
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				  void *data,
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				  int (*process)(struct perf_file_section *section,
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				  struct perf_header *ph,
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				  int feat, int fd, void *data));
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  const char *name, bool is_kallsyms, bool is_vdso);
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint build_id_cache__remove_s(const char *sbuild_id, const char *debugdir);
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__synthesize_attr(struct perf_tool *tool,
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				struct perf_event_attr *attr, u32 ids, u64 *id,
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				perf_event__handler_t process);
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__synthesize_attrs(struct perf_tool *tool,
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct perf_session *session,
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 perf_event__handler_t process);
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     struct perf_evlist **pevlist);
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__synthesize_tracing_data(struct perf_tool *tool,
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					int fd, struct perf_evlist *evlist,
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					perf_event__handler_t process);
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__process_tracing_data(struct perf_tool *tool,
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				     union perf_event *event,
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				     struct perf_session *session);
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__synthesize_build_id(struct perf_tool *tool,
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				    struct dso *pos, u16 misc,
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				    perf_event__handler_t process,
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				    struct machine *machine);
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_event__process_build_id(struct perf_tool *tool,
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 union perf_event *event,
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 struct perf_session *session);
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool is_perf_magic(u64 magic);
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * arch specific callback
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint get_cpuid(char *buffer, size_t sz);
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_HEADER_H */
160