linux/tools/perf/util/event.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __PERF_RECORD_H
   3#define __PERF_RECORD_H
   4/*
   5 * The linux/stddef.h isn't need here, but is needed for __always_inline used
   6 * in files included from uapi/linux/perf_event.h such as
   7 * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h,
   8 * detected in at least musl libc, used in Alpine Linux. -acme
   9 */
  10#include <stdio.h>
  11#include <linux/stddef.h>
  12#include <perf/event.h>
  13#include <linux/types.h>
  14
  15#include "perf_regs.h"
  16
  17struct dso;
  18struct machine;
  19struct perf_event_attr;
  20
  21#ifdef __LP64__
  22/*
  23 * /usr/include/inttypes.h uses just 'lu' for PRIu64, but we end up defining
  24 * __u64 as long long unsigned int, and then -Werror=format= kicks in and
  25 * complains of the mismatched types, so use these two special extra PRI
  26 * macros to overcome that.
  27 */
  28#define PRI_lu64 "l" PRIu64
  29#define PRI_lx64 "l" PRIx64
  30#define PRI_ld64 "l" PRId64
  31#else
  32#define PRI_lu64 PRIu64
  33#define PRI_lx64 PRIx64
  34#define PRI_ld64 PRId64
  35#endif
  36
  37#define PERF_SAMPLE_MASK                                \
  38        (PERF_SAMPLE_IP | PERF_SAMPLE_TID |             \
  39         PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |          \
  40        PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |        \
  41         PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |         \
  42         PERF_SAMPLE_IDENTIFIER)
  43
  44/* perf sample has 16 bits size limit */
  45#define PERF_SAMPLE_MAX_SIZE (1 << 16)
  46
  47struct regs_dump {
  48        u64 abi;
  49        u64 mask;
  50        u64 *regs;
  51
  52        /* Cached values/mask filled by first register access. */
  53        u64 cache_regs[PERF_REGS_MAX];
  54        u64 cache_mask;
  55};
  56
  57struct stack_dump {
  58        u16 offset;
  59        u64 size;
  60        char *data;
  61};
  62
  63struct sample_read_value {
  64        u64 value;
  65        u64 id;
  66};
  67
  68struct sample_read {
  69        u64 time_enabled;
  70        u64 time_running;
  71        union {
  72                struct {
  73                        u64 nr;
  74                        struct sample_read_value *values;
  75                } group;
  76                struct sample_read_value one;
  77        };
  78};
  79
  80struct ip_callchain {
  81        u64 nr;
  82        u64 ips[0];
  83};
  84
  85struct branch_stack;
  86
  87enum {
  88        PERF_IP_FLAG_BRANCH             = 1ULL << 0,
  89        PERF_IP_FLAG_CALL               = 1ULL << 1,
  90        PERF_IP_FLAG_RETURN             = 1ULL << 2,
  91        PERF_IP_FLAG_CONDITIONAL        = 1ULL << 3,
  92        PERF_IP_FLAG_SYSCALLRET         = 1ULL << 4,
  93        PERF_IP_FLAG_ASYNC              = 1ULL << 5,
  94        PERF_IP_FLAG_INTERRUPT          = 1ULL << 6,
  95        PERF_IP_FLAG_TX_ABORT           = 1ULL << 7,
  96        PERF_IP_FLAG_TRACE_BEGIN        = 1ULL << 8,
  97        PERF_IP_FLAG_TRACE_END          = 1ULL << 9,
  98        PERF_IP_FLAG_IN_TX              = 1ULL << 10,
  99};
 100
 101#define PERF_IP_FLAG_CHARS "bcrosyiABEx"
 102
 103#define PERF_BRANCH_MASK                (\
 104        PERF_IP_FLAG_BRANCH             |\
 105        PERF_IP_FLAG_CALL               |\
 106        PERF_IP_FLAG_RETURN             |\
 107        PERF_IP_FLAG_CONDITIONAL        |\
 108        PERF_IP_FLAG_SYSCALLRET         |\
 109        PERF_IP_FLAG_ASYNC              |\
 110        PERF_IP_FLAG_INTERRUPT          |\
 111        PERF_IP_FLAG_TX_ABORT           |\
 112        PERF_IP_FLAG_TRACE_BEGIN        |\
 113        PERF_IP_FLAG_TRACE_END)
 114
 115#define MAX_INSN 16
 116
 117struct aux_sample {
 118        u64 size;
 119        void *data;
 120};
 121
 122struct perf_sample {
 123        u64 ip;
 124        u32 pid, tid;
 125        u64 time;
 126        u64 addr;
 127        u64 id;
 128        u64 stream_id;
 129        u64 period;
 130        u64 weight;
 131        u64 transaction;
 132        u64 insn_cnt;
 133        u64 cyc_cnt;
 134        u32 cpu;
 135        u32 raw_size;
 136        u64 data_src;
 137        u64 phys_addr;
 138        u32 flags;
 139        u16 insn_len;
 140        u8  cpumode;
 141        u16 misc;
 142        char insn[MAX_INSN];
 143        void *raw_data;
 144        struct ip_callchain *callchain;
 145        struct branch_stack *branch_stack;
 146        struct regs_dump  user_regs;
 147        struct regs_dump  intr_regs;
 148        struct stack_dump user_stack;
 149        struct sample_read read;
 150        struct aux_sample aux_sample;
 151};
 152
 153#define PERF_MEM_DATA_SRC_NONE \
 154        (PERF_MEM_S(OP, NA) |\
 155         PERF_MEM_S(LVL, NA) |\
 156         PERF_MEM_S(SNOOP, NA) |\
 157         PERF_MEM_S(LOCK, NA) |\
 158         PERF_MEM_S(TLB, NA))
 159
 160/* Attribute type for custom synthesized events */
 161#define PERF_TYPE_SYNTH         (INT_MAX + 1U)
 162
 163/* Attribute config for custom synthesized events */
 164enum perf_synth_id {
 165        PERF_SYNTH_INTEL_PTWRITE,
 166        PERF_SYNTH_INTEL_MWAIT,
 167        PERF_SYNTH_INTEL_PWRE,
 168        PERF_SYNTH_INTEL_EXSTOP,
 169        PERF_SYNTH_INTEL_PWRX,
 170        PERF_SYNTH_INTEL_CBR,
 171};
 172
 173/*
 174 * Raw data formats for synthesized events. Note that 4 bytes of padding are
 175 * present to match the 'size' member of PERF_SAMPLE_RAW data which is always
 176 * 8-byte aligned. That means we must dereference raw_data with an offset of 4.
 177 * Refer perf_sample__synth_ptr() and perf_synth__raw_data().  It also means the
 178 * structure sizes are 4 bytes bigger than the raw_size, refer
 179 * perf_synth__raw_size().
 180 */
 181
 182struct perf_synth_intel_ptwrite {
 183        u32 padding;
 184        union {
 185                struct {
 186                        u32     ip              :  1,
 187                                reserved        : 31;
 188                };
 189                u32     flags;
 190        };
 191        u64     payload;
 192};
 193
 194struct perf_synth_intel_mwait {
 195        u32 padding;
 196        u32 reserved;
 197        union {
 198                struct {
 199                        u64     hints           :  8,
 200                                reserved1       : 24,
 201                                extensions      :  2,
 202                                reserved2       : 30;
 203                };
 204                u64     payload;
 205        };
 206};
 207
 208struct perf_synth_intel_pwre {
 209        u32 padding;
 210        u32 reserved;
 211        union {
 212                struct {
 213                        u64     reserved1       :  7,
 214                                hw              :  1,
 215                                subcstate       :  4,
 216                                cstate          :  4,
 217                                reserved2       : 48;
 218                };
 219                u64     payload;
 220        };
 221};
 222
 223struct perf_synth_intel_exstop {
 224        u32 padding;
 225        union {
 226                struct {
 227                        u32     ip              :  1,
 228                                reserved        : 31;
 229                };
 230                u32     flags;
 231        };
 232};
 233
 234struct perf_synth_intel_pwrx {
 235        u32 padding;
 236        u32 reserved;
 237        union {
 238                struct {
 239                        u64     deepest_cstate  :  4,
 240                                last_cstate     :  4,
 241                                wake_reason     :  4,
 242                                reserved1       : 52;
 243                };
 244                u64     payload;
 245        };
 246};
 247
 248struct perf_synth_intel_cbr {
 249        u32 padding;
 250        union {
 251                struct {
 252                        u32     cbr             :  8,
 253                                reserved1       :  8,
 254                                max_nonturbo    :  8,
 255                                reserved2       :  8;
 256                };
 257                u32     flags;
 258        };
 259        u32 freq;
 260        u32 reserved3;
 261};
 262
 263/*
 264 * raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get
 265 * 8-byte alignment.
 266 */
 267static inline void *perf_sample__synth_ptr(struct perf_sample *sample)
 268{
 269        return sample->raw_data - 4;
 270}
 271
 272static inline void *perf_synth__raw_data(void *p)
 273{
 274        return p + 4;
 275}
 276
 277#define perf_synth__raw_size(d) (sizeof(d) - 4)
 278
 279#define perf_sample__bad_synth_size(s, d) ((s)->raw_size < sizeof(d) - 4)
 280
 281enum {
 282        PERF_STAT_ROUND_TYPE__INTERVAL  = 0,
 283        PERF_STAT_ROUND_TYPE__FINAL     = 1,
 284};
 285
 286void perf_event__print_totals(void);
 287
 288struct perf_cpu_map;
 289struct perf_record_stat_config;
 290struct perf_stat_config;
 291struct perf_tool;
 292
 293void perf_event__read_stat_config(struct perf_stat_config *config,
 294                                  struct perf_record_stat_config *event);
 295
 296int perf_event__process_comm(struct perf_tool *tool,
 297                             union perf_event *event,
 298                             struct perf_sample *sample,
 299                             struct machine *machine);
 300int perf_event__process_lost(struct perf_tool *tool,
 301                             union perf_event *event,
 302                             struct perf_sample *sample,
 303                             struct machine *machine);
 304int perf_event__process_lost_samples(struct perf_tool *tool,
 305                                     union perf_event *event,
 306                                     struct perf_sample *sample,
 307                                     struct machine *machine);
 308int perf_event__process_aux(struct perf_tool *tool,
 309                            union perf_event *event,
 310                            struct perf_sample *sample,
 311                            struct machine *machine);
 312int perf_event__process_itrace_start(struct perf_tool *tool,
 313                                     union perf_event *event,
 314                                     struct perf_sample *sample,
 315                                     struct machine *machine);
 316int perf_event__process_switch(struct perf_tool *tool,
 317                               union perf_event *event,
 318                               struct perf_sample *sample,
 319                               struct machine *machine);
 320int perf_event__process_namespaces(struct perf_tool *tool,
 321                                   union perf_event *event,
 322                                   struct perf_sample *sample,
 323                                   struct machine *machine);
 324int perf_event__process_mmap(struct perf_tool *tool,
 325                             union perf_event *event,
 326                             struct perf_sample *sample,
 327                             struct machine *machine);
 328int perf_event__process_mmap2(struct perf_tool *tool,
 329                             union perf_event *event,
 330                             struct perf_sample *sample,
 331                             struct machine *machine);
 332int perf_event__process_fork(struct perf_tool *tool,
 333                             union perf_event *event,
 334                             struct perf_sample *sample,
 335                             struct machine *machine);
 336int perf_event__process_exit(struct perf_tool *tool,
 337                             union perf_event *event,
 338                             struct perf_sample *sample,
 339                             struct machine *machine);
 340int perf_event__process_ksymbol(struct perf_tool *tool,
 341                                union perf_event *event,
 342                                struct perf_sample *sample,
 343                                struct machine *machine);
 344int perf_event__process_bpf(struct perf_tool *tool,
 345                            union perf_event *event,
 346                            struct perf_sample *sample,
 347                            struct machine *machine);
 348int perf_event__process(struct perf_tool *tool,
 349                        union perf_event *event,
 350                        struct perf_sample *sample,
 351                        struct machine *machine);
 352
 353struct addr_location;
 354
 355int machine__resolve(struct machine *machine, struct addr_location *al,
 356                     struct perf_sample *sample);
 357
 358void addr_location__put(struct addr_location *al);
 359
 360struct thread;
 361
 362bool is_bts_event(struct perf_event_attr *attr);
 363bool sample_addr_correlates_sym(struct perf_event_attr *attr);
 364void thread__resolve(struct thread *thread, struct addr_location *al,
 365                     struct perf_sample *sample);
 366
 367const char *perf_event__name(unsigned int id);
 368
 369size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 370size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
 371size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
 372size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
 373size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp);
 374size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp);
 375size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp);
 376size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp);
 377size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp);
 378size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
 379size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp);
 380size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp);
 381size_t perf_event__fprintf(union perf_event *event, FILE *fp);
 382
 383int kallsyms__get_function_start(const char *kallsyms_filename,
 384                                 const char *symbol_name, u64 *addr);
 385
 386void *cpu_map_data__alloc(struct perf_cpu_map *map, size_t *size, u16 *type, int *max);
 387void  cpu_map_data__synthesize(struct perf_record_cpu_map_data *data, struct perf_cpu_map *map,
 388                               u16 type, int max);
 389
 390void event_attr_init(struct perf_event_attr *attr);
 391
 392int perf_event_paranoid(void);
 393bool perf_event_paranoid_check(int max_level);
 394
 395extern int sysctl_perf_event_max_stack;
 396extern int sysctl_perf_event_max_contexts_per_stack;
 397extern unsigned int proc_map_timeout;
 398
 399#endif /* __PERF_RECORD_H */
 400