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