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