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 cycles:16;
 138        u64 reserved:44;
 139};
 140
 141struct branch_entry {
 142        u64                     from;
 143        u64                     to;
 144        struct branch_flags     flags;
 145};
 146
 147struct branch_stack {
 148        u64                     nr;
 149        struct branch_entry     entries[0];
 150};
 151
 152enum {
 153        PERF_IP_FLAG_BRANCH             = 1ULL << 0,
 154        PERF_IP_FLAG_CALL               = 1ULL << 1,
 155        PERF_IP_FLAG_RETURN             = 1ULL << 2,
 156        PERF_IP_FLAG_CONDITIONAL        = 1ULL << 3,
 157        PERF_IP_FLAG_SYSCALLRET         = 1ULL << 4,
 158        PERF_IP_FLAG_ASYNC              = 1ULL << 5,
 159        PERF_IP_FLAG_INTERRUPT          = 1ULL << 6,
 160        PERF_IP_FLAG_TX_ABORT           = 1ULL << 7,
 161        PERF_IP_FLAG_TRACE_BEGIN        = 1ULL << 8,
 162        PERF_IP_FLAG_TRACE_END          = 1ULL << 9,
 163        PERF_IP_FLAG_IN_TX              = 1ULL << 10,
 164};
 165
 166#define PERF_IP_FLAG_CHARS "bcrosyiABEx"
 167
 168#define PERF_BRANCH_MASK                (\
 169        PERF_IP_FLAG_BRANCH             |\
 170        PERF_IP_FLAG_CALL               |\
 171        PERF_IP_FLAG_RETURN             |\
 172        PERF_IP_FLAG_CONDITIONAL        |\
 173        PERF_IP_FLAG_SYSCALLRET         |\
 174        PERF_IP_FLAG_ASYNC              |\
 175        PERF_IP_FLAG_INTERRUPT          |\
 176        PERF_IP_FLAG_TX_ABORT           |\
 177        PERF_IP_FLAG_TRACE_BEGIN        |\
 178        PERF_IP_FLAG_TRACE_END)
 179
 180struct perf_sample {
 181        u64 ip;
 182        u32 pid, tid;
 183        u64 time;
 184        u64 addr;
 185        u64 id;
 186        u64 stream_id;
 187        u64 period;
 188        u64 weight;
 189        u64 transaction;
 190        u32 cpu;
 191        u32 raw_size;
 192        u64 data_src;
 193        u32 flags;
 194        u16 insn_len;
 195        u8  cpumode;
 196        void *raw_data;
 197        struct ip_callchain *callchain;
 198        struct branch_stack *branch_stack;
 199        struct regs_dump  user_regs;
 200        struct regs_dump  intr_regs;
 201        struct stack_dump user_stack;
 202        struct sample_read read;
 203};
 204
 205#define PERF_MEM_DATA_SRC_NONE \
 206        (PERF_MEM_S(OP, NA) |\
 207         PERF_MEM_S(LVL, NA) |\
 208         PERF_MEM_S(SNOOP, NA) |\
 209         PERF_MEM_S(LOCK, NA) |\
 210         PERF_MEM_S(TLB, NA))
 211
 212struct build_id_event {
 213        struct perf_event_header header;
 214        pid_t                    pid;
 215        u8                       build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
 216        char                     filename[];
 217};
 218
 219enum perf_user_event_type { /* above any possible kernel type */
 220        PERF_RECORD_USER_TYPE_START             = 64,
 221        PERF_RECORD_HEADER_ATTR                 = 64,
 222        PERF_RECORD_HEADER_EVENT_TYPE           = 65, /* depreceated */
 223        PERF_RECORD_HEADER_TRACING_DATA         = 66,
 224        PERF_RECORD_HEADER_BUILD_ID             = 67,
 225        PERF_RECORD_FINISHED_ROUND              = 68,
 226        PERF_RECORD_ID_INDEX                    = 69,
 227        PERF_RECORD_AUXTRACE_INFO               = 70,
 228        PERF_RECORD_AUXTRACE                    = 71,
 229        PERF_RECORD_AUXTRACE_ERROR              = 72,
 230        PERF_RECORD_THREAD_MAP                  = 73,
 231        PERF_RECORD_CPU_MAP                     = 74,
 232        PERF_RECORD_STAT_CONFIG                 = 75,
 233        PERF_RECORD_STAT                        = 76,
 234        PERF_RECORD_STAT_ROUND                  = 77,
 235        PERF_RECORD_EVENT_UPDATE                = 78,
 236        PERF_RECORD_TIME_CONV                   = 79,
 237        PERF_RECORD_HEADER_MAX
 238};
 239
 240enum auxtrace_error_type {
 241        PERF_AUXTRACE_ERROR_ITRACE  = 1,
 242        PERF_AUXTRACE_ERROR_MAX
 243};
 244
 245/*
 246 * The kernel collects the number of events it couldn't send in a stretch and
 247 * when possible sends this number in a PERF_RECORD_LOST event. The number of
 248 * such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while
 249 * total_lost tells exactly how many events the kernel in fact lost, i.e. it is
 250 * the sum of all struct lost_event.lost fields reported.
 251 *
 252 * The kernel discards mixed up samples and sends the number in a
 253 * PERF_RECORD_LOST_SAMPLES event. The number of lost-samples events is stored
 254 * in .nr_events[PERF_RECORD_LOST_SAMPLES] while total_lost_samples tells
 255 * exactly how many samples the kernel in fact dropped, i.e. it is the sum of
 256 * all struct lost_samples_event.lost fields reported.
 257 *
 258 * The total_period is needed because by default auto-freq is used, so
 259 * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get
 260 * the total number of low level events, it is necessary to to sum all struct
 261 * sample_event.period and stash the result in total_period.
 262 */
 263struct events_stats {
 264        u64 total_period;
 265        u64 total_non_filtered_period;
 266        u64 total_lost;
 267        u64 total_lost_samples;
 268        u64 total_aux_lost;
 269        u64 total_invalid_chains;
 270        u32 nr_events[PERF_RECORD_HEADER_MAX];
 271        u32 nr_non_filtered_samples;
 272        u32 nr_lost_warned;
 273        u32 nr_unknown_events;
 274        u32 nr_invalid_chains;
 275        u32 nr_unknown_id;
 276        u32 nr_unprocessable_samples;
 277        u32 nr_auxtrace_errors[PERF_AUXTRACE_ERROR_MAX];
 278        u32 nr_proc_map_timeout;
 279};
 280
 281enum {
 282        PERF_CPU_MAP__CPUS = 0,
 283        PERF_CPU_MAP__MASK = 1,
 284};
 285
 286struct cpu_map_entries {
 287        u16     nr;
 288        u16     cpu[];
 289};
 290
 291struct cpu_map_mask {
 292        u16     nr;
 293        u16     long_size;
 294        unsigned long mask[];
 295};
 296
 297struct cpu_map_data {
 298        u16     type;
 299        char    data[];
 300};
 301
 302struct cpu_map_event {
 303        struct perf_event_header        header;
 304        struct cpu_map_data             data;
 305};
 306
 307struct attr_event {
 308        struct perf_event_header header;
 309        struct perf_event_attr attr;
 310        u64 id[];
 311};
 312
 313enum {
 314        PERF_EVENT_UPDATE__UNIT  = 0,
 315        PERF_EVENT_UPDATE__SCALE = 1,
 316        PERF_EVENT_UPDATE__NAME  = 2,
 317        PERF_EVENT_UPDATE__CPUS  = 3,
 318};
 319
 320struct event_update_event_cpus {
 321        struct cpu_map_data cpus;
 322};
 323
 324struct event_update_event_scale {
 325        double scale;
 326};
 327
 328struct event_update_event {
 329        struct perf_event_header header;
 330        u64 type;
 331        u64 id;
 332
 333        char data[];
 334};
 335
 336#define MAX_EVENT_NAME 64
 337
 338struct perf_trace_event_type {
 339        u64     event_id;
 340        char    name[MAX_EVENT_NAME];
 341};
 342
 343struct event_type_event {
 344        struct perf_event_header header;
 345        struct perf_trace_event_type event_type;
 346};
 347
 348struct tracing_data_event {
 349        struct perf_event_header header;
 350        u32 size;
 351};
 352
 353struct id_index_entry {
 354        u64 id;
 355        u64 idx;
 356        u64 cpu;
 357        u64 tid;
 358};
 359
 360struct id_index_event {
 361        struct perf_event_header header;
 362        u64 nr;
 363        struct id_index_entry entries[0];
 364};
 365
 366struct auxtrace_info_event {
 367        struct perf_event_header header;
 368        u32 type;
 369        u32 reserved__; /* For alignment */
 370        u64 priv[];
 371};
 372
 373struct auxtrace_event {
 374        struct perf_event_header header;
 375        u64 size;
 376        u64 offset;
 377        u64 reference;
 378        u32 idx;
 379        u32 tid;
 380        u32 cpu;
 381        u32 reserved__; /* For alignment */
 382};
 383
 384#define MAX_AUXTRACE_ERROR_MSG 64
 385
 386struct auxtrace_error_event {
 387        struct perf_event_header header;
 388        u32 type;
 389        u32 code;
 390        u32 cpu;
 391        u32 pid;
 392        u32 tid;
 393        u32 reserved__; /* For alignment */
 394        u64 ip;
 395        char msg[MAX_AUXTRACE_ERROR_MSG];
 396};
 397
 398struct aux_event {
 399        struct perf_event_header header;
 400        u64     aux_offset;
 401        u64     aux_size;
 402        u64     flags;
 403};
 404
 405struct itrace_start_event {
 406        struct perf_event_header header;
 407        u32 pid, tid;
 408};
 409
 410struct context_switch_event {
 411        struct perf_event_header header;
 412        u32 next_prev_pid;
 413        u32 next_prev_tid;
 414};
 415
 416struct thread_map_event_entry {
 417        u64     pid;
 418        char    comm[16];
 419};
 420
 421struct thread_map_event {
 422        struct perf_event_header        header;
 423        u64                             nr;
 424        struct thread_map_event_entry   entries[];
 425};
 426
 427enum {
 428        PERF_STAT_CONFIG_TERM__AGGR_MODE        = 0,
 429        PERF_STAT_CONFIG_TERM__INTERVAL         = 1,
 430        PERF_STAT_CONFIG_TERM__SCALE            = 2,
 431        PERF_STAT_CONFIG_TERM__MAX              = 3,
 432};
 433
 434struct stat_config_event_entry {
 435        u64     tag;
 436        u64     val;
 437};
 438
 439struct stat_config_event {
 440        struct perf_event_header        header;
 441        u64                             nr;
 442        struct stat_config_event_entry  data[];
 443};
 444
 445struct stat_event {
 446        struct perf_event_header        header;
 447
 448        u64     id;
 449        u32     cpu;
 450        u32     thread;
 451
 452        union {
 453                struct {
 454                        u64 val;
 455                        u64 ena;
 456                        u64 run;
 457                };
 458                u64 values[3];
 459        };
 460};
 461
 462enum {
 463        PERF_STAT_ROUND_TYPE__INTERVAL  = 0,
 464        PERF_STAT_ROUND_TYPE__FINAL     = 1,
 465};
 466
 467struct stat_round_event {
 468        struct perf_event_header        header;
 469        u64                             type;
 470        u64                             time;
 471};
 472
 473struct time_conv_event {
 474        struct perf_event_header header;
 475        u64 time_shift;
 476        u64 time_mult;
 477        u64 time_zero;
 478};
 479
 480union perf_event {
 481        struct perf_event_header        header;
 482        struct mmap_event               mmap;
 483        struct mmap2_event              mmap2;
 484        struct comm_event               comm;
 485        struct fork_event               fork;
 486        struct lost_event               lost;
 487        struct lost_samples_event       lost_samples;
 488        struct read_event               read;
 489        struct throttle_event           throttle;
 490        struct sample_event             sample;
 491        struct attr_event               attr;
 492        struct event_update_event       event_update;
 493        struct event_type_event         event_type;
 494        struct tracing_data_event       tracing_data;
 495        struct build_id_event           build_id;
 496        struct id_index_event           id_index;
 497        struct auxtrace_info_event      auxtrace_info;
 498        struct auxtrace_event           auxtrace;
 499        struct auxtrace_error_event     auxtrace_error;
 500        struct aux_event                aux;
 501        struct itrace_start_event       itrace_start;
 502        struct context_switch_event     context_switch;
 503        struct thread_map_event         thread_map;
 504        struct cpu_map_event            cpu_map;
 505        struct stat_config_event        stat_config;
 506        struct stat_event               stat;
 507        struct stat_round_event         stat_round;
 508        struct time_conv_event          time_conv;
 509};
 510
 511void perf_event__print_totals(void);
 512
 513struct perf_tool;
 514struct thread_map;
 515struct cpu_map;
 516struct perf_stat_config;
 517struct perf_counts_values;
 518
 519typedef int (*perf_event__handler_t)(struct perf_tool *tool,
 520                                     union perf_event *event,
 521                                     struct perf_sample *sample,
 522                                     struct machine *machine);
 523
 524int perf_event__synthesize_thread_map(struct perf_tool *tool,
 525                                      struct thread_map *threads,
 526                                      perf_event__handler_t process,
 527                                      struct machine *machine, bool mmap_data,
 528                                      unsigned int proc_map_timeout);
 529int perf_event__synthesize_thread_map2(struct perf_tool *tool,
 530                                      struct thread_map *threads,
 531                                      perf_event__handler_t process,
 532                                      struct machine *machine);
 533int perf_event__synthesize_cpu_map(struct perf_tool *tool,
 534                                   struct cpu_map *cpus,
 535                                   perf_event__handler_t process,
 536                                   struct machine *machine);
 537int perf_event__synthesize_threads(struct perf_tool *tool,
 538                                   perf_event__handler_t process,
 539                                   struct machine *machine, bool mmap_data,
 540                                   unsigned int proc_map_timeout);
 541int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
 542                                       perf_event__handler_t process,
 543                                       struct machine *machine);
 544int perf_event__synthesize_stat_config(struct perf_tool *tool,
 545                                       struct perf_stat_config *config,
 546                                       perf_event__handler_t process,
 547                                       struct machine *machine);
 548void perf_event__read_stat_config(struct perf_stat_config *config,
 549                                  struct stat_config_event *event);
 550int perf_event__synthesize_stat(struct perf_tool *tool,
 551                                u32 cpu, u32 thread, u64 id,
 552                                struct perf_counts_values *count,
 553                                perf_event__handler_t process,
 554                                struct machine *machine);
 555int perf_event__synthesize_stat_round(struct perf_tool *tool,
 556                                      u64 time, u64 type,
 557                                      perf_event__handler_t process,
 558                                      struct machine *machine);
 559int perf_event__synthesize_modules(struct perf_tool *tool,
 560                                   perf_event__handler_t process,
 561                                   struct machine *machine);
 562
 563int perf_event__process_comm(struct perf_tool *tool,
 564                             union perf_event *event,
 565                             struct perf_sample *sample,
 566                             struct machine *machine);
 567int perf_event__process_lost(struct perf_tool *tool,
 568                             union perf_event *event,
 569                             struct perf_sample *sample,
 570                             struct machine *machine);
 571int perf_event__process_lost_samples(struct perf_tool *tool,
 572                                     union perf_event *event,
 573                                     struct perf_sample *sample,
 574                                     struct machine *machine);
 575int perf_event__process_aux(struct perf_tool *tool,
 576                            union perf_event *event,
 577                            struct perf_sample *sample,
 578                            struct machine *machine);
 579int perf_event__process_itrace_start(struct perf_tool *tool,
 580                                     union perf_event *event,
 581                                     struct perf_sample *sample,
 582                                     struct machine *machine);
 583int perf_event__process_switch(struct perf_tool *tool,
 584                               union perf_event *event,
 585                               struct perf_sample *sample,
 586                               struct machine *machine);
 587int perf_event__process_mmap(struct perf_tool *tool,
 588                             union perf_event *event,
 589                             struct perf_sample *sample,
 590                             struct machine *machine);
 591int perf_event__process_mmap2(struct perf_tool *tool,
 592                             union perf_event *event,
 593                             struct perf_sample *sample,
 594                             struct machine *machine);
 595int perf_event__process_fork(struct perf_tool *tool,
 596                             union perf_event *event,
 597                             struct perf_sample *sample,
 598                             struct machine *machine);
 599int perf_event__process_exit(struct perf_tool *tool,
 600                             union perf_event *event,
 601                             struct perf_sample *sample,
 602                             struct machine *machine);
 603int perf_event__process(struct perf_tool *tool,
 604                        union perf_event *event,
 605                        struct perf_sample *sample,
 606                        struct machine *machine);
 607
 608struct addr_location;
 609
 610int machine__resolve(struct machine *machine, struct addr_location *al,
 611                     struct perf_sample *sample);
 612
 613void addr_location__put(struct addr_location *al);
 614
 615struct thread;
 616
 617bool is_bts_event(struct perf_event_attr *attr);
 618bool sample_addr_correlates_sym(struct perf_event_attr *attr);
 619void thread__resolve(struct thread *thread, struct addr_location *al,
 620                     struct perf_sample *sample);
 621
 622const char *perf_event__name(unsigned int id);
 623
 624size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
 625                                     u64 read_format);
 626int perf_event__synthesize_sample(union perf_event *event, u64 type,
 627                                  u64 read_format,
 628                                  const struct perf_sample *sample,
 629                                  bool swapped);
 630
 631pid_t perf_event__synthesize_comm(struct perf_tool *tool,
 632                                  union perf_event *event, pid_t pid,
 633                                  perf_event__handler_t process,
 634                                  struct machine *machine);
 635
 636int perf_event__synthesize_mmap_events(struct perf_tool *tool,
 637                                       union perf_event *event,
 638                                       pid_t pid, pid_t tgid,
 639                                       perf_event__handler_t process,
 640                                       struct machine *machine,
 641                                       bool mmap_data,
 642                                       unsigned int proc_map_timeout);
 643
 644size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 645size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
 646size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
 647size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
 648size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp);
 649size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp);
 650size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp);
 651size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp);
 652size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp);
 653size_t perf_event__fprintf(union perf_event *event, FILE *fp);
 654
 655u64 kallsyms__get_function_start(const char *kallsyms_filename,
 656                                 const char *symbol_name);
 657
 658void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max);
 659void  cpu_map_data__synthesize(struct cpu_map_data *data, struct cpu_map *map,
 660                               u16 type, int max);
 661#endif /* __PERF_RECORD_H */
 662