brintos

brintos / linux-shallow public Read only

0
0
Text · 5.3 KiB · a63a361 Raw
210 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_HEADER_H3#define __PERF_HEADER_H4 5#include <linux/stddef.h>6#include <linux/perf_event.h>7#include <sys/types.h>8#include <stdio.h> // FILE9#include <stdbool.h>10#include <linux/bitmap.h>11#include <linux/types.h>12#include "env.h"13#include "pmu.h"14 15enum {16	HEADER_RESERVED		= 0,	/* always cleared */17	HEADER_FIRST_FEATURE	= 1,18	HEADER_TRACING_DATA	= 1,19	HEADER_BUILD_ID,20 21	HEADER_HOSTNAME,22	HEADER_OSRELEASE,23	HEADER_VERSION,24	HEADER_ARCH,25	HEADER_NRCPUS,26	HEADER_CPUDESC,27	HEADER_CPUID,28	HEADER_TOTAL_MEM,29	HEADER_CMDLINE,30	HEADER_EVENT_DESC,31	HEADER_CPU_TOPOLOGY,32	HEADER_NUMA_TOPOLOGY,33	HEADER_BRANCH_STACK,34	HEADER_PMU_MAPPINGS,35	HEADER_GROUP_DESC,36	HEADER_AUXTRACE,37	HEADER_STAT,38	HEADER_CACHE,39	HEADER_SAMPLE_TIME,40	HEADER_MEM_TOPOLOGY,41	HEADER_CLOCKID,42	HEADER_DIR_FORMAT,43	HEADER_BPF_PROG_INFO,44	HEADER_BPF_BTF,45	HEADER_COMPRESSED,46	HEADER_CPU_PMU_CAPS,47	HEADER_CLOCK_DATA,48	HEADER_HYBRID_TOPOLOGY,49	HEADER_PMU_CAPS,50	HEADER_LAST_FEATURE,51	HEADER_FEAT_BITS	= 256,52};53 54enum perf_header_version {55	PERF_HEADER_VERSION_1,56	PERF_HEADER_VERSION_2,57};58 59struct perf_file_section {60	u64 offset;61	u64 size;62};63 64/**65 * struct perf_file_header: Header representation on disk.66 */67struct perf_file_header {68	/** @magic: Holds "PERFILE2". */69	u64				magic;70	/** @size: Size of this header - sizeof(struct perf_file_header). */71	u64				size;72	/**73	 * @attr_size: Size of attrs entries - sizeof(struct perf_event_attr) +74	 * sizeof(struct perf_file_section).75	 */76	u64				attr_size;77	/** @attrs: Offset and size of file section holding attributes. */78	struct perf_file_section	attrs;79	/** @data: Offset and size of file section holding regular event data. */80	struct perf_file_section	data;81	/** @event_types: Ignored. */82	struct perf_file_section	event_types;83	/**84	 * @adds_features: Bitmap of features. The features are immediately after the data section.85	 */86	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);87};88 89struct perf_pipe_file_header {90	u64				magic;91	u64				size;92};93 94struct perf_header;95 96int perf_file_header__read(struct perf_file_header *header,97			   struct perf_header *ph, int fd);98 99struct perf_header {100	enum perf_header_version	version;101	bool				needs_swap;102	u64				data_offset;103	u64				data_size;104	u64				feat_offset;105	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);106	struct perf_env 	env;107};108 109struct feat_fd {110	struct perf_header *ph;111	int		   fd;112	void		   *buf;	/* Either buf != NULL or fd >= 0 */113	ssize_t		   offset;114	size_t		   size;115	struct evsel	   *events;116};117 118struct perf_header_feature_ops {119	int	   (*write)(struct feat_fd *ff, struct evlist *evlist);120	void	   (*print)(struct feat_fd *ff, FILE *fp);121	int	   (*process)(struct feat_fd *ff, void *data);122	const char *name;123	bool	   full_only;124	bool	   synthesize;125};126 127struct evlist;128struct perf_session;129struct perf_tool;130union perf_event;131 132extern const char perf_version_string[];133 134int perf_session__read_header(struct perf_session *session);135int perf_session__write_header(struct perf_session *session,136			       struct evlist *evlist,137			       int fd, bool at_exit);138int perf_header__write_pipe(int fd);139 140/* feat_writer writes a feature section to output */141struct feat_writer {142	int (*write)(struct feat_writer *fw, void *buf, size_t sz);143};144 145/* feat_copier copies a feature section using feat_writer to output */146struct feat_copier {147	int (*copy)(struct feat_copier *fc, int feat, struct feat_writer *fw);148};149 150int perf_session__inject_header(struct perf_session *session,151				struct evlist *evlist,152				int fd,153				struct feat_copier *fc,154				bool write_attrs_after_data);155 156size_t perf_session__data_offset(const struct evlist *evlist);157 158void perf_header__set_feat(struct perf_header *header, int feat);159void perf_header__clear_feat(struct perf_header *header, int feat);160bool perf_header__has_feat(const struct perf_header *header, int feat);161 162int perf_header__set_cmdline(int argc, const char **argv);163 164int perf_header__process_sections(struct perf_header *header, int fd,165				  void *data,166				  int (*process)(struct perf_file_section *section,167				  struct perf_header *ph,168				  int feat, int fd, void *data));169 170int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);171 172int perf_event__process_feature(struct perf_session *session,173				union perf_event *event);174int perf_event__process_attr(const struct perf_tool *tool, union perf_event *event,175			     struct evlist **pevlist);176int perf_event__process_event_update(const struct perf_tool *tool,177				     union perf_event *event,178				     struct evlist **pevlist);179size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);180#ifdef HAVE_LIBTRACEEVENT181int perf_event__process_tracing_data(struct perf_session *session,182				     union perf_event *event);183#endif184int perf_event__process_build_id(struct perf_session *session,185				 union perf_event *event);186bool is_perf_magic(u64 magic);187 188#define NAME_ALIGN 64189 190struct feat_fd;191 192int do_write(struct feat_fd *fd, const void *buf, size_t size);193 194int write_padded(struct feat_fd *fd, const void *bf,195		 size_t count, size_t count_aligned);196 197#define MAX_CACHE_LVL 4198 199int is_cpu_online(unsigned int cpu);200int build_caches_for_cpu(u32 cpu, struct cpu_cache_level caches[], u32 *cntp);201 202/*203 * arch specific callback204 */205int get_cpuid(char *buffer, size_t sz);206 207char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);208int strcmp_cpuid_str(const char *s1, const char *s2);209#endif /* __PERF_HEADER_H */210