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