This source file includes following definitions.
- auxtrace_mmap__read_snapshot_head
- auxtrace_mmap__read_head
- auxtrace_mmap__write_tail
- itrace_synth_opts__set_time_range
- itrace_synth_opts__clear_time_range
- auxtrace_record__init
- auxtrace_record__free
- auxtrace_record__options
- perf_session__auxtrace_error_inc
- events_stats__auxtrace_error_warn
- itrace_parse_synth_opts
- auxtrace_parse_snapshot_options
- auxtrace__process_event
- auxtrace__flush_events
- auxtrace__free_events
- auxtrace_cache__free
- auxtrace__free
- auxtrace_index__write
- auxtrace_index__process
- auxtrace_index__free
- auxtrace_parse_filters
- itrace_synth_opts__set_time_range
- itrace_synth_opts__clear_time_range
   1 
   2 
   3 
   4 
   5 
   6 
   7 #ifndef __PERF_AUXTRACE_H
   8 #define __PERF_AUXTRACE_H
   9 
  10 #include <sys/types.h>
  11 #include <errno.h>
  12 #include <stdbool.h>
  13 #include <stddef.h>
  14 #include <stdio.h> 
  15 #include <linux/list.h>
  16 #include <linux/perf_event.h>
  17 #include <linux/types.h>
  18 #include <asm/bitsperlong.h>
  19 #include <asm/barrier.h>
  20 
  21 union perf_event;
  22 struct perf_session;
  23 struct evlist;
  24 struct perf_tool;
  25 struct mmap;
  26 struct perf_sample;
  27 struct option;
  28 struct record_opts;
  29 struct perf_record_auxtrace_error;
  30 struct perf_record_auxtrace_info;
  31 struct events_stats;
  32 
  33 enum auxtrace_error_type {
  34        PERF_AUXTRACE_ERROR_ITRACE  = 1,
  35        PERF_AUXTRACE_ERROR_MAX
  36 };
  37 
  38 
  39 #define PERF_AUXTRACE_RECORD_ALIGNMENT 8
  40 
  41 enum auxtrace_type {
  42         PERF_AUXTRACE_UNKNOWN,
  43         PERF_AUXTRACE_INTEL_PT,
  44         PERF_AUXTRACE_INTEL_BTS,
  45         PERF_AUXTRACE_CS_ETM,
  46         PERF_AUXTRACE_ARM_SPE,
  47         PERF_AUXTRACE_S390_CPUMSF,
  48 };
  49 
  50 enum itrace_period_type {
  51         PERF_ITRACE_PERIOD_INSTRUCTIONS,
  52         PERF_ITRACE_PERIOD_TICKS,
  53         PERF_ITRACE_PERIOD_NANOSECS,
  54 };
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 
  86 struct itrace_synth_opts {
  87         bool                    set;
  88         bool                    default_no_sample;
  89         bool                    inject;
  90         bool                    instructions;
  91         bool                    branches;
  92         bool                    transactions;
  93         bool                    ptwrites;
  94         bool                    pwr_events;
  95         bool                    other_events;
  96         bool                    errors;
  97         bool                    dont_decode;
  98         bool                    log;
  99         bool                    calls;
 100         bool                    returns;
 101         bool                    callchain;
 102         bool                    thread_stack;
 103         bool                    last_branch;
 104         unsigned int            callchain_sz;
 105         unsigned int            last_branch_sz;
 106         unsigned long long      period;
 107         enum itrace_period_type period_type;
 108         unsigned long           initial_skip;
 109         unsigned long           *cpu_bitmap;
 110         struct perf_time_interval *ptime_range;
 111         int                     range_num;
 112 };
 113 
 114 
 115 
 116 
 117 
 118 
 119 
 120 struct auxtrace_index_entry {
 121         u64                     file_offset;
 122         u64                     sz;
 123 };
 124 
 125 #define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256
 126 
 127 
 128 
 129 
 130 
 131 
 132 
 133 
 134 struct auxtrace_index {
 135         struct list_head        list;
 136         size_t                  nr;
 137         struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT];
 138 };
 139 
 140 
 141 
 142 
 143 
 144 
 145 
 146 
 147 
 148 struct auxtrace {
 149         int (*process_event)(struct perf_session *session,
 150                              union perf_event *event,
 151                              struct perf_sample *sample,
 152                              struct perf_tool *tool);
 153         int (*process_auxtrace_event)(struct perf_session *session,
 154                                       union perf_event *event,
 155                                       struct perf_tool *tool);
 156         int (*flush_events)(struct perf_session *session,
 157                             struct perf_tool *tool);
 158         void (*free_events)(struct perf_session *session);
 159         void (*free)(struct perf_session *session);
 160 };
 161 
 162 
 163 
 164 
 165 
 166 
 167 
 168 
 169 
 170 
 171 
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 
 180 
 181 
 182 
 183 
 184 
 185 struct auxtrace_buffer {
 186         struct list_head        list;
 187         size_t                  size;
 188         pid_t                   pid;
 189         pid_t                   tid;
 190         int                     cpu;
 191         void                    *data;
 192         off_t                   data_offset;
 193         void                    *mmap_addr;
 194         size_t                  mmap_size;
 195         bool                    data_needs_freeing;
 196         bool                    consecutive;
 197         u64                     offset;
 198         u64                     reference;
 199         u64                     buffer_nr;
 200         size_t                  use_size;
 201         void                    *use_data;
 202 };
 203 
 204 
 205 
 206 
 207 
 208 
 209 
 210 
 211 
 212 struct auxtrace_queue {
 213         struct list_head        head;
 214         pid_t                   tid;
 215         int                     cpu;
 216         bool                    set;
 217         void                    *priv;
 218 };
 219 
 220 
 221 
 222 
 223 
 224 
 225 
 226 
 227 
 228 struct auxtrace_queues {
 229         struct auxtrace_queue   *queue_array;
 230         unsigned int            nr_queues;
 231         bool                    new_data;
 232         bool                    populated;
 233         u64                     next_buffer_nr;
 234 };
 235 
 236 
 237 
 238 
 239 
 240 
 241 
 242 struct auxtrace_heap_item {
 243         unsigned int            queue_nr;
 244         u64                     ordinal;
 245 };
 246 
 247 
 248 
 249 
 250 
 251 
 252 
 253 struct auxtrace_heap {
 254         struct auxtrace_heap_item       *heap_array;
 255         unsigned int            heap_cnt;
 256         unsigned int            heap_sz;
 257 };
 258 
 259 
 260 
 261 
 262 
 263 
 264 
 265 
 266 
 267 
 268 
 269 
 270 
 271 struct auxtrace_mmap {
 272         void            *base;
 273         void            *userpg;
 274         size_t          mask;
 275         size_t          len;
 276         u64             prev;
 277         int             idx;
 278         pid_t           tid;
 279         int             cpu;
 280 };
 281 
 282 
 283 
 284 
 285 
 286 
 287 
 288 
 289 
 290 
 291 
 292 
 293 struct auxtrace_mmap_params {
 294         size_t          mask;
 295         off_t           offset;
 296         size_t          len;
 297         int             prot;
 298         int             idx;
 299         pid_t           tid;
 300         int             cpu;
 301 };
 302 
 303 
 304 
 305 
 306 
 307 
 308 
 309 
 310 
 311 
 312 
 313 
 314 
 315 
 316 
 317 struct auxtrace_record {
 318         int (*recording_options)(struct auxtrace_record *itr,
 319                                  struct evlist *evlist,
 320                                  struct record_opts *opts);
 321         size_t (*info_priv_size)(struct auxtrace_record *itr,
 322                                  struct evlist *evlist);
 323         int (*info_fill)(struct auxtrace_record *itr,
 324                          struct perf_session *session,
 325                          struct perf_record_auxtrace_info *auxtrace_info,
 326                          size_t priv_size);
 327         void (*free)(struct auxtrace_record *itr);
 328         int (*snapshot_start)(struct auxtrace_record *itr);
 329         int (*snapshot_finish)(struct auxtrace_record *itr);
 330         int (*find_snapshot)(struct auxtrace_record *itr, int idx,
 331                              struct auxtrace_mmap *mm, unsigned char *data,
 332                              u64 *head, u64 *old);
 333         int (*parse_snapshot_options)(struct auxtrace_record *itr,
 334                                       struct record_opts *opts,
 335                                       const char *str);
 336         u64 (*reference)(struct auxtrace_record *itr);
 337         int (*read_finish)(struct auxtrace_record *itr, int idx);
 338         unsigned int alignment;
 339 };
 340 
 341 
 342 
 343 
 344 
 345 
 346 
 347 
 348 
 349 
 350 
 351 
 352 
 353 
 354 
 355 
 356 
 357 
 358 struct addr_filter {
 359         struct list_head        list;
 360         bool                    range;
 361         bool                    start;
 362         const char              *action;
 363         const char              *sym_from;
 364         const char              *sym_to;
 365         int                     sym_from_idx;
 366         int                     sym_to_idx;
 367         u64                     addr;
 368         u64                     size;
 369         const char              *filename;
 370         char                    *str;
 371 };
 372 
 373 
 374 
 375 
 376 
 377 
 378 struct addr_filters {
 379         struct list_head        head;
 380         int                     cnt;
 381 };
 382 
 383 struct auxtrace_cache;
 384 
 385 #ifdef HAVE_AUXTRACE_SUPPORT
 386 
 387 
 388 
 389 
 390 
 391 
 392 
 393 static inline u64 auxtrace_mmap__read_snapshot_head(struct auxtrace_mmap *mm)
 394 {
 395         struct perf_event_mmap_page *pc = mm->userpg;
 396         u64 head = READ_ONCE(pc->aux_head);
 397 
 398         
 399         rmb();
 400         return head;
 401 }
 402 
 403 static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm)
 404 {
 405         struct perf_event_mmap_page *pc = mm->userpg;
 406 #if BITS_PER_LONG == 64 || !defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT)
 407         u64 head = READ_ONCE(pc->aux_head);
 408 #else
 409         u64 head = __sync_val_compare_and_swap(&pc->aux_head, 0, 0);
 410 #endif
 411 
 412         
 413         rmb();
 414         return head;
 415 }
 416 
 417 static inline void auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail)
 418 {
 419         struct perf_event_mmap_page *pc = mm->userpg;
 420 #if BITS_PER_LONG != 64 && defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT)
 421         u64 old_tail;
 422 #endif
 423 
 424         
 425         mb();
 426 #if BITS_PER_LONG == 64 || !defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT)
 427         pc->aux_tail = tail;
 428 #else
 429         do {
 430                 old_tail = __sync_val_compare_and_swap(&pc->aux_tail, 0, 0);
 431         } while (!__sync_bool_compare_and_swap(&pc->aux_tail, old_tail, tail));
 432 #endif
 433 }
 434 
 435 int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
 436                         struct auxtrace_mmap_params *mp,
 437                         void *userpg, int fd);
 438 void auxtrace_mmap__munmap(struct auxtrace_mmap *mm);
 439 void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
 440                                 off_t auxtrace_offset,
 441                                 unsigned int auxtrace_pages,
 442                                 bool auxtrace_overwrite);
 443 void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
 444                                    struct evlist *evlist, int idx,
 445                                    bool per_cpu);
 446 
 447 typedef int (*process_auxtrace_t)(struct perf_tool *tool,
 448                                   struct mmap *map,
 449                                   union perf_event *event, void *data1,
 450                                   size_t len1, void *data2, size_t len2);
 451 
 452 int auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr,
 453                         struct perf_tool *tool, process_auxtrace_t fn);
 454 
 455 int auxtrace_mmap__read_snapshot(struct mmap *map,
 456                                  struct auxtrace_record *itr,
 457                                  struct perf_tool *tool, process_auxtrace_t fn,
 458                                  size_t snapshot_size);
 459 
 460 int auxtrace_queues__init(struct auxtrace_queues *queues);
 461 int auxtrace_queues__add_event(struct auxtrace_queues *queues,
 462                                struct perf_session *session,
 463                                union perf_event *event, off_t data_offset,
 464                                struct auxtrace_buffer **buffer_ptr);
 465 void auxtrace_queues__free(struct auxtrace_queues *queues);
 466 int auxtrace_queues__process_index(struct auxtrace_queues *queues,
 467                                    struct perf_session *session);
 468 struct auxtrace_buffer *auxtrace_buffer__next(struct auxtrace_queue *queue,
 469                                               struct auxtrace_buffer *buffer);
 470 void *auxtrace_buffer__get_data(struct auxtrace_buffer *buffer, int fd);
 471 void auxtrace_buffer__put_data(struct auxtrace_buffer *buffer);
 472 void auxtrace_buffer__drop_data(struct auxtrace_buffer *buffer);
 473 void auxtrace_buffer__free(struct auxtrace_buffer *buffer);
 474 
 475 int auxtrace_heap__add(struct auxtrace_heap *heap, unsigned int queue_nr,
 476                        u64 ordinal);
 477 void auxtrace_heap__pop(struct auxtrace_heap *heap);
 478 void auxtrace_heap__free(struct auxtrace_heap *heap);
 479 
 480 struct auxtrace_cache_entry {
 481         struct hlist_node hash;
 482         u32 key;
 483 };
 484 
 485 struct auxtrace_cache *auxtrace_cache__new(unsigned int bits, size_t entry_size,
 486                                            unsigned int limit_percent);
 487 void auxtrace_cache__free(struct auxtrace_cache *auxtrace_cache);
 488 void *auxtrace_cache__alloc_entry(struct auxtrace_cache *c);
 489 void auxtrace_cache__free_entry(struct auxtrace_cache *c, void *entry);
 490 int auxtrace_cache__add(struct auxtrace_cache *c, u32 key,
 491                         struct auxtrace_cache_entry *entry);
 492 void *auxtrace_cache__lookup(struct auxtrace_cache *c, u32 key);
 493 
 494 struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
 495                                               int *err);
 496 
 497 int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,
 498                                     struct record_opts *opts,
 499                                     const char *str);
 500 int auxtrace_record__options(struct auxtrace_record *itr,
 501                              struct evlist *evlist,
 502                              struct record_opts *opts);
 503 size_t auxtrace_record__info_priv_size(struct auxtrace_record *itr,
 504                                        struct evlist *evlist);
 505 int auxtrace_record__info_fill(struct auxtrace_record *itr,
 506                                struct perf_session *session,
 507                                struct perf_record_auxtrace_info *auxtrace_info,
 508                                size_t priv_size);
 509 void auxtrace_record__free(struct auxtrace_record *itr);
 510 int auxtrace_record__snapshot_start(struct auxtrace_record *itr);
 511 int auxtrace_record__snapshot_finish(struct auxtrace_record *itr, bool on_exit);
 512 int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,
 513                                    struct auxtrace_mmap *mm,
 514                                    unsigned char *data, u64 *head, u64 *old);
 515 u64 auxtrace_record__reference(struct auxtrace_record *itr);
 516 
 517 int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event,
 518                                    off_t file_offset);
 519 int auxtrace_index__write(int fd, struct list_head *head);
 520 int auxtrace_index__process(int fd, u64 size, struct perf_session *session,
 521                             bool needs_swap);
 522 void auxtrace_index__free(struct list_head *head);
 523 
 524 void auxtrace_synth_error(struct perf_record_auxtrace_error *auxtrace_error, int type,
 525                           int code, int cpu, pid_t pid, pid_t tid, u64 ip,
 526                           const char *msg, u64 timestamp);
 527 
 528 int perf_event__process_auxtrace_info(struct perf_session *session,
 529                                       union perf_event *event);
 530 s64 perf_event__process_auxtrace(struct perf_session *session,
 531                                  union perf_event *event);
 532 int perf_event__process_auxtrace_error(struct perf_session *session,
 533                                        union perf_event *event);
 534 int itrace_parse_synth_opts(const struct option *opt, const char *str,
 535                             int unset);
 536 void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts,
 537                                     bool no_sample);
 538 
 539 size_t perf_event__fprintf_auxtrace_error(union perf_event *event, FILE *fp);
 540 void perf_session__auxtrace_error_inc(struct perf_session *session,
 541                                       union perf_event *event);
 542 void events_stats__auxtrace_error_warn(const struct events_stats *stats);
 543 
 544 void addr_filters__init(struct addr_filters *filts);
 545 void addr_filters__exit(struct addr_filters *filts);
 546 int addr_filters__parse_bare_filter(struct addr_filters *filts,
 547                                     const char *filter);
 548 int auxtrace_parse_filters(struct evlist *evlist);
 549 
 550 int auxtrace__process_event(struct perf_session *session, union perf_event *event,
 551                             struct perf_sample *sample, struct perf_tool *tool);
 552 int auxtrace__flush_events(struct perf_session *session, struct perf_tool *tool);
 553 void auxtrace__free_events(struct perf_session *session);
 554 void auxtrace__free(struct perf_session *session);
 555 
 556 #define ITRACE_HELP \
 557 "                               i:                      synthesize instructions events\n"               \
 558 "                               b:                      synthesize branches events\n"           \
 559 "                               c:                      synthesize branches events (calls only)\n"      \
 560 "                               r:                      synthesize branches events (returns only)\n" \
 561 "                               x:                      synthesize transactions events\n"               \
 562 "                               w:                      synthesize ptwrite events\n"            \
 563 "                               p:                      synthesize power events\n"                      \
 564 "                               e:                      synthesize error events\n"                      \
 565 "                               d:                      create a debug log\n"                   \
 566 "                               g[len]:                 synthesize a call chain (use with i or x)\n" \
 567 "                               l[len]:                 synthesize last branch entries (use with i or x)\n" \
 568 "                               sNUMBER:                skip initial number of events\n"                \
 569 "                               PERIOD[ns|us|ms|i|t]:   specify period to sample stream\n" \
 570 "                               concatenate multiple options. Default is ibxwpe or cewp\n"
 571 
 572 static inline
 573 void itrace_synth_opts__set_time_range(struct itrace_synth_opts *opts,
 574                                        struct perf_time_interval *ptime_range,
 575                                        int range_num)
 576 {
 577         opts->ptime_range = ptime_range;
 578         opts->range_num = range_num;
 579 }
 580 
 581 static inline
 582 void itrace_synth_opts__clear_time_range(struct itrace_synth_opts *opts)
 583 {
 584         opts->ptime_range = NULL;
 585         opts->range_num = 0;
 586 }
 587 
 588 #else
 589 #include "debug.h"
 590 
 591 static inline struct auxtrace_record *
 592 auxtrace_record__init(struct evlist *evlist __maybe_unused,
 593                       int *err)
 594 {
 595         *err = 0;
 596         return NULL;
 597 }
 598 
 599 static inline
 600 void auxtrace_record__free(struct auxtrace_record *itr __maybe_unused)
 601 {
 602 }
 603 
 604 static inline
 605 int auxtrace_record__options(struct auxtrace_record *itr __maybe_unused,
 606                              struct evlist *evlist __maybe_unused,
 607                              struct record_opts *opts __maybe_unused)
 608 {
 609         return 0;
 610 }
 611 
 612 #define perf_event__process_auxtrace_info               0
 613 #define perf_event__process_auxtrace                    0
 614 #define perf_event__process_auxtrace_error              0
 615 
 616 static inline
 617 void perf_session__auxtrace_error_inc(struct perf_session *session
 618                                       __maybe_unused,
 619                                       union perf_event *event
 620                                       __maybe_unused)
 621 {
 622 }
 623 
 624 static inline
 625 void events_stats__auxtrace_error_warn(const struct events_stats *stats
 626                                        __maybe_unused)
 627 {
 628 }
 629 
 630 static inline
 631 int itrace_parse_synth_opts(const struct option *opt __maybe_unused,
 632                             const char *str __maybe_unused,
 633                             int unset __maybe_unused)
 634 {
 635         pr_err("AUX area tracing not supported\n");
 636         return -EINVAL;
 637 }
 638 
 639 static inline
 640 int auxtrace_parse_snapshot_options(struct auxtrace_record *itr __maybe_unused,
 641                                     struct record_opts *opts __maybe_unused,
 642                                     const char *str)
 643 {
 644         if (!str)
 645                 return 0;
 646         pr_err("AUX area tracing not supported\n");
 647         return -EINVAL;
 648 }
 649 
 650 static inline
 651 int auxtrace__process_event(struct perf_session *session __maybe_unused,
 652                             union perf_event *event __maybe_unused,
 653                             struct perf_sample *sample __maybe_unused,
 654                             struct perf_tool *tool __maybe_unused)
 655 {
 656         return 0;
 657 }
 658 
 659 static inline
 660 int auxtrace__flush_events(struct perf_session *session __maybe_unused,
 661                            struct perf_tool *tool __maybe_unused)
 662 {
 663         return 0;
 664 }
 665 
 666 static inline
 667 void auxtrace__free_events(struct perf_session *session __maybe_unused)
 668 {
 669 }
 670 
 671 static inline
 672 void auxtrace_cache__free(struct auxtrace_cache *auxtrace_cache __maybe_unused)
 673 {
 674 }
 675 
 676 static inline
 677 void auxtrace__free(struct perf_session *session __maybe_unused)
 678 {
 679 }
 680 
 681 static inline
 682 int auxtrace_index__write(int fd __maybe_unused,
 683                           struct list_head *head __maybe_unused)
 684 {
 685         return -EINVAL;
 686 }
 687 
 688 static inline
 689 int auxtrace_index__process(int fd __maybe_unused,
 690                             u64 size __maybe_unused,
 691                             struct perf_session *session __maybe_unused,
 692                             bool needs_swap __maybe_unused)
 693 {
 694         return -EINVAL;
 695 }
 696 
 697 static inline
 698 void auxtrace_index__free(struct list_head *head __maybe_unused)
 699 {
 700 }
 701 
 702 static inline
 703 int auxtrace_parse_filters(struct evlist *evlist __maybe_unused)
 704 {
 705         return 0;
 706 }
 707 
 708 int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
 709                         struct auxtrace_mmap_params *mp,
 710                         void *userpg, int fd);
 711 void auxtrace_mmap__munmap(struct auxtrace_mmap *mm);
 712 void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
 713                                 off_t auxtrace_offset,
 714                                 unsigned int auxtrace_pages,
 715                                 bool auxtrace_overwrite);
 716 void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
 717                                    struct evlist *evlist, int idx,
 718                                    bool per_cpu);
 719 
 720 #define ITRACE_HELP ""
 721 
 722 static inline
 723 void itrace_synth_opts__set_time_range(struct itrace_synth_opts *opts
 724                                        __maybe_unused,
 725                                        struct perf_time_interval *ptime_range
 726                                        __maybe_unused,
 727                                        int range_num __maybe_unused)
 728 {
 729 }
 730 
 731 static inline
 732 void itrace_synth_opts__clear_time_range(struct itrace_synth_opts *opts
 733                                          __maybe_unused)
 734 {
 735 }
 736 
 737 #endif
 738 
 739 #endif