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