1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __PERF_RECORD_H 3 #define __PERF_RECORD_H 4 5 #include <limits.h> 6 #include <stdio.h> 7 #include <linux/kernel.h> 8 9 #include "../perf.h" 10 #include "build-id.h" 11 #include "perf_regs.h" 12 13 struct mmap_event { 14 struct perf_event_header header; 15 u32 pid, tid; 16 u64 start; 17 u64 len; 18 u64 pgoff; 19 char filename[PATH_MAX]; 20 }; 21 22 struct mmap2_event { 23 struct perf_event_header header; 24 u32 pid, tid; 25 u64 start; 26 u64 len; 27 u64 pgoff; 28 u32 maj; 29 u32 min; 30 u64 ino; 31 u64 ino_generation; 32 u32 prot; 33 u32 flags; 34 char filename[PATH_MAX]; 35 }; 36 37 struct comm_event { 38 struct perf_event_header header; 39 u32 pid, tid; 40 char comm[16]; 41 }; 42 43 struct namespaces_event { 44 struct perf_event_header header; 45 u32 pid, tid; 46 u64 nr_namespaces; 47 struct perf_ns_link_info link_info[]; 48 }; 49 50 struct fork_event { 51 struct perf_event_header header; 52 u32 pid, ppid; 53 u32 tid, ptid; 54 u64 time; 55 }; 56 57 struct lost_event { 58 struct perf_event_header header; 59 u64 id; 60 u64 lost; 61 }; 62 63 struct lost_samples_event { 64 struct perf_event_header header; 65 u64 lost; 66 }; 67 68 /* 69 * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID 70 */ 71 struct read_event { 72 struct perf_event_header header; 73 u32 pid, tid; 74 u64 value; 75 u64 time_enabled; 76 u64 time_running; 77 u64 id; 78 }; 79 80 struct throttle_event { 81 struct perf_event_header header; 82 u64 time; 83 u64 id; 84 u64 stream_id; 85 }; 86 87 #define PERF_SAMPLE_MASK \ 88 (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ 89 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \ 90 PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \ 91 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD | \ 92 PERF_SAMPLE_IDENTIFIER) 93 94 /* perf sample has 16 bits size limit */ 95 #define PERF_SAMPLE_MAX_SIZE (1 << 16) 96 97 struct sample_event { 98 struct perf_event_header header; 99 u64 array[]; 100 }; 101 102 struct regs_dump { 103 u64 abi; 104 u64 mask; 105 u64 *regs; 106 107 /* Cached values/mask filled by first register access. */ 108 u64 cache_regs[PERF_REGS_MAX]; 109 u64 cache_mask; 110 }; 111 112 struct stack_dump { 113 u16 offset; 114 u64 size; 115 char *data; 116 }; 117 118 struct sample_read_value { 119 u64 value; 120 u64 id; 121 }; 122 123 struct sample_read { 124 u64 time_enabled; 125 u64 time_running; 126 union { 127 struct { 128 u64 nr; 129 struct sample_read_value *values; 130 } group; 131 struct sample_read_value one; 132 }; 133 }; 134 135 struct ip_callchain { 136 u64 nr; 137 u64 ips[0]; 138 }; 139 140 struct branch_flags { 141 u64 mispred:1; 142 u64 predicted:1; 143 u64 in_tx:1; 144 u64 abort:1; 145 u64 cycles:16; 146 u64 type:4; 147 u64 reserved:40; 148 }; 149 150 struct branch_entry { 151 u64 from; 152 u64 to; 153 struct branch_flags flags; 154 }; 155 156 struct branch_stack { 157 u64 nr; 158 struct branch_entry entries[0]; 159 }; 160 161 enum { 162 PERF_IP_FLAG_BRANCH = 1ULL << 0, 163 PERF_IP_FLAG_CALL = 1ULL << 1, 164 PERF_IP_FLAG_RETURN = 1ULL << 2, 165 PERF_IP_FLAG_CONDITIONAL = 1ULL << 3, 166 PERF_IP_FLAG_SYSCALLRET = 1ULL << 4, 167 PERF_IP_FLAG_ASYNC = 1ULL << 5, 168 PERF_IP_FLAG_INTERRUPT = 1ULL << 6, 169 PERF_IP_FLAG_TX_ABORT = 1ULL << 7, 170 PERF_IP_FLAG_TRACE_BEGIN = 1ULL << 8, 171 PERF_IP_FLAG_TRACE_END = 1ULL << 9, 172 PERF_IP_FLAG_IN_TX = 1ULL << 10, 173 }; 174 175 #define PERF_IP_FLAG_CHARS "bcrosyiABEx" 176 177 #define PERF_BRANCH_MASK (\ 178 PERF_IP_FLAG_BRANCH |\ 179 PERF_IP_FLAG_CALL |\ 180 PERF_IP_FLAG_RETURN |\ 181 PERF_IP_FLAG_CONDITIONAL |\ 182 PERF_IP_FLAG_SYSCALLRET |\ 183 PERF_IP_FLAG_ASYNC |\ 184 PERF_IP_FLAG_INTERRUPT |\ 185 PERF_IP_FLAG_TX_ABORT |\ 186 PERF_IP_FLAG_TRACE_BEGIN |\ 187 PERF_IP_FLAG_TRACE_END) 188 189 #define MAX_INSN 16 190 191 struct perf_sample { 192 u64 ip; 193 u32 pid, tid; 194 u64 time; 195 u64 addr; 196 u64 id; 197 u64 stream_id; 198 u64 period; 199 u64 weight; 200 u64 transaction; 201 u32 cpu; 202 u32 raw_size; 203 u64 data_src; 204 u64 phys_addr; 205 u32 flags; 206 u16 insn_len; 207 u8 cpumode; 208 char insn[MAX_INSN]; 209 void *raw_data; 210 struct ip_callchain *callchain; 211 struct branch_stack *branch_stack; 212 struct regs_dump user_regs; 213 struct regs_dump intr_regs; 214 struct stack_dump user_stack; 215 struct sample_read read; 216 }; 217 218 #define PERF_MEM_DATA_SRC_NONE \ 219 (PERF_MEM_S(OP, NA) |\ 220 PERF_MEM_S(LVL, NA) |\ 221 PERF_MEM_S(SNOOP, NA) |\ 222 PERF_MEM_S(LOCK, NA) |\ 223 PERF_MEM_S(TLB, NA)) 224 225 struct build_id_event { 226 struct perf_event_header header; 227 pid_t pid; 228 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 229 char filename[]; 230 }; 231 232 enum perf_user_event_type { /* above any possible kernel type */ 233 PERF_RECORD_USER_TYPE_START = 64, 234 PERF_RECORD_HEADER_ATTR = 64, 235 PERF_RECORD_HEADER_EVENT_TYPE = 65, /* deprecated */ 236 PERF_RECORD_HEADER_TRACING_DATA = 66, 237 PERF_RECORD_HEADER_BUILD_ID = 67, 238 PERF_RECORD_FINISHED_ROUND = 68, 239 PERF_RECORD_ID_INDEX = 69, 240 PERF_RECORD_AUXTRACE_INFO = 70, 241 PERF_RECORD_AUXTRACE = 71, 242 PERF_RECORD_AUXTRACE_ERROR = 72, 243 PERF_RECORD_THREAD_MAP = 73, 244 PERF_RECORD_CPU_MAP = 74, 245 PERF_RECORD_STAT_CONFIG = 75, 246 PERF_RECORD_STAT = 76, 247 PERF_RECORD_STAT_ROUND = 77, 248 PERF_RECORD_EVENT_UPDATE = 78, 249 PERF_RECORD_TIME_CONV = 79, 250 PERF_RECORD_HEADER_FEATURE = 80, 251 PERF_RECORD_HEADER_MAX 252 }; 253 254 enum auxtrace_error_type { 255 PERF_AUXTRACE_ERROR_ITRACE = 1, 256 PERF_AUXTRACE_ERROR_MAX 257 }; 258 259 /* Attribute type for custom synthesized events */ 260 #define PERF_TYPE_SYNTH (INT_MAX + 1U) 261 262 /* Attribute config for custom synthesized events */ 263 enum perf_synth_id { 264 PERF_SYNTH_INTEL_PTWRITE, 265 PERF_SYNTH_INTEL_MWAIT, 266 PERF_SYNTH_INTEL_PWRE, 267 PERF_SYNTH_INTEL_EXSTOP, 268 PERF_SYNTH_INTEL_PWRX, 269 PERF_SYNTH_INTEL_CBR, 270 }; 271 272 /* 273 * Raw data formats for synthesized events. Note that 4 bytes of padding are 274 * present to match the 'size' member of PERF_SAMPLE_RAW data which is always 275 * 8-byte aligned. That means we must dereference raw_data with an offset of 4. 276 * Refer perf_sample__synth_ptr() and perf_synth__raw_data(). It also means the 277 * structure sizes are 4 bytes bigger than the raw_size, refer 278 * perf_synth__raw_size(). 279 */ 280 281 struct perf_synth_intel_ptwrite { 282 u32 padding; 283 union { 284 struct { 285 u32 ip : 1, 286 reserved : 31; 287 }; 288 u32 flags; 289 }; 290 u64 payload; 291 }; 292 293 struct perf_synth_intel_mwait { 294 u32 padding; 295 u32 reserved; 296 union { 297 struct { 298 u64 hints : 8, 299 reserved1 : 24, 300 extensions : 2, 301 reserved2 : 30; 302 }; 303 u64 payload; 304 }; 305 }; 306 307 struct perf_synth_intel_pwre { 308 u32 padding; 309 u32 reserved; 310 union { 311 struct { 312 u64 reserved1 : 7, 313 hw : 1, 314 subcstate : 4, 315 cstate : 4, 316 reserved2 : 48; 317 }; 318 u64 payload; 319 }; 320 }; 321 322 struct perf_synth_intel_exstop { 323 u32 padding; 324 union { 325 struct { 326 u32 ip : 1, 327 reserved : 31; 328 }; 329 u32 flags; 330 }; 331 }; 332 333 struct perf_synth_intel_pwrx { 334 u32 padding; 335 u32 reserved; 336 union { 337 struct { 338 u64 deepest_cstate : 4, 339 last_cstate : 4, 340 wake_reason : 4, 341 reserved1 : 52; 342 }; 343 u64 payload; 344 }; 345 }; 346 347 struct perf_synth_intel_cbr { 348 u32 padding; 349 union { 350 struct { 351 u32 cbr : 8, 352 reserved1 : 8, 353 max_nonturbo : 8, 354 reserved2 : 8; 355 }; 356 u32 flags; 357 }; 358 u32 freq; 359 u32 reserved3; 360 }; 361 362 /* 363 * raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get 364 * 8-byte alignment. 365 */ 366 static inline void *perf_sample__synth_ptr(struct perf_sample *sample) 367 { 368 return sample->raw_data - 4; 369 } 370 371 static inline void *perf_synth__raw_data(void *p) 372 { 373 return p + 4; 374 } 375 376 #define perf_synth__raw_size(d) (sizeof(d) - 4) 377 378 #define perf_sample__bad_synth_size(s, d) ((s)->raw_size < sizeof(d) - 4) 379 380 /* 381 * The kernel collects the number of events it couldn't send in a stretch and 382 * when possible sends this number in a PERF_RECORD_LOST event. The number of 383 * such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while 384 * total_lost tells exactly how many events the kernel in fact lost, i.e. it is 385 * the sum of all struct lost_event.lost fields reported. 386 * 387 * The kernel discards mixed up samples and sends the number in a 388 * PERF_RECORD_LOST_SAMPLES event. The number of lost-samples events is stored 389 * in .nr_events[PERF_RECORD_LOST_SAMPLES] while total_lost_samples tells 390 * exactly how many samples the kernel in fact dropped, i.e. it is the sum of 391 * all struct lost_samples_event.lost fields reported. 392 * 393 * The total_period is needed because by default auto-freq is used, so 394 * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get 395 * the total number of low level events, it is necessary to to sum all struct 396 * sample_event.period and stash the result in total_period. 397 */ 398 struct events_stats { 399 u64 total_period; 400 u64 total_non_filtered_period; 401 u64 total_lost; 402 u64 total_lost_samples; 403 u64 total_aux_lost; 404 u64 total_aux_partial; 405 u64 total_invalid_chains; 406 u32 nr_events[PERF_RECORD_HEADER_MAX]; 407 u32 nr_non_filtered_samples; 408 u32 nr_lost_warned; 409 u32 nr_unknown_events; 410 u32 nr_invalid_chains; 411 u32 nr_unknown_id; 412 u32 nr_unprocessable_samples; 413 u32 nr_auxtrace_errors[PERF_AUXTRACE_ERROR_MAX]; 414 u32 nr_proc_map_timeout; 415 }; 416 417 enum { 418 PERF_CPU_MAP__CPUS = 0, 419 PERF_CPU_MAP__MASK = 1, 420 }; 421 422 struct cpu_map_entries { 423 u16 nr; 424 u16 cpu[]; 425 }; 426 427 struct cpu_map_mask { 428 u16 nr; 429 u16 long_size; 430 unsigned long mask[]; 431 }; 432 433 struct cpu_map_data { 434 u16 type; 435 char data[]; 436 }; 437 438 struct cpu_map_event { 439 struct perf_event_header header; 440 struct cpu_map_data data; 441 }; 442 443 struct attr_event { 444 struct perf_event_header header; 445 struct perf_event_attr attr; 446 u64 id[]; 447 }; 448 449 enum { 450 PERF_EVENT_UPDATE__UNIT = 0, 451 PERF_EVENT_UPDATE__SCALE = 1, 452 PERF_EVENT_UPDATE__NAME = 2, 453 PERF_EVENT_UPDATE__CPUS = 3, 454 }; 455 456 struct event_update_event_cpus { 457 struct cpu_map_data cpus; 458 }; 459 460 struct event_update_event_scale { 461 double scale; 462 }; 463 464 struct event_update_event { 465 struct perf_event_header header; 466 u64 type; 467 u64 id; 468 469 char data[]; 470 }; 471 472 #define MAX_EVENT_NAME 64 473 474 struct perf_trace_event_type { 475 u64 event_id; 476 char name[MAX_EVENT_NAME]; 477 }; 478 479 struct event_type_event { 480 struct perf_event_header header; 481 struct perf_trace_event_type event_type; 482 }; 483 484 struct tracing_data_event { 485 struct perf_event_header header; 486 u32 size; 487 }; 488 489 struct id_index_entry { 490 u64 id; 491 u64 idx; 492 u64 cpu; 493 u64 tid; 494 }; 495 496 struct id_index_event { 497 struct perf_event_header header; 498 u64 nr; 499 struct id_index_entry entries[0]; 500 }; 501 502 struct auxtrace_info_event { 503 struct perf_event_header header; 504 u32 type; 505 u32 reserved__; /* For alignment */ 506 u64 priv[]; 507 }; 508 509 struct auxtrace_event { 510 struct perf_event_header header; 511 u64 size; 512 u64 offset; 513 u64 reference; 514 u32 idx; 515 u32 tid; 516 u32 cpu; 517 u32 reserved__; /* For alignment */ 518 }; 519 520 #define MAX_AUXTRACE_ERROR_MSG 64 521 522 struct auxtrace_error_event { 523 struct perf_event_header header; 524 u32 type; 525 u32 code; 526 u32 cpu; 527 u32 pid; 528 u32 tid; 529 u32 reserved__; /* For alignment */ 530 u64 ip; 531 char msg[MAX_AUXTRACE_ERROR_MSG]; 532 }; 533 534 struct aux_event { 535 struct perf_event_header header; 536 u64 aux_offset; 537 u64 aux_size; 538 u64 flags; 539 }; 540 541 struct itrace_start_event { 542 struct perf_event_header header; 543 u32 pid, tid; 544 }; 545 546 struct context_switch_event { 547 struct perf_event_header header; 548 u32 next_prev_pid; 549 u32 next_prev_tid; 550 }; 551 552 struct thread_map_event_entry { 553 u64 pid; 554 char comm[16]; 555 }; 556 557 struct thread_map_event { 558 struct perf_event_header header; 559 u64 nr; 560 struct thread_map_event_entry entries[]; 561 }; 562 563 enum { 564 PERF_STAT_CONFIG_TERM__AGGR_MODE = 0, 565 PERF_STAT_CONFIG_TERM__INTERVAL = 1, 566 PERF_STAT_CONFIG_TERM__SCALE = 2, 567 PERF_STAT_CONFIG_TERM__MAX = 3, 568 }; 569 570 struct stat_config_event_entry { 571 u64 tag; 572 u64 val; 573 }; 574 575 struct stat_config_event { 576 struct perf_event_header header; 577 u64 nr; 578 struct stat_config_event_entry data[]; 579 }; 580 581 struct stat_event { 582 struct perf_event_header header; 583 584 u64 id; 585 u32 cpu; 586 u32 thread; 587 588 union { 589 struct { 590 u64 val; 591 u64 ena; 592 u64 run; 593 }; 594 u64 values[3]; 595 }; 596 }; 597 598 enum { 599 PERF_STAT_ROUND_TYPE__INTERVAL = 0, 600 PERF_STAT_ROUND_TYPE__FINAL = 1, 601 }; 602 603 struct stat_round_event { 604 struct perf_event_header header; 605 u64 type; 606 u64 time; 607 }; 608 609 struct time_conv_event { 610 struct perf_event_header header; 611 u64 time_shift; 612 u64 time_mult; 613 u64 time_zero; 614 }; 615 616 struct feature_event { 617 struct perf_event_header header; 618 u64 feat_id; 619 char data[]; 620 }; 621 622 union perf_event { 623 struct perf_event_header header; 624 struct mmap_event mmap; 625 struct mmap2_event mmap2; 626 struct comm_event comm; 627 struct namespaces_event namespaces; 628 struct fork_event fork; 629 struct lost_event lost; 630 struct lost_samples_event lost_samples; 631 struct read_event read; 632 struct throttle_event throttle; 633 struct sample_event sample; 634 struct attr_event attr; 635 struct event_update_event event_update; 636 struct event_type_event event_type; 637 struct tracing_data_event tracing_data; 638 struct build_id_event build_id; 639 struct id_index_event id_index; 640 struct auxtrace_info_event auxtrace_info; 641 struct auxtrace_event auxtrace; 642 struct auxtrace_error_event auxtrace_error; 643 struct aux_event aux; 644 struct itrace_start_event itrace_start; 645 struct context_switch_event context_switch; 646 struct thread_map_event thread_map; 647 struct cpu_map_event cpu_map; 648 struct stat_config_event stat_config; 649 struct stat_event stat; 650 struct stat_round_event stat_round; 651 struct time_conv_event time_conv; 652 struct feature_event feat; 653 }; 654 655 void perf_event__print_totals(void); 656 657 struct perf_tool; 658 struct thread_map; 659 struct cpu_map; 660 struct perf_stat_config; 661 struct perf_counts_values; 662 663 typedef int (*perf_event__handler_t)(struct perf_tool *tool, 664 union perf_event *event, 665 struct perf_sample *sample, 666 struct machine *machine); 667 668 int perf_event__synthesize_thread_map(struct perf_tool *tool, 669 struct thread_map *threads, 670 perf_event__handler_t process, 671 struct machine *machine, bool mmap_data, 672 unsigned int proc_map_timeout); 673 int perf_event__synthesize_thread_map2(struct perf_tool *tool, 674 struct thread_map *threads, 675 perf_event__handler_t process, 676 struct machine *machine); 677 int perf_event__synthesize_cpu_map(struct perf_tool *tool, 678 struct cpu_map *cpus, 679 perf_event__handler_t process, 680 struct machine *machine); 681 int perf_event__synthesize_threads(struct perf_tool *tool, 682 perf_event__handler_t process, 683 struct machine *machine, bool mmap_data, 684 unsigned int proc_map_timeout, 685 unsigned int nr_threads_synthesize); 686 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, 687 perf_event__handler_t process, 688 struct machine *machine); 689 int perf_event__synthesize_stat_config(struct perf_tool *tool, 690 struct perf_stat_config *config, 691 perf_event__handler_t process, 692 struct machine *machine); 693 void perf_event__read_stat_config(struct perf_stat_config *config, 694 struct stat_config_event *event); 695 int perf_event__synthesize_stat(struct perf_tool *tool, 696 u32 cpu, u32 thread, u64 id, 697 struct perf_counts_values *count, 698 perf_event__handler_t process, 699 struct machine *machine); 700 int perf_event__synthesize_stat_round(struct perf_tool *tool, 701 u64 time, u64 type, 702 perf_event__handler_t process, 703 struct machine *machine); 704 int perf_event__synthesize_modules(struct perf_tool *tool, 705 perf_event__handler_t process, 706 struct machine *machine); 707 708 int perf_event__process_comm(struct perf_tool *tool, 709 union perf_event *event, 710 struct perf_sample *sample, 711 struct machine *machine); 712 int perf_event__process_lost(struct perf_tool *tool, 713 union perf_event *event, 714 struct perf_sample *sample, 715 struct machine *machine); 716 int perf_event__process_lost_samples(struct perf_tool *tool, 717 union perf_event *event, 718 struct perf_sample *sample, 719 struct machine *machine); 720 int perf_event__process_aux(struct perf_tool *tool, 721 union perf_event *event, 722 struct perf_sample *sample, 723 struct machine *machine); 724 int perf_event__process_itrace_start(struct perf_tool *tool, 725 union perf_event *event, 726 struct perf_sample *sample, 727 struct machine *machine); 728 int perf_event__process_switch(struct perf_tool *tool, 729 union perf_event *event, 730 struct perf_sample *sample, 731 struct machine *machine); 732 int perf_event__process_namespaces(struct perf_tool *tool, 733 union perf_event *event, 734 struct perf_sample *sample, 735 struct machine *machine); 736 int perf_event__process_mmap(struct perf_tool *tool, 737 union perf_event *event, 738 struct perf_sample *sample, 739 struct machine *machine); 740 int perf_event__process_mmap2(struct perf_tool *tool, 741 union perf_event *event, 742 struct perf_sample *sample, 743 struct machine *machine); 744 int perf_event__process_fork(struct perf_tool *tool, 745 union perf_event *event, 746 struct perf_sample *sample, 747 struct machine *machine); 748 int perf_event__process_exit(struct perf_tool *tool, 749 union perf_event *event, 750 struct perf_sample *sample, 751 struct machine *machine); 752 int perf_event__process(struct perf_tool *tool, 753 union perf_event *event, 754 struct perf_sample *sample, 755 struct machine *machine); 756 757 struct addr_location; 758 759 int machine__resolve(struct machine *machine, struct addr_location *al, 760 struct perf_sample *sample); 761 762 void addr_location__put(struct addr_location *al); 763 764 struct thread; 765 766 bool is_bts_event(struct perf_event_attr *attr); 767 bool sample_addr_correlates_sym(struct perf_event_attr *attr); 768 void thread__resolve(struct thread *thread, struct addr_location *al, 769 struct perf_sample *sample); 770 771 const char *perf_event__name(unsigned int id); 772 773 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type, 774 u64 read_format); 775 int perf_event__synthesize_sample(union perf_event *event, u64 type, 776 u64 read_format, 777 const struct perf_sample *sample, 778 bool swapped); 779 780 pid_t perf_event__synthesize_comm(struct perf_tool *tool, 781 union perf_event *event, pid_t pid, 782 perf_event__handler_t process, 783 struct machine *machine); 784 785 int perf_event__synthesize_namespaces(struct perf_tool *tool, 786 union perf_event *event, 787 pid_t pid, pid_t tgid, 788 perf_event__handler_t process, 789 struct machine *machine); 790 791 int perf_event__synthesize_mmap_events(struct perf_tool *tool, 792 union perf_event *event, 793 pid_t pid, pid_t tgid, 794 perf_event__handler_t process, 795 struct machine *machine, 796 bool mmap_data, 797 unsigned int proc_map_timeout); 798 799 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 800 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 801 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); 802 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); 803 size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp); 804 size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp); 805 size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp); 806 size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp); 807 size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp); 808 size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp); 809 size_t perf_event__fprintf(union perf_event *event, FILE *fp); 810 811 int kallsyms__get_function_start(const char *kallsyms_filename, 812 const char *symbol_name, u64 *addr); 813 814 void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max); 815 void cpu_map_data__synthesize(struct cpu_map_data *data, struct cpu_map *map, 816 u16 type, int max); 817 818 void event_attr_init(struct perf_event_attr *attr); 819 820 int perf_event_paranoid(void); 821 822 extern int sysctl_perf_event_max_stack; 823 extern int sysctl_perf_event_max_contexts_per_stack; 824 825 #endif /* __PERF_RECORD_H */ 826