linux/tools/perf/util/header.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __PERF_HEADER_H
   3#define __PERF_HEADER_H
   4
   5#include <linux/stddef.h>
   6#include <linux/perf_event.h>
   7#include <sys/types.h>
   8#include <stdbool.h>
   9#include <linux/bitmap.h>
  10#include <linux/types.h>
  11#include "event.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_LAST_FEATURE,
  47        HEADER_FEAT_BITS        = 256,
  48};
  49
  50enum perf_header_version {
  51        PERF_HEADER_VERSION_1,
  52        PERF_HEADER_VERSION_2,
  53};
  54
  55enum perf_dir_version {
  56        PERF_DIR_VERSION        = 1,
  57};
  58
  59struct perf_file_section {
  60        u64 offset;
  61        u64 size;
  62};
  63
  64struct perf_file_header {
  65        u64                             magic;
  66        u64                             size;
  67        u64                             attr_size;
  68        struct perf_file_section        attrs;
  69        struct perf_file_section        data;
  70        /* event_types is ignored */
  71        struct perf_file_section        event_types;
  72        DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
  73};
  74
  75struct perf_pipe_file_header {
  76        u64                             magic;
  77        u64                             size;
  78};
  79
  80struct perf_header;
  81
  82int perf_file_header__read(struct perf_file_header *header,
  83                           struct perf_header *ph, int fd);
  84
  85struct perf_header {
  86        enum perf_header_version        version;
  87        bool                            needs_swap;
  88        u64                             data_offset;
  89        u64                             data_size;
  90        u64                             feat_offset;
  91        DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
  92        struct perf_env         env;
  93};
  94
  95struct perf_evlist;
  96struct perf_session;
  97
  98int perf_session__read_header(struct perf_session *session);
  99int perf_session__write_header(struct perf_session *session,
 100                               struct perf_evlist *evlist,
 101                               int fd, bool at_exit);
 102int perf_header__write_pipe(int fd);
 103
 104void perf_header__set_feat(struct perf_header *header, int feat);
 105void perf_header__clear_feat(struct perf_header *header, int feat);
 106bool perf_header__has_feat(const struct perf_header *header, int feat);
 107
 108int perf_header__set_cmdline(int argc, const char **argv);
 109
 110int perf_header__process_sections(struct perf_header *header, int fd,
 111                                  void *data,
 112                                  int (*process)(struct perf_file_section *section,
 113                                  struct perf_header *ph,
 114                                  int feat, int fd, void *data));
 115
 116int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
 117
 118int perf_event__synthesize_features(struct perf_tool *tool,
 119                                    struct perf_session *session,
 120                                    struct perf_evlist *evlist,
 121                                    perf_event__handler_t process);
 122
 123int perf_event__synthesize_extra_attr(struct perf_tool *tool,
 124                                      struct perf_evlist *evsel_list,
 125                                      perf_event__handler_t process,
 126                                      bool is_pipe);
 127
 128int perf_event__process_feature(struct perf_session *session,
 129                                union perf_event *event);
 130
 131int perf_event__synthesize_attr(struct perf_tool *tool,
 132                                struct perf_event_attr *attr, u32 ids, u64 *id,
 133                                perf_event__handler_t process);
 134int perf_event__synthesize_attrs(struct perf_tool *tool,
 135                                 struct perf_evlist *evlist,
 136                                 perf_event__handler_t process);
 137int perf_event__synthesize_event_update_unit(struct perf_tool *tool,
 138                                             struct perf_evsel *evsel,
 139                                             perf_event__handler_t process);
 140int perf_event__synthesize_event_update_scale(struct perf_tool *tool,
 141                                              struct perf_evsel *evsel,
 142                                              perf_event__handler_t process);
 143int perf_event__synthesize_event_update_name(struct perf_tool *tool,
 144                                             struct perf_evsel *evsel,
 145                                             perf_event__handler_t process);
 146int perf_event__synthesize_event_update_cpus(struct perf_tool *tool,
 147                                             struct perf_evsel *evsel,
 148                                             perf_event__handler_t process);
 149int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
 150                             struct perf_evlist **pevlist);
 151int perf_event__process_event_update(struct perf_tool *tool,
 152                                     union perf_event *event,
 153                                     struct perf_evlist **pevlist);
 154size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
 155
 156int perf_event__synthesize_tracing_data(struct perf_tool *tool,
 157                                        int fd, struct perf_evlist *evlist,
 158                                        perf_event__handler_t process);
 159int perf_event__process_tracing_data(struct perf_session *session,
 160                                     union perf_event *event);
 161
 162int perf_event__synthesize_build_id(struct perf_tool *tool,
 163                                    struct dso *pos, u16 misc,
 164                                    perf_event__handler_t process,
 165                                    struct machine *machine);
 166int perf_event__process_build_id(struct perf_session *session,
 167                                 union perf_event *event);
 168bool is_perf_magic(u64 magic);
 169
 170#define NAME_ALIGN 64
 171
 172struct feat_fd;
 173
 174int do_write(struct feat_fd *fd, const void *buf, size_t size);
 175
 176int write_padded(struct feat_fd *fd, const void *bf,
 177                 size_t count, size_t count_aligned);
 178
 179/*
 180 * arch specific callback
 181 */
 182int get_cpuid(char *buffer, size_t sz);
 183
 184char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);
 185int strcmp_cpuid_str(const char *s1, const char *s2);
 186#endif /* __PERF_HEADER_H */
 187