linux/tools/perf/util/event.h
<<
>>
Prefs
   1#ifndef __PERF_RECORD_H
   2#define __PERF_RECORD_H
   3
   4#include <limits.h>
   5#include <stdio.h>
   6
   7#include "../perf.h"
   8#include "map.h"
   9#include "build-id.h"
  10#include "perf_regs.h"
  11
  12struct mmap_event {
  13        struct perf_event_header header;
  14        u32 pid, tid;
  15        u64 start;
  16        u64 len;
  17        u64 pgoff;
  18        char filename[PATH_MAX];
  19};
  20
  21struct mmap2_event {
  22        struct perf_event_header header;
  23        u32 pid, tid;
  24        u64 start;
  25        u64 len;
  26        u64 pgoff;
  27        u32 maj;
  28        u32 min;
  29        u64 ino;
  30        u64 ino_generation;
  31        u32 prot;
  32        u32 flags;
  33        char filename[PATH_MAX];
  34};
  35
  36struct comm_event {
  37        struct perf_event_header header;
  38        u32 pid, tid;
  39        char comm[16];
  40};
  41
  42struct fork_event {
  43        struct perf_event_header header;
  44        u32 pid, ppid;
  45        u32 tid, ptid;
  46        u64 time;
  47};
  48
  49struct lost_event {
  50        struct perf_event_header header;
  51        u64 id;
  52        u64 lost;
  53};
  54
  55struct lost_samples_event {
  56        struct perf_event_header header;
  57        u64 lost;
  58};
  59
  60/*
  61 * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
  62 */
  63struct read_event {
  64        struct perf_event_header header;
  65        u32 pid, tid;
  66        u64 value;
  67        u64 time_enabled;
  68        u64 time_running;
  69        u64 id;
  70};
  71
  72struct throttle_event {
  73        struct perf_event_header header;
  74        u64 time;
  75        u64 id;
  76        u64 stream_id;
  77};
  78
  79#define PERF_SAMPLE_MASK                                \
  80        (PERF_SAMPLE_IP | PERF_SAMPLE_TID |             \
  81         PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |          \
  82        PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |        \
  83         PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |         \
  84         PERF_SAMPLE_IDENTIFIER)
  85
  86/* perf sample has 16 bits size limit */
  87#define PERF_SAMPLE_MAX_SIZE (1 << 16)
  88
  89struct sample_event {
  90        struct perf_event_header        header;
  91        u64 array[];
  92};
  93
  94struct regs_dump {
  95        u64 abi;
  96        u64 mask;
  97        u64 *regs;
  98
  99        /* Cached values/mask filled by first register access. */
 100        u64 cache_regs[PERF_REGS_MAX];
 101        u64 cache_mask;
 102};
 103
 104struct stack_dump {
 105        u16 offset;
 106        u64 size;
 107        char *data;
 108};
 109
 110struct sample_read_value {
 111        u64 value;
 112        u64 id;
 113};
 114
 115struct sample_read {
 116        u64 time_enabled;
 117        u64 time_running;
 118        union {
 119                struct {
 120                        u64 nr;
 121                        struct sample_read_value *values;
 122                } group;
 123                struct sample_read_value one;
 124        };
 125};
 126
 127struct ip_callchain {
 128        u64 nr;
 129        u64 ips[0];
 130};
 131
 132struct branch_flags {
 133        u64 mispred:1;
 134        u64 predicted:1;
 135        u64 in_tx:1;
 136        u64 abort:1;
 137        u64 reserved:60;
 138};
 139
 140struct branch_entry {
 141        u64                     from;
 142        u64                     to;
 143        struct branch_flags     flags;
 144};
 145
 146struct branch_stack {
 147        u64                     nr;
 148        struct branch_entry     entries[0];
 149};
 150
 151enum {
 152        PERF_IP_FLAG_BRANCH             = 1ULL << 0,
 153        PERF_IP_FLAG_CALL               = 1ULL << 1,
 154        PERF_IP_FLAG_RETURN             = 1ULL << 2,
 155        PERF_IP_FLAG_CONDITIONAL        = 1ULL << 3,
 156        PERF_IP_FLAG_SYSCALLRET         = 1ULL << 4,
 157        PERF_IP_FLAG_ASYNC              = 1ULL << 5,
 158        PERF_IP_FLAG_INTERRUPT          = 1ULL << 6,
 159        PERF_IP_FLAG_TX_ABORT           = 1ULL << 7,
 160        PERF_IP_FLAG_TRACE_BEGIN        = 1ULL << 8,
 161        PERF_IP_FLAG_TRACE_END          = 1ULL << 9,
 162        PERF_IP_FLAG_IN_TX              = 1ULL << 10,
 163};
 164
 165#define PERF_IP_FLAG_CHARS "bcrosyiABEx"
 166
 167#define PERF_BRANCH_MASK                (\
 168        PERF_IP_FLAG_BRANCH             |\
 169        PERF_IP_FLAG_CALL               |\
 170        PERF_IP_FLAG_RETURN             |\
 171        PERF_IP_FLAG_CONDITIONAL        |\
 172        PERF_IP_FLAG_SYSCALLRET         |\
 173        PERF_IP_FLAG_ASYNC              |\
 174        PERF_IP_FLAG_INTERRUPT          |\
 175        PERF_IP_FLAG_TX_ABORT           |\
 176        PERF_IP_FLAG_TRACE_BEGIN        |\
 177        PERF_IP_FLAG_TRACE_END)
 178
 179struct perf_sample {
 180        u64 ip;
 181        u32 pid, tid;
 182        u64 time;
 183        u64 addr;
 184        u64 id;
 185        u64 stream_id;
 186        u64 period;
 187        u64 weight;
 188        u64 transaction;
 189        u32 cpu;
 190        u32 raw_size;
 191        u64 data_src;
 192        u32 flags;
 193        u16 insn_len;
 194        void *raw_data;
 195        struct ip_callchain *callchain;
 196        struct branch_stack *branch_stack;
 197        struct regs_dump  user_regs;
 198        struct regs_dump  intr_regs;
 199        struct stack_dump user_stack;
 200        struct sample_read read;
 201};
 202
 203#define PERF_MEM_DATA_SRC_NONE \
 204        (PERF_MEM_S(OP, NA) |\
 205         PERF_MEM_S(LVL, NA) |\
 206         PERF_MEM_S(SNOOP, NA) |\
 207         PERF_MEM_S(LOCK, NA) |\
 208         PERF_MEM_S(TLB, NA))
 209
 210struct build_id_event {
 211        struct perf_event_header header;
 212        pid_t                    pid;
 213        u8                       build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
 214        char                     filename[];
 215};
 216
 217enum perf_user_event_type { /* above any possible kernel type */
 218        PERF_RECORD_USER_TYPE_START             = 64,
 219        PERF_RECORD_HEADER_ATTR                 = 64,
 220        PERF_RECORD_HEADER_EVENT_TYPE           = 65, /* depreceated */
 221        PERF_RECORD_HEADER_TRACING_DATA         = 66,
 222        PERF_RECORD_HEADER_BUILD_ID             = 67,
 223        PERF_RECORD_FINISHED_ROUND              = 68,
 224        PERF_RECORD_ID_INDEX                    = 69,
 225        PERF_RECORD_AUXTRACE_INFO               = 70,
 226        PERF_RECORD_AUXTRACE                    = 71,
 227        PERF_RECORD_AUXTRACE_ERROR              = 72,
 228        PERF_RECORD_HEADER_MAX
 229};
 230
 231enum auxtrace_error_type {
 232        PERF_AUXTRACE_ERROR_ITRACE  = 1,
 233        PERF_AUXTRACE_ERROR_MAX
 234};
 235
 236/*
 237 * The kernel collects the number of events it couldn't send in a stretch and
 238 * when possible sends this number in a PERF_RECORD_LOST event. The number of
 239 * such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while
 240 * total_lost tells exactly how many events the kernel in fact lost, i.e. it is
 241 * the sum of all struct lost_event.lost fields reported.
 242 *
 243 * The kernel discards mixed up samples and sends the number in a
 244 * PERF_RECORD_LOST_SAMPLES event. The number of lost-samples events is stored
 245 * in .nr_events[PERF_RECORD_LOST_SAMPLES] while total_lost_samples tells
 246 * exactly how many samples the kernel in fact dropped, i.e. it is the sum of
 247 * all struct lost_samples_event.lost fields reported.
 248 *
 249 * The total_period is needed because by default auto-freq is used, so
 250 * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get
 251 * the total number of low level events, it is necessary to to sum all struct
 252 * sample_event.period and stash the result in total_period.
 253 */
 254struct events_stats {
 255        u64 total_period;
 256        u64 total_non_filtered_period;
 257        u64 total_lost;
 258        u64 total_lost_samples;
 259        u64 total_invalid_chains;
 260        u32 nr_events[PERF_RECORD_HEADER_MAX];
 261        u32 nr_non_filtered_samples;
 262        u32 nr_lost_warned;
 263        u32 nr_unknown_events;
 264        u32 nr_invalid_chains;
 265        u32 nr_unknown_id;
 266        u32 nr_unprocessable_samples;
 267        u32 nr_auxtrace_errors[PERF_AUXTRACE_ERROR_MAX];
 268        u32 nr_proc_map_timeout;
 269};
 270
 271struct attr_event {
 272        struct perf_event_header header;
 273        struct perf_event_attr attr;
 274        u64 id[];
 275};
 276
 277#define MAX_EVENT_NAME 64
 278
 279struct perf_trace_event_type {
 280        u64     event_id;
 281        char    name[MAX_EVENT_NAME];
 282};
 283
 284struct event_type_event {
 285        struct perf_event_header header;
 286        struct perf_trace_event_type event_type;
 287};
 288
 289struct tracing_data_event {
 290        struct perf_event_header header;
 291        u32 size;
 292};
 293
 294struct id_index_entry {
 295        u64 id;
 296        u64 idx;
 297        u64 cpu;
 298        u64 tid;
 299};
 300
 301struct id_index_event {
 302        struct perf_event_header header;
 303        u64 nr;
 304        struct id_index_entry entries[0];
 305};
 306
 307struct auxtrace_info_event {
 308        struct perf_event_header header;
 309        u32 type;
 310        u32 reserved__; /* For alignment */
 311        u64 priv[];
 312};
 313
 314struct auxtrace_event {
 315        struct perf_event_header header;
 316        u64 size;
 317        u64 offset;
 318        u64 reference;
 319        u32 idx;
 320        u32 tid;
 321        u32 cpu;
 322        u32 reserved__; /* For alignment */
 323};
 324
 325#define MAX_AUXTRACE_ERROR_MSG 64
 326
 327struct auxtrace_error_event {
 328        struct perf_event_header header;
 329        u32 type;
 330        u32 code;
 331        u32 cpu;
 332        u32 pid;
 333        u32 tid;
 334        u32 reserved__; /* For alignment */
 335        u64 ip;
 336        char msg[MAX_AUXTRACE_ERROR_MSG];
 337};
 338
 339struct aux_event {
 340        struct perf_event_header header;
 341        u64     aux_offset;
 342        u64     aux_size;
 343        u64     flags;
 344};
 345
 346struct itrace_start_event {
 347        struct perf_event_header header;
 348        u32 pid, tid;
 349};
 350
 351union perf_event {
 352        struct perf_event_header        header;
 353        struct mmap_event               mmap;
 354        struct mmap2_event              mmap2;
 355        struct comm_event               comm;
 356        struct fork_event               fork;
 357        struct lost_event               lost;
 358        struct lost_samples_event       lost_samples;
 359        struct read_event               read;
 360        struct throttle_event           throttle;
 361        struct sample_event             sample;
 362        struct attr_event               attr;
 363        struct event_type_event         event_type;
 364        struct tracing_data_event       tracing_data;
 365        struct build_id_event           build_id;
 366        struct id_index_event           id_index;
 367        struct auxtrace_info_event      auxtrace_info;
 368        struct auxtrace_event           auxtrace;
 369        struct auxtrace_error_event     auxtrace_error;
 370        struct aux_event                aux;
 371        struct itrace_start_event       itrace_start;
 372};
 373
 374void perf_event__print_totals(void);
 375
 376struct perf_tool;
 377struct thread_map;
 378
 379typedef int (*perf_event__handler_t)(struct perf_tool *tool,
 380                                     union perf_event *event,
 381                                     struct perf_sample *sample,
 382                                     struct machine *machine);
 383
 384int perf_event__synthesize_thread_map(struct perf_tool *tool,
 385                                      struct thread_map *threads,
 386                                      perf_event__handler_t process,
 387                                      struct machine *machine, bool mmap_data,
 388                                      unsigned int proc_map_timeout);
 389int perf_event__synthesize_threads(struct perf_tool *tool,
 390                                   perf_event__handler_t process,
 391                                   struct machine *machine, bool mmap_data,
 392                                   unsigned int proc_map_timeout);
 393int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
 394                                       perf_event__handler_t process,
 395                                       struct machine *machine);
 396
 397int perf_event__synthesize_modules(struct perf_tool *tool,
 398                                   perf_event__handler_t process,
 399                                   struct machine *machine);
 400
 401int perf_event__process_comm(struct perf_tool *tool,
 402                             union perf_event *event,
 403                             struct perf_sample *sample,
 404                             struct machine *machine);
 405int perf_event__process_lost(struct perf_tool *tool,
 406                             union perf_event *event,
 407                             struct perf_sample *sample,
 408                             struct machine *machine);
 409int perf_event__process_lost_samples(struct perf_tool *tool,
 410                                     union perf_event *event,
 411                                     struct perf_sample *sample,
 412                                     struct machine *machine);
 413int perf_event__process_aux(struct perf_tool *tool,
 414                            union perf_event *event,
 415                            struct perf_sample *sample,
 416                            struct machine *machine);
 417int perf_event__process_itrace_start(struct perf_tool *tool,
 418                                     union perf_event *event,
 419                                     struct perf_sample *sample,
 420                                     struct machine *machine);
 421int perf_event__process_mmap(struct perf_tool *tool,
 422                             union perf_event *event,
 423                             struct perf_sample *sample,
 424                             struct machine *machine);
 425int perf_event__process_mmap2(struct perf_tool *tool,
 426                             union perf_event *event,
 427                             struct perf_sample *sample,
 428                             struct machine *machine);
 429int perf_event__process_fork(struct perf_tool *tool,
 430                             union perf_event *event,
 431                             struct perf_sample *sample,
 432                             struct machine *machine);
 433int perf_event__process_exit(struct perf_tool *tool,
 434                             union perf_event *event,
 435                             struct perf_sample *sample,
 436                             struct machine *machine);
 437int perf_event__process(struct perf_tool *tool,
 438                        union perf_event *event,
 439                        struct perf_sample *sample,
 440                        struct machine *machine);
 441
 442struct addr_location;
 443
 444int perf_event__preprocess_sample(const union perf_event *event,
 445                                  struct machine *machine,
 446                                  struct addr_location *al,
 447                                  struct perf_sample *sample);
 448
 449void addr_location__put(struct addr_location *al);
 450
 451struct thread;
 452
 453bool is_bts_event(struct perf_event_attr *attr);
 454bool sample_addr_correlates_sym(struct perf_event_attr *attr);
 455void perf_event__preprocess_sample_addr(union perf_event *event,
 456                                        struct perf_sample *sample,
 457                                        struct thread *thread,
 458                                        struct addr_location *al);
 459
 460const char *perf_event__name(unsigned int id);
 461
 462size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
 463                                     u64 read_format);
 464int perf_event__synthesize_sample(union perf_event *event, u64 type,
 465                                  u64 read_format,
 466                                  const struct perf_sample *sample,
 467                                  bool swapped);
 468
 469int perf_event__synthesize_mmap_events(struct perf_tool *tool,
 470                                       union perf_event *event,
 471                                       pid_t pid, pid_t tgid,
 472                                       perf_event__handler_t process,
 473                                       struct machine *machine,
 474                                       bool mmap_data,
 475                                       unsigned int proc_map_timeout);
 476
 477size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 478size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
 479size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
 480size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
 481size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp);
 482size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp);
 483size_t perf_event__fprintf(union perf_event *event, FILE *fp);
 484
 485u64 kallsyms__get_function_start(const char *kallsyms_filename,
 486                                 const char *symbol_name);
 487
 488#endif /* __PERF_RECORD_H */
 489