1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __PERF_HEADER_H 3*4882a593Smuzhiyun #define __PERF_HEADER_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/stddef.h> 6*4882a593Smuzhiyun #include <linux/perf_event.h> 7*4882a593Smuzhiyun #include <sys/types.h> 8*4882a593Smuzhiyun #include <stdio.h> // FILE 9*4882a593Smuzhiyun #include <stdbool.h> 10*4882a593Smuzhiyun #include <linux/bitmap.h> 11*4882a593Smuzhiyun #include <linux/types.h> 12*4882a593Smuzhiyun #include "env.h" 13*4882a593Smuzhiyun #include "pmu.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun enum { 16*4882a593Smuzhiyun HEADER_RESERVED = 0, /* always cleared */ 17*4882a593Smuzhiyun HEADER_FIRST_FEATURE = 1, 18*4882a593Smuzhiyun HEADER_TRACING_DATA = 1, 19*4882a593Smuzhiyun HEADER_BUILD_ID, 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun HEADER_HOSTNAME, 22*4882a593Smuzhiyun HEADER_OSRELEASE, 23*4882a593Smuzhiyun HEADER_VERSION, 24*4882a593Smuzhiyun HEADER_ARCH, 25*4882a593Smuzhiyun HEADER_NRCPUS, 26*4882a593Smuzhiyun HEADER_CPUDESC, 27*4882a593Smuzhiyun HEADER_CPUID, 28*4882a593Smuzhiyun HEADER_TOTAL_MEM, 29*4882a593Smuzhiyun HEADER_CMDLINE, 30*4882a593Smuzhiyun HEADER_EVENT_DESC, 31*4882a593Smuzhiyun HEADER_CPU_TOPOLOGY, 32*4882a593Smuzhiyun HEADER_NUMA_TOPOLOGY, 33*4882a593Smuzhiyun HEADER_BRANCH_STACK, 34*4882a593Smuzhiyun HEADER_PMU_MAPPINGS, 35*4882a593Smuzhiyun HEADER_GROUP_DESC, 36*4882a593Smuzhiyun HEADER_AUXTRACE, 37*4882a593Smuzhiyun HEADER_STAT, 38*4882a593Smuzhiyun HEADER_CACHE, 39*4882a593Smuzhiyun HEADER_SAMPLE_TIME, 40*4882a593Smuzhiyun HEADER_MEM_TOPOLOGY, 41*4882a593Smuzhiyun HEADER_CLOCKID, 42*4882a593Smuzhiyun HEADER_DIR_FORMAT, 43*4882a593Smuzhiyun HEADER_BPF_PROG_INFO, 44*4882a593Smuzhiyun HEADER_BPF_BTF, 45*4882a593Smuzhiyun HEADER_COMPRESSED, 46*4882a593Smuzhiyun HEADER_CPU_PMU_CAPS, 47*4882a593Smuzhiyun HEADER_CLOCK_DATA, 48*4882a593Smuzhiyun HEADER_LAST_FEATURE, 49*4882a593Smuzhiyun HEADER_FEAT_BITS = 256, 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun enum perf_header_version { 53*4882a593Smuzhiyun PERF_HEADER_VERSION_1, 54*4882a593Smuzhiyun PERF_HEADER_VERSION_2, 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct perf_file_section { 58*4882a593Smuzhiyun u64 offset; 59*4882a593Smuzhiyun u64 size; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct perf_file_header { 63*4882a593Smuzhiyun u64 magic; 64*4882a593Smuzhiyun u64 size; 65*4882a593Smuzhiyun u64 attr_size; 66*4882a593Smuzhiyun struct perf_file_section attrs; 67*4882a593Smuzhiyun struct perf_file_section data; 68*4882a593Smuzhiyun /* event_types is ignored */ 69*4882a593Smuzhiyun struct perf_file_section event_types; 70*4882a593Smuzhiyun DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS); 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct perf_pipe_file_header { 74*4882a593Smuzhiyun u64 magic; 75*4882a593Smuzhiyun u64 size; 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct perf_header; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun int perf_file_header__read(struct perf_file_header *header, 81*4882a593Smuzhiyun struct perf_header *ph, int fd); 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct perf_header { 84*4882a593Smuzhiyun enum perf_header_version version; 85*4882a593Smuzhiyun bool needs_swap; 86*4882a593Smuzhiyun u64 data_offset; 87*4882a593Smuzhiyun u64 data_size; 88*4882a593Smuzhiyun u64 feat_offset; 89*4882a593Smuzhiyun DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS); 90*4882a593Smuzhiyun struct perf_env env; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct feat_fd { 94*4882a593Smuzhiyun struct perf_header *ph; 95*4882a593Smuzhiyun int fd; 96*4882a593Smuzhiyun void *buf; /* Either buf != NULL or fd >= 0 */ 97*4882a593Smuzhiyun ssize_t offset; 98*4882a593Smuzhiyun size_t size; 99*4882a593Smuzhiyun struct evsel *events; 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct perf_header_feature_ops { 103*4882a593Smuzhiyun int (*write)(struct feat_fd *ff, struct evlist *evlist); 104*4882a593Smuzhiyun void (*print)(struct feat_fd *ff, FILE *fp); 105*4882a593Smuzhiyun int (*process)(struct feat_fd *ff, void *data); 106*4882a593Smuzhiyun const char *name; 107*4882a593Smuzhiyun bool full_only; 108*4882a593Smuzhiyun bool synthesize; 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun struct evlist; 112*4882a593Smuzhiyun struct perf_session; 113*4882a593Smuzhiyun struct perf_tool; 114*4882a593Smuzhiyun union perf_event; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun int perf_session__read_header(struct perf_session *session); 117*4882a593Smuzhiyun int perf_session__write_header(struct perf_session *session, 118*4882a593Smuzhiyun struct evlist *evlist, 119*4882a593Smuzhiyun int fd, bool at_exit); 120*4882a593Smuzhiyun int perf_header__write_pipe(int fd); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun void perf_header__set_feat(struct perf_header *header, int feat); 123*4882a593Smuzhiyun void perf_header__clear_feat(struct perf_header *header, int feat); 124*4882a593Smuzhiyun bool perf_header__has_feat(const struct perf_header *header, int feat); 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun int perf_header__set_cmdline(int argc, const char **argv); 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun int perf_header__process_sections(struct perf_header *header, int fd, 129*4882a593Smuzhiyun void *data, 130*4882a593Smuzhiyun int (*process)(struct perf_file_section *section, 131*4882a593Smuzhiyun struct perf_header *ph, 132*4882a593Smuzhiyun int feat, int fd, void *data)); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full); 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun int perf_event__process_feature(struct perf_session *session, 137*4882a593Smuzhiyun union perf_event *event); 138*4882a593Smuzhiyun int perf_event__process_attr(struct perf_tool *tool, union perf_event *event, 139*4882a593Smuzhiyun struct evlist **pevlist); 140*4882a593Smuzhiyun int perf_event__process_event_update(struct perf_tool *tool, 141*4882a593Smuzhiyun union perf_event *event, 142*4882a593Smuzhiyun struct evlist **pevlist); 143*4882a593Smuzhiyun size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp); 144*4882a593Smuzhiyun int perf_event__process_tracing_data(struct perf_session *session, 145*4882a593Smuzhiyun union perf_event *event); 146*4882a593Smuzhiyun int perf_event__process_build_id(struct perf_session *session, 147*4882a593Smuzhiyun union perf_event *event); 148*4882a593Smuzhiyun bool is_perf_magic(u64 magic); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define NAME_ALIGN 64 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun struct feat_fd; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun int do_write(struct feat_fd *fd, const void *buf, size_t size); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun int write_padded(struct feat_fd *fd, const void *bf, 157*4882a593Smuzhiyun size_t count, size_t count_aligned); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* 160*4882a593Smuzhiyun * arch specific callback 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun int get_cpuid(char *buffer, size_t sz); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused); 165*4882a593Smuzhiyun int strcmp_cpuid_str(const char *s1, const char *s2); 166*4882a593Smuzhiyun #endif /* __PERF_HEADER_H */ 167