1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * auxtrace.c: AUX area trace support 4 * Copyright (c) 2013-2015, Intel Corporation. 5 */ 6 7 #include <inttypes.h> 8 #include <sys/types.h> 9 #include <sys/mman.h> 10 #include <stdbool.h> 11 #include <string.h> 12 #include <limits.h> 13 #include <errno.h> 14 15 #include <linux/kernel.h> 16 #include <linux/perf_event.h> 17 #include <linux/types.h> 18 #include <linux/bitops.h> 19 #include <linux/log2.h> 20 #include <linux/string.h> 21 #include <linux/time64.h> 22 23 #include <sys/param.h> 24 #include <stdlib.h> 25 #include <stdio.h> 26 #include <linux/list.h> 27 #include <linux/zalloc.h> 28 29 #include "config.h" 30 #include "evlist.h" 31 #include "dso.h" 32 #include "map.h" 33 #include "pmu.h" 34 #include "evsel.h" 35 #include "evsel_config.h" 36 #include "symbol.h" 37 #include "util/perf_api_probe.h" 38 #include "util/synthetic-events.h" 39 #include "thread_map.h" 40 #include "asm/bug.h" 41 #include "auxtrace.h" 42 43 #include <linux/hash.h> 44 45 #include "event.h" 46 #include "record.h" 47 #include "session.h" 48 #include "debug.h" 49 #include <subcmd/parse-options.h> 50 51 #include "cs-etm.h" 52 #include "intel-pt.h" 53 #include "intel-bts.h" 54 #include "arm-spe.h" 55 #include "hisi-ptt.h" 56 #include "s390-cpumsf.h" 57 #include "util/mmap.h" 58 #include "powerpc-vpadtl.h" 59 60 #include <linux/ctype.h> 61 #include "symbol/kallsyms.h" 62 #include <internal/lib.h> 63 #include "util/sample.h" 64 65 #define AUXTRACE_SYNTH_EVENT_ID_OFFSET 1000000000ULL 66 67 /* 68 * Event IDs are allocated sequentially, so a big offset from any 69 * existing ID will reach a unused range. 70 */ 71 u64 auxtrace_synth_id_range_start(struct evsel *evsel) 72 { 73 u64 id = evsel->core.id[0] + AUXTRACE_SYNTH_EVENT_ID_OFFSET; 74 75 if (!id) 76 id = 1; 77 78 return id; 79 } 80 81 /* 82 * Make a group from 'leader' to 'last', requiring that the events were not 83 * already grouped to a different leader. 84 */ 85 static int evlist__regroup(struct evlist *evlist, struct evsel *leader, struct evsel *last) 86 { 87 struct evsel *evsel; 88 bool grp; 89 90 if (!evsel__is_group_leader(leader)) 91 return -EINVAL; 92 93 grp = false; 94 evlist__for_each_entry(evlist, evsel) { 95 if (grp) { 96 if (!(evsel__leader(evsel) == leader || 97 (evsel__leader(evsel) == evsel && 98 evsel->core.nr_members <= 1))) 99 return -EINVAL; 100 } else if (evsel == leader) { 101 grp = true; 102 } 103 if (evsel == last) 104 break; 105 } 106 107 grp = false; 108 evlist__for_each_entry(evlist, evsel) { 109 if (grp) { 110 if (!evsel__has_leader(evsel, leader)) { 111 evsel__set_leader(evsel, leader); 112 if (leader->core.nr_members < 1) 113 leader->core.nr_members = 1; 114 leader->core.nr_members += 1; 115 } 116 } else if (evsel == leader) { 117 grp = true; 118 } 119 if (evsel == last) 120 break; 121 } 122 123 return 0; 124 } 125 126 static bool auxtrace__dont_decode(struct perf_session *session) 127 { 128 return !session->itrace_synth_opts || 129 session->itrace_synth_opts->dont_decode; 130 } 131 132 int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, 133 struct auxtrace_mmap_params *mp, 134 void *userpg, int fd) 135 { 136 struct perf_event_mmap_page *pc = userpg; 137 138 WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n"); 139 140 mm->userpg = userpg; 141 mm->mask = mp->mask; 142 mm->len = mp->len; 143 mm->prev = 0; 144 mm->idx = mp->idx; 145 mm->tid = mp->tid; 146 mm->cpu = mp->cpu.cpu; 147 148 if (!mp->len || !mp->mmap_needed) { 149 mm->base = NULL; 150 return 0; 151 } 152 153 pc->aux_offset = mp->offset; 154 pc->aux_size = mp->len; 155 156 mm->base = mmap(NULL, mp->len, mp->prot, MAP_SHARED, fd, mp->offset); 157 if (mm->base == MAP_FAILED) { 158 pr_debug2("failed to mmap AUX area\n"); 159 mm->base = NULL; 160 return -1; 161 } 162 163 return 0; 164 } 165 166 void auxtrace_mmap__munmap(struct auxtrace_mmap *mm) 167 { 168 if (mm->base) { 169 munmap(mm->base, mm->len); 170 mm->base = NULL; 171 } 172 } 173 174 void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp, 175 off_t auxtrace_offset, 176 unsigned int auxtrace_pages, 177 bool auxtrace_overwrite) 178 { 179 if (auxtrace_pages) { 180 mp->offset = auxtrace_offset; 181 mp->len = auxtrace_pages * (size_t)page_size; 182 mp->mask = is_power_of_2(mp->len) ? mp->len - 1 : 0; 183 mp->prot = PROT_READ | (auxtrace_overwrite ? 0 : PROT_WRITE); 184 pr_debug2("AUX area mmap length %zu\n", mp->len); 185 } else { 186 mp->len = 0; 187 } 188 } 189 190 void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp, 191 struct evlist *evlist, 192 struct evsel *evsel, int idx) 193 { 194 bool per_cpu = !perf_cpu_map__has_any_cpu(evlist__core(evlist)->user_requested_cpus); 195 196 mp->mmap_needed = evsel->needs_auxtrace_mmap; 197 198 if (!mp->mmap_needed) 199 return; 200 201 mp->idx = idx; 202 203 if (per_cpu) { 204 mp->cpu = perf_cpu_map__cpu(evlist__core(evlist)->all_cpus, idx); 205 mp->tid = perf_thread_map__pid(evlist__core(evlist)->threads, 0); 206 } else { 207 mp->cpu.cpu = -1; 208 mp->tid = perf_thread_map__pid(evlist__core(evlist)->threads, idx); 209 } 210 } 211 212 #define AUXTRACE_INIT_NR_QUEUES 32 213 214 static struct auxtrace_queue *auxtrace_alloc_queue_array(unsigned int nr_queues) 215 { 216 struct auxtrace_queue *queue_array; 217 unsigned int max_nr_queues, i; 218 219 max_nr_queues = UINT_MAX / sizeof(struct auxtrace_queue); 220 if (nr_queues > max_nr_queues) 221 return NULL; 222 223 queue_array = calloc(nr_queues, sizeof(struct auxtrace_queue)); 224 if (!queue_array) 225 return NULL; 226 227 for (i = 0; i < nr_queues; i++) { 228 INIT_LIST_HEAD(&queue_array[i].head); 229 queue_array[i].priv = NULL; 230 } 231 232 return queue_array; 233 } 234 235 int auxtrace_queues__init_nr(struct auxtrace_queues *queues, int nr_queues) 236 { 237 queues->nr_queues = nr_queues; 238 queues->queue_array = auxtrace_alloc_queue_array(queues->nr_queues); 239 if (!queues->queue_array) 240 return -ENOMEM; 241 return 0; 242 } 243 244 int auxtrace_queues__init(struct auxtrace_queues *queues) 245 { 246 return auxtrace_queues__init_nr(queues, AUXTRACE_INIT_NR_QUEUES); 247 } 248 249 static int auxtrace_queues__grow(struct auxtrace_queues *queues, 250 unsigned int new_nr_queues) 251 { 252 unsigned int nr_queues = queues->nr_queues; 253 struct auxtrace_queue *queue_array; 254 struct auxtrace_queue *old_array = queues->queue_array; 255 unsigned int i; 256 257 if (!new_nr_queues) 258 return -EINVAL; 259 260 if (!nr_queues) 261 nr_queues = AUXTRACE_INIT_NR_QUEUES; 262 263 while (nr_queues && nr_queues < new_nr_queues) 264 nr_queues <<= 1; 265 266 if (nr_queues < queues->nr_queues || nr_queues < new_nr_queues) 267 return -EINVAL; 268 269 queue_array = auxtrace_alloc_queue_array(nr_queues); 270 if (!queue_array) 271 return -ENOMEM; 272 273 for (i = 0; i < queues->nr_queues; i++) { 274 list_splice_tail(&old_array[i].head, 275 &queue_array[i].head); 276 queue_array[i].tid = old_array[i].tid; 277 queue_array[i].cpu = old_array[i].cpu; 278 queue_array[i].set = old_array[i].set; 279 queue_array[i].priv = old_array[i].priv; 280 } 281 282 queues->nr_queues = nr_queues; 283 queues->queue_array = queue_array; 284 free(old_array); 285 286 return 0; 287 } 288 289 static void *auxtrace_copy_data(u64 size, struct perf_session *session) 290 { 291 int fd = perf_data__fd(session->data); 292 void *p; 293 ssize_t ret; 294 295 if (size > SSIZE_MAX) 296 return NULL; 297 298 p = malloc(size); 299 if (!p) 300 return NULL; 301 302 ret = readn(fd, p, size); 303 if (ret != (ssize_t)size) { 304 free(p); 305 return NULL; 306 } 307 308 return p; 309 } 310 311 static int auxtrace_queues__queue_buffer(struct auxtrace_queues *queues, 312 unsigned int idx, 313 struct auxtrace_buffer *buffer) 314 { 315 struct auxtrace_queue *queue; 316 int err; 317 318 if (idx >= queues->nr_queues) { 319 err = auxtrace_queues__grow(queues, idx + 1); 320 if (err) 321 return err; 322 } 323 324 queue = &queues->queue_array[idx]; 325 326 if (!queue->set) { 327 queue->set = true; 328 queue->tid = buffer->tid; 329 queue->cpu = buffer->cpu.cpu; 330 } 331 332 buffer->buffer_nr = queues->next_buffer_nr++; 333 334 list_add_tail(&buffer->list, &queue->head); 335 336 queues->new_data = true; 337 queues->populated = true; 338 339 return 0; 340 } 341 342 /* Limit buffers to 32MiB on 32-bit */ 343 #define BUFFER_LIMIT_FOR_32_BIT (32 * 1024 * 1024) 344 345 static int auxtrace_queues__split_buffer(struct auxtrace_queues *queues, 346 unsigned int idx, 347 struct auxtrace_buffer *buffer) 348 { 349 u64 sz = buffer->size; 350 bool consecutive = false; 351 struct auxtrace_buffer *b; 352 int err; 353 354 while (sz > BUFFER_LIMIT_FOR_32_BIT) { 355 b = memdup(buffer, sizeof(struct auxtrace_buffer)); 356 if (!b) 357 return -ENOMEM; 358 b->size = BUFFER_LIMIT_FOR_32_BIT; 359 b->consecutive = consecutive; 360 err = auxtrace_queues__queue_buffer(queues, idx, b); 361 if (err) { 362 auxtrace_buffer__free(b); 363 return err; 364 } 365 buffer->data_offset += BUFFER_LIMIT_FOR_32_BIT; 366 sz -= BUFFER_LIMIT_FOR_32_BIT; 367 consecutive = true; 368 } 369 370 buffer->size = sz; 371 buffer->consecutive = consecutive; 372 373 return 0; 374 } 375 376 static bool filter_cpu(struct perf_session *session, struct perf_cpu cpu) 377 { 378 unsigned long *cpu_bitmap = session->itrace_synth_opts->cpu_bitmap; 379 380 return cpu_bitmap && cpu.cpu >= 0 && cpu.cpu < MAX_NR_CPUS && 381 !test_bit(cpu.cpu, cpu_bitmap); 382 } 383 384 static int auxtrace_queues__add_buffer(struct auxtrace_queues *queues, 385 struct perf_session *session, 386 unsigned int idx, 387 struct auxtrace_buffer *buffer, 388 struct auxtrace_buffer **buffer_ptr) 389 { 390 int err = -ENOMEM; 391 392 if (filter_cpu(session, buffer->cpu)) 393 return 0; 394 395 buffer = memdup(buffer, sizeof(*buffer)); 396 if (!buffer) 397 return -ENOMEM; 398 399 if (session->one_mmap) { 400 buffer->data = buffer->data_offset - session->one_mmap_offset + 401 session->one_mmap_addr; 402 } else if (perf_data__is_pipe(session->data)) { 403 buffer->data = auxtrace_copy_data(buffer->size, session); 404 if (!buffer->data) 405 goto out_free; 406 buffer->data_needs_freeing = true; 407 } else if (BITS_PER_LONG == 32 && 408 buffer->size > BUFFER_LIMIT_FOR_32_BIT) { 409 err = auxtrace_queues__split_buffer(queues, idx, buffer); 410 if (err) 411 goto out_free; 412 } 413 414 err = auxtrace_queues__queue_buffer(queues, idx, buffer); 415 if (err) 416 goto out_free; 417 418 /* FIXME: Doesn't work for split buffer */ 419 if (buffer_ptr) 420 *buffer_ptr = buffer; 421 422 return 0; 423 424 out_free: 425 auxtrace_buffer__free(buffer); 426 return err; 427 } 428 429 int auxtrace_queues__add_event(struct auxtrace_queues *queues, 430 struct perf_session *session, 431 union perf_event *event, off_t data_offset, 432 struct auxtrace_buffer **buffer_ptr) 433 { 434 struct auxtrace_buffer buffer = { 435 .pid = -1, 436 .tid = event->auxtrace.tid, 437 .cpu = { event->auxtrace.cpu }, 438 .data_offset = data_offset, 439 .offset = event->auxtrace.offset, 440 .reference = event->auxtrace.reference, 441 .size = event->auxtrace.size, 442 }; 443 unsigned int idx = event->auxtrace.idx; 444 445 return auxtrace_queues__add_buffer(queues, session, idx, &buffer, 446 buffer_ptr); 447 } 448 449 static int auxtrace_queues__add_indexed_event(struct auxtrace_queues *queues, 450 struct perf_session *session, 451 off_t file_offset, size_t sz) 452 { 453 union perf_event *event; 454 int err; 455 char buf[PERF_SAMPLE_MAX_SIZE]; 456 457 err = perf_session__peek_event(session, file_offset, buf, 458 PERF_SAMPLE_MAX_SIZE, &event, NULL); 459 if (err) 460 return err; 461 462 if (event->header.type == PERF_RECORD_AUXTRACE) { 463 if (event->header.size < sizeof(struct perf_record_auxtrace) || 464 event->header.size != sz) { 465 err = -EINVAL; 466 goto out; 467 } 468 file_offset += event->header.size; 469 err = auxtrace_queues__add_event(queues, session, event, 470 file_offset, NULL); 471 } 472 out: 473 return err; 474 } 475 476 void auxtrace_queues__free(struct auxtrace_queues *queues) 477 { 478 unsigned int i; 479 480 for (i = 0; i < queues->nr_queues; i++) { 481 while (!list_empty(&queues->queue_array[i].head)) { 482 struct auxtrace_buffer *buffer; 483 484 buffer = list_entry(queues->queue_array[i].head.next, 485 struct auxtrace_buffer, list); 486 list_del_init(&buffer->list); 487 auxtrace_buffer__free(buffer); 488 } 489 } 490 491 zfree(&queues->queue_array); 492 queues->nr_queues = 0; 493 } 494 495 static void auxtrace_heapify(struct auxtrace_heap_item *heap_array, 496 unsigned int pos, unsigned int queue_nr, 497 u64 ordinal) 498 { 499 unsigned int parent; 500 501 while (pos) { 502 parent = (pos - 1) >> 1; 503 if (heap_array[parent].ordinal <= ordinal) 504 break; 505 heap_array[pos] = heap_array[parent]; 506 pos = parent; 507 } 508 heap_array[pos].queue_nr = queue_nr; 509 heap_array[pos].ordinal = ordinal; 510 } 511 512 int auxtrace_heap__add(struct auxtrace_heap *heap, unsigned int queue_nr, 513 u64 ordinal) 514 { 515 struct auxtrace_heap_item *heap_array; 516 517 if (queue_nr >= heap->heap_sz) { 518 unsigned int heap_sz = AUXTRACE_INIT_NR_QUEUES; 519 520 while (heap_sz <= queue_nr) 521 heap_sz <<= 1; 522 heap_array = realloc(heap->heap_array, 523 heap_sz * sizeof(struct auxtrace_heap_item)); 524 if (!heap_array) 525 return -ENOMEM; 526 heap->heap_array = heap_array; 527 heap->heap_sz = heap_sz; 528 } 529 530 auxtrace_heapify(heap->heap_array, heap->heap_cnt++, queue_nr, ordinal); 531 532 return 0; 533 } 534 535 void auxtrace_heap__free(struct auxtrace_heap *heap) 536 { 537 zfree(&heap->heap_array); 538 heap->heap_cnt = 0; 539 heap->heap_sz = 0; 540 } 541 542 void auxtrace_heap__pop(struct auxtrace_heap *heap) 543 { 544 unsigned int pos, last, heap_cnt = heap->heap_cnt; 545 struct auxtrace_heap_item *heap_array; 546 547 if (!heap_cnt) 548 return; 549 550 heap->heap_cnt -= 1; 551 552 heap_array = heap->heap_array; 553 554 pos = 0; 555 while (1) { 556 unsigned int left, right; 557 558 left = (pos << 1) + 1; 559 if (left >= heap_cnt) 560 break; 561 right = left + 1; 562 if (right >= heap_cnt) { 563 heap_array[pos] = heap_array[left]; 564 return; 565 } 566 if (heap_array[left].ordinal < heap_array[right].ordinal) { 567 heap_array[pos] = heap_array[left]; 568 pos = left; 569 } else { 570 heap_array[pos] = heap_array[right]; 571 pos = right; 572 } 573 } 574 575 last = heap_cnt - 1; 576 auxtrace_heapify(heap_array, pos, heap_array[last].queue_nr, 577 heap_array[last].ordinal); 578 } 579 580 size_t auxtrace_record__info_priv_size(struct auxtrace_record *itr, 581 struct evlist *evlist) 582 { 583 if (itr) 584 return itr->info_priv_size(itr, evlist); 585 return 0; 586 } 587 588 static int auxtrace_not_supported(void) 589 { 590 pr_err("AUX area tracing is not supported on this architecture\n"); 591 return -EINVAL; 592 } 593 594 int auxtrace_record__info_fill(struct auxtrace_record *itr, 595 struct perf_session *session, 596 struct perf_record_auxtrace_info *auxtrace_info, 597 size_t priv_size) 598 { 599 if (itr) 600 return itr->info_fill(itr, session, auxtrace_info, priv_size); 601 return auxtrace_not_supported(); 602 } 603 604 void auxtrace_record__free(struct auxtrace_record *itr) 605 { 606 if (itr) 607 itr->free(itr); 608 } 609 610 int auxtrace_record__snapshot_start(struct auxtrace_record *itr) 611 { 612 if (itr && itr->snapshot_start) 613 return itr->snapshot_start(itr); 614 return 0; 615 } 616 617 int auxtrace_record__snapshot_finish(struct auxtrace_record *itr, bool on_exit) 618 { 619 if (!on_exit && itr && itr->snapshot_finish) 620 return itr->snapshot_finish(itr); 621 return 0; 622 } 623 624 int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx, 625 struct auxtrace_mmap *mm, 626 unsigned char *data, u64 *head, u64 *old) 627 { 628 if (itr && itr->find_snapshot) 629 return itr->find_snapshot(itr, idx, mm, data, head, old); 630 return 0; 631 } 632 633 int auxtrace_record__options(struct auxtrace_record *itr, 634 struct evlist *evlist, 635 struct record_opts *opts) 636 { 637 if (itr) { 638 itr->evlist = evlist; 639 return itr->recording_options(itr, evlist, opts); 640 } 641 return 0; 642 } 643 644 u64 auxtrace_record__reference(struct auxtrace_record *itr) 645 { 646 if (itr) 647 return itr->reference(itr); 648 return 0; 649 } 650 651 int auxtrace_parse_snapshot_options(struct auxtrace_record *itr, 652 struct record_opts *opts, const char *str) 653 { 654 if (!str) 655 return 0; 656 657 /* PMU-agnostic options */ 658 switch (*str) { 659 case 'e': 660 opts->auxtrace_snapshot_on_exit = true; 661 str++; 662 break; 663 default: 664 break; 665 } 666 667 if (itr && itr->parse_snapshot_options) 668 return itr->parse_snapshot_options(itr, opts, str); 669 670 pr_err("No AUX area tracing to snapshot\n"); 671 return -EINVAL; 672 } 673 674 static int evlist__enable_event_idx(struct evlist *evlist, struct evsel *evsel, int idx) 675 { 676 bool per_cpu_mmaps = !perf_cpu_map__has_any_cpu(evlist__core(evlist)->user_requested_cpus); 677 678 if (per_cpu_mmaps) { 679 struct perf_cpu evlist_cpu = perf_cpu_map__cpu(evlist__core(evlist)->all_cpus, idx); 680 int cpu_map_idx = perf_cpu_map__idx(evsel->core.cpus, evlist_cpu); 681 682 if (cpu_map_idx == -1) 683 return -EINVAL; 684 return perf_evsel__enable_cpu(&evsel->core, cpu_map_idx); 685 } 686 687 return perf_evsel__enable_thread(&evsel->core, idx); 688 } 689 690 int auxtrace_record__read_finish(struct auxtrace_record *itr, int idx) 691 { 692 struct evsel *evsel; 693 694 if (!itr->evlist) 695 return -EINVAL; 696 697 evlist__for_each_entry(itr->evlist, evsel) { 698 if (evsel__is_aux_event(evsel)) { 699 if (evsel->disabled) 700 return 0; 701 return evlist__enable_event_idx(itr->evlist, evsel, idx); 702 } 703 } 704 return -EINVAL; 705 } 706 707 /* 708 * Event record size is 16-bit which results in a maximum size of about 64KiB. 709 * Allow about 4KiB for the rest of the sample record, to give a maximum 710 * AUX area sample size of 60KiB. 711 */ 712 #define MAX_AUX_SAMPLE_SIZE (60 * 1024) 713 714 /* Arbitrary default size if no other default provided */ 715 #define DEFAULT_AUX_SAMPLE_SIZE (4 * 1024) 716 717 static int auxtrace_validate_aux_sample_size(struct evlist *evlist, 718 struct record_opts *opts) 719 { 720 struct evsel *evsel; 721 bool has_aux_leader = false; 722 u32 sz; 723 724 evlist__for_each_entry(evlist, evsel) { 725 sz = evsel->core.attr.aux_sample_size; 726 if (evsel__is_group_leader(evsel)) { 727 has_aux_leader = evsel__is_aux_event(evsel); 728 if (sz) { 729 if (has_aux_leader) 730 pr_err("Cannot add AUX area sampling to an AUX area event\n"); 731 else 732 pr_err("Cannot add AUX area sampling to a group leader\n"); 733 return -EINVAL; 734 } 735 } 736 if (sz > MAX_AUX_SAMPLE_SIZE) { 737 pr_err("AUX area sample size %u too big, max. %d\n", 738 sz, MAX_AUX_SAMPLE_SIZE); 739 return -EINVAL; 740 } 741 if (sz) { 742 if (!has_aux_leader) { 743 pr_err("Cannot add AUX area sampling because group leader is not an AUX area event\n"); 744 return -EINVAL; 745 } 746 evsel__set_sample_bit(evsel, AUX); 747 opts->auxtrace_sample_mode = true; 748 } else { 749 evsel__reset_sample_bit(evsel, AUX); 750 } 751 } 752 753 if (!opts->auxtrace_sample_mode) { 754 pr_err("AUX area sampling requires an AUX area event group leader plus other events to which to add samples\n"); 755 return -EINVAL; 756 } 757 758 if (!perf_can_aux_sample()) { 759 pr_err("AUX area sampling is not supported by kernel\n"); 760 return -EINVAL; 761 } 762 763 return 0; 764 } 765 766 int auxtrace_parse_sample_options(struct auxtrace_record *itr, 767 struct evlist *evlist, 768 struct record_opts *opts, const char *str) 769 { 770 struct evsel_config_term *term; 771 struct evsel *aux_evsel; 772 bool has_aux_sample_size = false; 773 bool has_aux_leader = false; 774 struct evsel *evsel; 775 char *endptr; 776 unsigned long sz; 777 778 if (!str) 779 goto no_opt; 780 781 if (!itr) { 782 pr_err("No AUX area event to sample\n"); 783 return -EINVAL; 784 } 785 786 sz = strtoul(str, &endptr, 0); 787 if (*endptr || sz > UINT_MAX) { 788 pr_err("Bad AUX area sampling option: '%s'\n", str); 789 return -EINVAL; 790 } 791 792 if (!sz) 793 sz = itr->default_aux_sample_size; 794 795 if (!sz) 796 sz = DEFAULT_AUX_SAMPLE_SIZE; 797 798 /* Set aux_sample_size based on --aux-sample option */ 799 evlist__for_each_entry(evlist, evsel) { 800 if (evsel__is_group_leader(evsel)) { 801 has_aux_leader = evsel__is_aux_event(evsel); 802 } else if (has_aux_leader) { 803 evsel->core.attr.aux_sample_size = sz; 804 } 805 } 806 no_opt: 807 aux_evsel = NULL; 808 /* Override with aux_sample_size from config term */ 809 evlist__for_each_entry(evlist, evsel) { 810 if (evsel__is_aux_event(evsel)) 811 aux_evsel = evsel; 812 term = evsel__get_config_term(evsel, AUX_SAMPLE_SIZE); 813 if (term) { 814 has_aux_sample_size = true; 815 evsel->core.attr.aux_sample_size = term->val.aux_sample_size; 816 /* If possible, group with the AUX event */ 817 if (aux_evsel && evsel->core.attr.aux_sample_size) 818 evlist__regroup(evlist, aux_evsel, evsel); 819 } 820 } 821 822 if (!str && !has_aux_sample_size) 823 return 0; 824 825 if (!itr) { 826 pr_err("No AUX area event to sample\n"); 827 return -EINVAL; 828 } 829 830 return auxtrace_validate_aux_sample_size(evlist, opts); 831 } 832 833 static struct aux_action_opt { 834 const char *str; 835 u32 aux_action; 836 bool aux_event_opt; 837 } aux_action_opts[] = { 838 {"start-paused", BIT(0), true}, 839 {"pause", BIT(1), false}, 840 {"resume", BIT(2), false}, 841 {.str = NULL}, 842 }; 843 844 static const struct aux_action_opt *auxtrace_parse_aux_action_str(const char *str) 845 { 846 const struct aux_action_opt *opt; 847 848 if (!str) 849 return NULL; 850 851 for (opt = aux_action_opts; opt->str; opt++) 852 if (!strcmp(str, opt->str)) 853 return opt; 854 855 return NULL; 856 } 857 858 int auxtrace_parse_aux_action(struct evlist *evlist) 859 { 860 struct evsel_config_term *term; 861 struct evsel *aux_evsel = NULL; 862 struct evsel *evsel; 863 864 evlist__for_each_entry(evlist, evsel) { 865 bool is_aux_event = evsel__is_aux_event(evsel); 866 const struct aux_action_opt *opt; 867 868 if (is_aux_event) 869 aux_evsel = evsel; 870 term = evsel__get_config_term(evsel, AUX_ACTION); 871 if (!term) { 872 if (evsel__get_config_term(evsel, AUX_OUTPUT)) 873 goto regroup; 874 continue; 875 } 876 opt = auxtrace_parse_aux_action_str(term->val.str); 877 if (!opt) { 878 pr_err("Bad aux-action '%s'\n", term->val.str); 879 return -EINVAL; 880 } 881 if (opt->aux_event_opt && !is_aux_event) { 882 pr_err("aux-action '%s' can only be used with AUX area event\n", 883 term->val.str); 884 return -EINVAL; 885 } 886 if (!opt->aux_event_opt && is_aux_event) { 887 pr_err("aux-action '%s' cannot be used for AUX area event itself\n", 888 term->val.str); 889 return -EINVAL; 890 } 891 evsel->core.attr.aux_action = opt->aux_action; 892 regroup: 893 /* If possible, group with the AUX event */ 894 if (aux_evsel) 895 evlist__regroup(evlist, aux_evsel, evsel); 896 if (!evsel__is_aux_event(evsel__leader(evsel))) { 897 pr_err("Events with aux-action must have AUX area event group leader\n"); 898 return -EINVAL; 899 } 900 } 901 902 return 0; 903 } 904 905 /** 906 * auxtrace_record__init - Initialize an AUX area tracing record. 907 * @evlist: The list of events to check for AUX area tracing event. 908 * @err: Pointer to an integer to store return code. 909 * 910 * This function looks through the @evlist to determine which AUX area 911 * tracing hardware is being used and initializes the auxtrace_record 912 * structure. 913 * 914 * Return: 915 * a) A pointer to the struct auxtrace_record with @err = 0 on success. 916 * b) NULL with @err = 0 if no AUX area tracing event is found/supported 917 * (not considered an error). 918 * c) NULL with non-zero @err on actual auxtrace_record__init failure. 919 */ 920 struct auxtrace_record *__weak 921 auxtrace_record__init(struct evlist *evlist __maybe_unused, int *err) 922 { 923 *err = 0; 924 return NULL; 925 } 926 927 static int auxtrace_index__alloc(struct list_head *head) 928 { 929 struct auxtrace_index *auxtrace_index; 930 931 auxtrace_index = malloc(sizeof(struct auxtrace_index)); 932 if (!auxtrace_index) 933 return -ENOMEM; 934 935 auxtrace_index->nr = 0; 936 INIT_LIST_HEAD(&auxtrace_index->list); 937 938 list_add_tail(&auxtrace_index->list, head); 939 940 return 0; 941 } 942 943 void auxtrace_index__free(struct list_head *head) 944 { 945 struct auxtrace_index *auxtrace_index, *n; 946 947 list_for_each_entry_safe(auxtrace_index, n, head, list) { 948 list_del_init(&auxtrace_index->list); 949 free(auxtrace_index); 950 } 951 } 952 953 static struct auxtrace_index *auxtrace_index__last(struct list_head *head) 954 { 955 struct auxtrace_index *auxtrace_index; 956 int err; 957 958 if (list_empty(head)) { 959 err = auxtrace_index__alloc(head); 960 if (err) 961 return NULL; 962 } 963 964 auxtrace_index = list_entry(head->prev, struct auxtrace_index, list); 965 966 if (auxtrace_index->nr >= PERF_AUXTRACE_INDEX_ENTRY_COUNT) { 967 err = auxtrace_index__alloc(head); 968 if (err) 969 return NULL; 970 auxtrace_index = list_entry(head->prev, struct auxtrace_index, 971 list); 972 } 973 974 return auxtrace_index; 975 } 976 977 int auxtrace_index__auxtrace_event(struct list_head *head, 978 union perf_event *event, off_t file_offset) 979 { 980 struct auxtrace_index *auxtrace_index; 981 size_t nr; 982 983 auxtrace_index = auxtrace_index__last(head); 984 if (!auxtrace_index) 985 return -ENOMEM; 986 987 nr = auxtrace_index->nr; 988 auxtrace_index->entries[nr].file_offset = file_offset; 989 auxtrace_index->entries[nr].sz = event->header.size; 990 auxtrace_index->nr += 1; 991 992 return 0; 993 } 994 995 static int auxtrace_index__do_write(int fd, 996 struct auxtrace_index *auxtrace_index) 997 { 998 struct auxtrace_index_entry ent; 999 size_t i; 1000 1001 for (i = 0; i < auxtrace_index->nr; i++) { 1002 ent.file_offset = auxtrace_index->entries[i].file_offset; 1003 ent.sz = auxtrace_index->entries[i].sz; 1004 if (writen(fd, &ent, sizeof(ent)) != sizeof(ent)) 1005 return -errno; 1006 } 1007 return 0; 1008 } 1009 1010 int auxtrace_index__write(int fd, struct list_head *head) 1011 { 1012 struct auxtrace_index *auxtrace_index; 1013 u64 total = 0; 1014 int err; 1015 1016 list_for_each_entry(auxtrace_index, head, list) 1017 total += auxtrace_index->nr; 1018 1019 if (writen(fd, &total, sizeof(total)) != sizeof(total)) 1020 return -errno; 1021 1022 list_for_each_entry(auxtrace_index, head, list) { 1023 err = auxtrace_index__do_write(fd, auxtrace_index); 1024 if (err) 1025 return err; 1026 } 1027 1028 return 0; 1029 } 1030 1031 static int auxtrace_index__process_entry(int fd, struct list_head *head, 1032 bool needs_swap) 1033 { 1034 struct auxtrace_index *auxtrace_index; 1035 struct auxtrace_index_entry ent; 1036 size_t nr; 1037 1038 if (readn(fd, &ent, sizeof(ent)) != sizeof(ent)) 1039 return -1; 1040 1041 auxtrace_index = auxtrace_index__last(head); 1042 if (!auxtrace_index) 1043 return -1; 1044 1045 nr = auxtrace_index->nr; 1046 if (needs_swap) { 1047 auxtrace_index->entries[nr].file_offset = 1048 bswap_64(ent.file_offset); 1049 auxtrace_index->entries[nr].sz = bswap_64(ent.sz); 1050 } else { 1051 auxtrace_index->entries[nr].file_offset = ent.file_offset; 1052 auxtrace_index->entries[nr].sz = ent.sz; 1053 } 1054 1055 auxtrace_index->nr = nr + 1; 1056 1057 return 0; 1058 } 1059 1060 int auxtrace_index__process(int fd, u64 size, struct perf_session *session, 1061 bool needs_swap) 1062 { 1063 struct list_head *head = &session->auxtrace_index; 1064 u64 nr; 1065 1066 if (readn(fd, &nr, sizeof(u64)) != sizeof(u64)) 1067 return -1; 1068 1069 if (needs_swap) 1070 nr = bswap_64(nr); 1071 1072 if (sizeof(u64) + nr * sizeof(struct auxtrace_index_entry) > size) 1073 return -1; 1074 1075 while (nr--) { 1076 int err; 1077 1078 err = auxtrace_index__process_entry(fd, head, needs_swap); 1079 if (err) 1080 return -1; 1081 } 1082 1083 return 0; 1084 } 1085 1086 static int auxtrace_queues__process_index_entry(struct auxtrace_queues *queues, 1087 struct perf_session *session, 1088 struct auxtrace_index_entry *ent) 1089 { 1090 return auxtrace_queues__add_indexed_event(queues, session, 1091 ent->file_offset, ent->sz); 1092 } 1093 1094 int auxtrace_queues__process_index(struct auxtrace_queues *queues, 1095 struct perf_session *session) 1096 { 1097 struct auxtrace_index *auxtrace_index; 1098 struct auxtrace_index_entry *ent; 1099 size_t i; 1100 int err; 1101 1102 if (auxtrace__dont_decode(session)) 1103 return 0; 1104 1105 list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) { 1106 for (i = 0; i < auxtrace_index->nr; i++) { 1107 ent = &auxtrace_index->entries[i]; 1108 err = auxtrace_queues__process_index_entry(queues, 1109 session, 1110 ent); 1111 if (err) 1112 return err; 1113 } 1114 } 1115 return 0; 1116 } 1117 1118 struct auxtrace_buffer *auxtrace_buffer__next(struct auxtrace_queue *queue, 1119 struct auxtrace_buffer *buffer) 1120 { 1121 if (buffer) { 1122 if (list_is_last(&buffer->list, &queue->head)) 1123 return NULL; 1124 return list_entry(buffer->list.next, struct auxtrace_buffer, 1125 list); 1126 } else { 1127 if (list_empty(&queue->head)) 1128 return NULL; 1129 return list_entry(queue->head.next, struct auxtrace_buffer, 1130 list); 1131 } 1132 } 1133 1134 struct auxtrace_queue *auxtrace_queues__sample_queue(struct auxtrace_queues *queues, 1135 struct perf_sample *sample, 1136 struct perf_session *session) 1137 { 1138 struct perf_sample_id *sid; 1139 unsigned int idx; 1140 u64 id; 1141 1142 id = sample->id; 1143 if (!id) 1144 return NULL; 1145 1146 sid = evlist__id2sid(session->evlist, id); 1147 if (!sid) 1148 return NULL; 1149 1150 idx = sid->idx; 1151 1152 if (idx >= queues->nr_queues) 1153 return NULL; 1154 1155 return &queues->queue_array[idx]; 1156 } 1157 1158 int auxtrace_queues__add_sample(struct auxtrace_queues *queues, 1159 struct perf_session *session, 1160 struct perf_sample *sample, u64 data_offset, 1161 u64 reference) 1162 { 1163 struct auxtrace_buffer buffer = { 1164 .pid = -1, 1165 .data_offset = data_offset, 1166 .reference = reference, 1167 .size = sample->aux_sample.size, 1168 }; 1169 struct perf_sample_id *sid; 1170 u64 id = sample->id; 1171 unsigned int idx; 1172 1173 if (!id) 1174 return -EINVAL; 1175 1176 sid = evlist__id2sid(session->evlist, id); 1177 if (!sid) 1178 return -ENOENT; 1179 1180 idx = sid->idx; 1181 buffer.tid = sid->tid; 1182 buffer.cpu = sid->cpu; 1183 1184 return auxtrace_queues__add_buffer(queues, session, idx, &buffer, NULL); 1185 } 1186 1187 struct queue_data { 1188 bool samples; 1189 bool events; 1190 }; 1191 1192 static int auxtrace_queue_data_cb(struct perf_session *session, 1193 union perf_event *event, u64 offset, 1194 void *data) 1195 { 1196 struct queue_data *qd = data; 1197 struct perf_sample sample; 1198 int err; 1199 1200 if (qd->events && event->header.type == PERF_RECORD_AUXTRACE) { 1201 if (event->header.size < sizeof(struct perf_record_auxtrace)) 1202 return -EINVAL; 1203 offset += event->header.size; 1204 return session->auxtrace->queue_data(session, NULL, event, 1205 offset); 1206 } 1207 1208 if (!qd->samples || event->header.type != PERF_RECORD_SAMPLE) 1209 return 0; 1210 1211 perf_sample__init(&sample, /*all=*/false); 1212 err = evlist__parse_sample(session->evlist, event, &sample); 1213 if (err) 1214 goto out; 1215 1216 if (sample.aux_sample.size) { 1217 offset += sample.aux_sample.data - (void *)event; 1218 1219 err = session->auxtrace->queue_data(session, &sample, NULL, offset); 1220 } 1221 out: 1222 perf_sample__exit(&sample); 1223 return err; 1224 } 1225 1226 int auxtrace_queue_data(struct perf_session *session, bool samples, bool events) 1227 { 1228 struct queue_data qd = { 1229 .samples = samples, 1230 .events = events, 1231 }; 1232 1233 if (auxtrace__dont_decode(session)) 1234 return 0; 1235 1236 if (perf_data__is_pipe(session->data)) 1237 return 0; 1238 1239 if (!session->auxtrace || !session->auxtrace->queue_data) 1240 return -EINVAL; 1241 1242 return perf_session__peek_events(session, session->header.data_offset, 1243 session->header.data_size, 1244 auxtrace_queue_data_cb, &qd); 1245 } 1246 1247 void *auxtrace_buffer__get_data_rw(struct auxtrace_buffer *buffer, int fd, bool rw) 1248 { 1249 int prot = rw ? PROT_READ | PROT_WRITE : PROT_READ; 1250 size_t adj = buffer->data_offset & (page_size - 1); 1251 size_t size = buffer->size + adj; 1252 off_t file_offset = buffer->data_offset - adj; 1253 void *addr; 1254 1255 if (buffer->data) 1256 return buffer->data; 1257 1258 addr = mmap(NULL, size, prot, MAP_SHARED, fd, file_offset); 1259 if (addr == MAP_FAILED) 1260 return NULL; 1261 1262 buffer->mmap_addr = addr; 1263 buffer->mmap_size = size; 1264 1265 buffer->data = addr + adj; 1266 1267 return buffer->data; 1268 } 1269 1270 void auxtrace_buffer__put_data(struct auxtrace_buffer *buffer) 1271 { 1272 if (!buffer->data || !buffer->mmap_addr) 1273 return; 1274 munmap(buffer->mmap_addr, buffer->mmap_size); 1275 buffer->mmap_addr = NULL; 1276 buffer->mmap_size = 0; 1277 buffer->data = NULL; 1278 buffer->use_data = NULL; 1279 } 1280 1281 void auxtrace_buffer__drop_data(struct auxtrace_buffer *buffer) 1282 { 1283 auxtrace_buffer__put_data(buffer); 1284 if (buffer->data_needs_freeing) { 1285 buffer->data_needs_freeing = false; 1286 zfree(&buffer->data); 1287 buffer->use_data = NULL; 1288 buffer->size = 0; 1289 } 1290 } 1291 1292 void auxtrace_buffer__free(struct auxtrace_buffer *buffer) 1293 { 1294 auxtrace_buffer__drop_data(buffer); 1295 free(buffer); 1296 } 1297 1298 void auxtrace_synth_guest_error(struct perf_record_auxtrace_error *auxtrace_error, int type, 1299 int code, int cpu, pid_t pid, pid_t tid, u64 ip, 1300 const char *msg, u64 timestamp, 1301 pid_t machine_pid, int vcpu) 1302 { 1303 size_t size; 1304 1305 memset(auxtrace_error, 0, sizeof(struct perf_record_auxtrace_error)); 1306 1307 auxtrace_error->header.type = PERF_RECORD_AUXTRACE_ERROR; 1308 auxtrace_error->type = type; 1309 auxtrace_error->code = code; 1310 auxtrace_error->cpu = cpu; 1311 auxtrace_error->pid = pid; 1312 auxtrace_error->tid = tid; 1313 auxtrace_error->fmt = 1; 1314 auxtrace_error->ip = ip; 1315 auxtrace_error->time = timestamp; 1316 strlcpy(auxtrace_error->msg, msg, MAX_AUXTRACE_ERROR_MSG); 1317 if (machine_pid) { 1318 auxtrace_error->fmt = 2; 1319 auxtrace_error->machine_pid = machine_pid; 1320 auxtrace_error->vcpu = vcpu; 1321 size = sizeof(*auxtrace_error); 1322 } else { 1323 size = (void *)auxtrace_error->msg - (void *)auxtrace_error + 1324 strlen(auxtrace_error->msg) + 1; 1325 } 1326 auxtrace_error->header.size = PERF_ALIGN(size, sizeof(u64)); 1327 } 1328 1329 void auxtrace_synth_error(struct perf_record_auxtrace_error *auxtrace_error, int type, 1330 int code, int cpu, pid_t pid, pid_t tid, u64 ip, 1331 const char *msg, u64 timestamp) 1332 { 1333 auxtrace_synth_guest_error(auxtrace_error, type, code, cpu, pid, tid, 1334 ip, msg, timestamp, 0, -1); 1335 } 1336 1337 int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr, 1338 const struct perf_tool *tool, 1339 struct perf_session *session, 1340 perf_event__handler_t process) 1341 { 1342 union perf_event *ev; 1343 size_t priv_size; 1344 int err; 1345 1346 pr_debug2("Synthesizing auxtrace information\n"); 1347 priv_size = auxtrace_record__info_priv_size(itr, session->evlist); 1348 ev = zalloc(sizeof(struct perf_record_auxtrace_info) + priv_size); 1349 if (!ev) 1350 return -ENOMEM; 1351 1352 ev->auxtrace_info.header.type = PERF_RECORD_AUXTRACE_INFO; 1353 ev->auxtrace_info.header.size = sizeof(struct perf_record_auxtrace_info) + 1354 priv_size; 1355 err = auxtrace_record__info_fill(itr, session, &ev->auxtrace_info, 1356 priv_size); 1357 if (err) 1358 goto out_free; 1359 1360 err = process(tool, ev, NULL, NULL); 1361 out_free: 1362 free(ev); 1363 return err; 1364 } 1365 1366 static void unleader_evsel(struct evlist *evlist, struct evsel *leader) 1367 { 1368 struct evsel *new_leader = NULL; 1369 struct evsel *evsel; 1370 1371 /* Find new leader for the group */ 1372 evlist__for_each_entry(evlist, evsel) { 1373 if (!evsel__has_leader(evsel, leader) || evsel == leader) 1374 continue; 1375 if (!new_leader) 1376 new_leader = evsel; 1377 evsel__set_leader(evsel, new_leader); 1378 } 1379 1380 /* Update group information */ 1381 if (new_leader) { 1382 zfree(&new_leader->group_name); 1383 new_leader->group_name = leader->group_name; 1384 leader->group_name = NULL; 1385 1386 new_leader->core.nr_members = leader->core.nr_members - 1; 1387 leader->core.nr_members = 1; 1388 } 1389 } 1390 1391 static void unleader_auxtrace(struct perf_session *session) 1392 { 1393 struct evsel *evsel; 1394 1395 evlist__for_each_entry(session->evlist, evsel) { 1396 if (auxtrace__evsel_is_auxtrace(session, evsel) && 1397 evsel__is_group_leader(evsel)) { 1398 unleader_evsel(session->evlist, evsel); 1399 } 1400 } 1401 } 1402 1403 int perf_event__process_auxtrace_info(const struct perf_tool *tool __maybe_unused, 1404 struct perf_session *session, 1405 union perf_event *event) 1406 { 1407 enum auxtrace_type type = event->auxtrace_info.type; 1408 int err; 1409 1410 if (dump_trace) 1411 fprintf(stdout, " type: %u\n", type); 1412 1413 switch (type) { 1414 case PERF_AUXTRACE_INTEL_PT: 1415 err = intel_pt_process_auxtrace_info(event, session); 1416 break; 1417 case PERF_AUXTRACE_INTEL_BTS: 1418 err = intel_bts_process_auxtrace_info(event, session); 1419 break; 1420 case PERF_AUXTRACE_ARM_SPE: 1421 err = arm_spe_process_auxtrace_info(event, session); 1422 break; 1423 case PERF_AUXTRACE_CS_ETM: 1424 err = cs_etm__process_auxtrace_info(event, session); 1425 break; 1426 case PERF_AUXTRACE_S390_CPUMSF: 1427 err = s390_cpumsf_process_auxtrace_info(event, session); 1428 break; 1429 case PERF_AUXTRACE_HISI_PTT: 1430 err = hisi_ptt_process_auxtrace_info(event, session); 1431 break; 1432 case PERF_AUXTRACE_VPA_DTL: 1433 err = powerpc_vpadtl_process_auxtrace_info(event, session); 1434 break; 1435 case PERF_AUXTRACE_UNKNOWN: 1436 default: 1437 return -EINVAL; 1438 } 1439 1440 if (err) 1441 return err; 1442 1443 unleader_auxtrace(session); 1444 1445 return 0; 1446 } 1447 1448 s64 perf_event__process_auxtrace(const struct perf_tool *tool __maybe_unused, 1449 struct perf_session *session, 1450 union perf_event *event) 1451 { 1452 s64 err; 1453 1454 if (dump_trace) 1455 fprintf(stdout, " size: %#"PRI_lx64" offset: %#"PRI_lx64" ref: %#"PRI_lx64" idx: %u tid: %d cpu: %d\n", 1456 event->auxtrace.size, event->auxtrace.offset, 1457 event->auxtrace.reference, event->auxtrace.idx, 1458 event->auxtrace.tid, event->auxtrace.cpu); 1459 1460 if (auxtrace__dont_decode(session)) 1461 return event->auxtrace.size; 1462 1463 if (!session->auxtrace || event->header.type != PERF_RECORD_AUXTRACE) 1464 return -EINVAL; 1465 1466 err = session->auxtrace->process_auxtrace_event(session, event, session->tool); 1467 if (err < 0) 1468 return err; 1469 1470 return event->auxtrace.size; 1471 } 1472 1473 #define PERF_ITRACE_DEFAULT_PERIOD_TYPE PERF_ITRACE_PERIOD_NANOSECS 1474 #define PERF_ITRACE_DEFAULT_PERIOD 100000 1475 #define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ 16 1476 #define PERF_ITRACE_MAX_CALLCHAIN_SZ 1024 1477 #define PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ 64 1478 #define PERF_ITRACE_MAX_LAST_BRANCH_SZ 1024 1479 1480 void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts, 1481 bool no_sample) 1482 { 1483 synth_opts->branches = true; 1484 synth_opts->transactions = true; 1485 synth_opts->ptwrites = true; 1486 synth_opts->pwr_events = true; 1487 synth_opts->other_events = true; 1488 synth_opts->intr_events = true; 1489 synth_opts->errors = true; 1490 synth_opts->flc = true; 1491 synth_opts->llc = true; 1492 synth_opts->tlb = true; 1493 synth_opts->mem = true; 1494 synth_opts->remote_access = true; 1495 1496 if (no_sample) { 1497 synth_opts->period_type = PERF_ITRACE_PERIOD_INSTRUCTIONS; 1498 synth_opts->period = 1; 1499 synth_opts->calls = true; 1500 } else { 1501 synth_opts->instructions = true; 1502 synth_opts->cycles = true; 1503 synth_opts->period_type = PERF_ITRACE_DEFAULT_PERIOD_TYPE; 1504 synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD; 1505 } 1506 synth_opts->callchain_sz = PERF_ITRACE_DEFAULT_CALLCHAIN_SZ; 1507 synth_opts->last_branch_sz = PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ; 1508 synth_opts->initial_skip = 0; 1509 } 1510 1511 static int get_flag(const char **ptr, unsigned int *flags) 1512 { 1513 while (1) { 1514 char c = **ptr; 1515 1516 if (c >= 'a' && c <= 'z') { 1517 *flags |= 1 << (c - 'a'); 1518 ++*ptr; 1519 return 0; 1520 } else if (c == ' ') { 1521 ++*ptr; 1522 continue; 1523 } else { 1524 return -1; 1525 } 1526 } 1527 } 1528 1529 static int get_flags(const char **ptr, unsigned int *plus_flags, unsigned int *minus_flags) 1530 { 1531 while (1) { 1532 switch (**ptr) { 1533 case '+': 1534 ++*ptr; 1535 if (get_flag(ptr, plus_flags)) 1536 return -1; 1537 break; 1538 case '-': 1539 ++*ptr; 1540 if (get_flag(ptr, minus_flags)) 1541 return -1; 1542 break; 1543 case ' ': 1544 ++*ptr; 1545 break; 1546 default: 1547 return 0; 1548 } 1549 } 1550 } 1551 1552 #define ITRACE_DFLT_LOG_ON_ERROR_SZ 16384 1553 1554 static unsigned int itrace_log_on_error_size(void) 1555 { 1556 unsigned int sz = 0; 1557 1558 perf_config_scan("itrace.debug-log-buffer-size", "%u", &sz); 1559 return sz ?: ITRACE_DFLT_LOG_ON_ERROR_SZ; 1560 } 1561 1562 /* 1563 * Please check tools/perf/Documentation/perf-script.txt for information 1564 * about the options parsed here, which is introduced after this cset, 1565 * when support in 'perf script' for these options is introduced. 1566 */ 1567 int itrace_do_parse_synth_opts(struct itrace_synth_opts *synth_opts, 1568 const char *str, int unset) 1569 { 1570 const char *p; 1571 char *endptr; 1572 bool period_type_set = false; 1573 bool period_set = false; 1574 bool iy = false; 1575 1576 synth_opts->set = true; 1577 1578 if (unset) { 1579 synth_opts->dont_decode = true; 1580 return 0; 1581 } 1582 1583 if (!str) { 1584 itrace_synth_opts__set_default(synth_opts, 1585 synth_opts->default_no_sample); 1586 return 0; 1587 } 1588 1589 for (p = str; *p;) { 1590 switch (*p++) { 1591 case 'i': 1592 case 'y': 1593 iy = true; 1594 if (p[-1] == 'y') 1595 synth_opts->cycles = true; 1596 else 1597 synth_opts->instructions = true; 1598 while (*p == ' ' || *p == ',') 1599 p += 1; 1600 if (isdigit(*p)) { 1601 synth_opts->period = strtoull(p, &endptr, 10); 1602 period_set = true; 1603 p = endptr; 1604 while (*p == ' ' || *p == ',') 1605 p += 1; 1606 switch (*p++) { 1607 case 'i': 1608 synth_opts->period_type = 1609 PERF_ITRACE_PERIOD_INSTRUCTIONS; 1610 period_type_set = true; 1611 break; 1612 case 't': 1613 synth_opts->period_type = 1614 PERF_ITRACE_PERIOD_TICKS; 1615 period_type_set = true; 1616 break; 1617 case 'm': 1618 synth_opts->period *= 1000; 1619 /* Fall through */ 1620 case 'u': 1621 synth_opts->period *= 1000; 1622 /* Fall through */ 1623 case 'n': 1624 if (*p++ != 's') 1625 goto out_err; 1626 synth_opts->period_type = 1627 PERF_ITRACE_PERIOD_NANOSECS; 1628 period_type_set = true; 1629 break; 1630 case '\0': 1631 goto out; 1632 default: 1633 goto out_err; 1634 } 1635 } 1636 break; 1637 case 'b': 1638 synth_opts->branches = true; 1639 break; 1640 case 'x': 1641 synth_opts->transactions = true; 1642 break; 1643 case 'w': 1644 synth_opts->ptwrites = true; 1645 break; 1646 case 'p': 1647 synth_opts->pwr_events = true; 1648 break; 1649 case 'o': 1650 synth_opts->other_events = true; 1651 break; 1652 case 'I': 1653 synth_opts->intr_events = true; 1654 break; 1655 case 'e': 1656 synth_opts->errors = true; 1657 if (get_flags(&p, &synth_opts->error_plus_flags, 1658 &synth_opts->error_minus_flags)) 1659 goto out_err; 1660 break; 1661 case 'd': 1662 synth_opts->log = true; 1663 if (get_flags(&p, &synth_opts->log_plus_flags, 1664 &synth_opts->log_minus_flags)) 1665 goto out_err; 1666 if (synth_opts->log_plus_flags & AUXTRACE_LOG_FLG_ON_ERROR) 1667 synth_opts->log_on_error_size = itrace_log_on_error_size(); 1668 break; 1669 case 'c': 1670 synth_opts->branches = true; 1671 synth_opts->calls = true; 1672 break; 1673 case 'r': 1674 synth_opts->branches = true; 1675 synth_opts->returns = true; 1676 break; 1677 case 'G': 1678 case 'g': 1679 if (p[-1] == 'G') 1680 synth_opts->add_callchain = true; 1681 else 1682 synth_opts->callchain = true; 1683 synth_opts->callchain_sz = 1684 PERF_ITRACE_DEFAULT_CALLCHAIN_SZ; 1685 while (*p == ' ' || *p == ',') 1686 p += 1; 1687 if (isdigit(*p)) { 1688 unsigned int val; 1689 1690 val = strtoul(p, &endptr, 10); 1691 p = endptr; 1692 if (!val || val > PERF_ITRACE_MAX_CALLCHAIN_SZ) 1693 goto out_err; 1694 synth_opts->callchain_sz = val; 1695 } 1696 break; 1697 case 'L': 1698 case 'l': 1699 if (p[-1] == 'L') 1700 synth_opts->add_last_branch = true; 1701 else 1702 synth_opts->last_branch = true; 1703 synth_opts->last_branch_sz = 1704 PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ; 1705 while (*p == ' ' || *p == ',') 1706 p += 1; 1707 if (isdigit(*p)) { 1708 unsigned int val; 1709 1710 val = strtoul(p, &endptr, 10); 1711 p = endptr; 1712 if (!val || 1713 val > PERF_ITRACE_MAX_LAST_BRANCH_SZ) 1714 goto out_err; 1715 synth_opts->last_branch_sz = val; 1716 } 1717 break; 1718 case 's': 1719 synth_opts->initial_skip = strtoul(p, &endptr, 10); 1720 if (p == endptr) 1721 goto out_err; 1722 p = endptr; 1723 break; 1724 case 'f': 1725 synth_opts->flc = true; 1726 break; 1727 case 'm': 1728 synth_opts->llc = true; 1729 break; 1730 case 't': 1731 synth_opts->tlb = true; 1732 break; 1733 case 'a': 1734 synth_opts->remote_access = true; 1735 break; 1736 case 'M': 1737 synth_opts->mem = true; 1738 break; 1739 case 'q': 1740 synth_opts->quick += 1; 1741 break; 1742 case 'A': 1743 synth_opts->approx_ipc = true; 1744 break; 1745 case 'Z': 1746 synth_opts->timeless_decoding = true; 1747 break; 1748 case 'T': 1749 synth_opts->use_timestamp = true; 1750 break; 1751 case ' ': 1752 case ',': 1753 break; 1754 default: 1755 goto out_err; 1756 } 1757 } 1758 out: 1759 if (iy) { 1760 if (!period_type_set) 1761 synth_opts->period_type = 1762 PERF_ITRACE_DEFAULT_PERIOD_TYPE; 1763 if (!period_set) 1764 synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD; 1765 } 1766 1767 return 0; 1768 1769 out_err: 1770 pr_err("Bad Instruction Tracing options '%s'\n", str); 1771 return -EINVAL; 1772 } 1773 1774 int itrace_parse_synth_opts(const struct option *opt, const char *str, int unset) 1775 { 1776 return itrace_do_parse_synth_opts(opt->value, str, unset); 1777 } 1778 1779 static const char * const auxtrace_error_type_name[] = { 1780 [PERF_AUXTRACE_ERROR_ITRACE] = "instruction trace", 1781 }; 1782 1783 static const char *auxtrace_error_name(unsigned int type) 1784 { 1785 const char *error_type_name = NULL; 1786 1787 if (type < PERF_AUXTRACE_ERROR_MAX) 1788 error_type_name = auxtrace_error_type_name[type]; 1789 if (!error_type_name) 1790 error_type_name = "unknown AUX"; 1791 return error_type_name; 1792 } 1793 1794 size_t perf_event__fprintf_auxtrace_error(union perf_event *event, FILE *fp) 1795 { 1796 struct perf_record_auxtrace_error *e = &event->auxtrace_error; 1797 unsigned long long nsecs = e->time; 1798 const char *msg = e->msg; 1799 int msg_max; 1800 int ret; 1801 1802 ret = fprintf(fp, " %s error type %u", 1803 auxtrace_error_name(e->type), e->type); 1804 1805 if (e->fmt && nsecs) { 1806 unsigned long secs = nsecs / NSEC_PER_SEC; 1807 1808 nsecs -= secs * NSEC_PER_SEC; 1809 ret += fprintf(fp, " time %lu.%09llu", secs, nsecs); 1810 } else { 1811 ret += fprintf(fp, " time 0"); 1812 } 1813 1814 if (!e->fmt) 1815 msg = (const char *)&e->time; 1816 1817 /* Bound msg to the bytes actually within the event, capped at the array size */ 1818 msg_max = (int)((void *)event + event->header.size - (void *)msg); 1819 if (msg_max < 0) 1820 msg_max = 0; 1821 if (msg_max > (int)sizeof(e->msg)) 1822 msg_max = sizeof(e->msg); 1823 1824 /* 1825 * Unlike the swap path which downgrades fmt in place, 1826 * native-endian events are mmap'd read-only — check size 1827 * instead to avoid accessing machine_pid/vcpu OOB. 1828 */ 1829 if (e->fmt >= 2 && 1830 event->header.size >= offsetof(typeof(event->auxtrace_error), vcpu) + 1831 sizeof(event->auxtrace_error.vcpu) && 1832 e->machine_pid) 1833 ret += fprintf(fp, " machine_pid %d vcpu %d", e->machine_pid, e->vcpu); 1834 1835 ret += fprintf(fp, " cpu %d pid %d tid %d ip %#"PRI_lx64" code %u: %.*s\n", 1836 e->cpu, e->pid, e->tid, e->ip, e->code, msg_max, msg); 1837 return ret; 1838 } 1839 1840 void perf_session__auxtrace_error_inc(struct perf_session *session, 1841 union perf_event *event) 1842 { 1843 struct perf_record_auxtrace_error *e = &event->auxtrace_error; 1844 1845 if (e->type < PERF_AUXTRACE_ERROR_MAX) 1846 evlist__stats(session->evlist)->nr_auxtrace_errors[e->type] += 1; 1847 } 1848 1849 void events_stats__auxtrace_error_warn(const struct events_stats *stats) 1850 { 1851 int i; 1852 1853 for (i = 0; i < PERF_AUXTRACE_ERROR_MAX; i++) { 1854 if (!stats->nr_auxtrace_errors[i]) 1855 continue; 1856 ui__warning("%u %s errors\n", 1857 stats->nr_auxtrace_errors[i], 1858 auxtrace_error_name(i)); 1859 } 1860 } 1861 1862 int perf_event__process_auxtrace_error(const struct perf_tool *tool __maybe_unused, 1863 struct perf_session *session, 1864 union perf_event *event) 1865 { 1866 if (auxtrace__dont_decode(session)) 1867 return 0; 1868 1869 perf_event__fprintf_auxtrace_error(event, stdout); 1870 return 0; 1871 } 1872 1873 /* 1874 * In the compat mode kernel runs in 64-bit and perf tool runs in 32-bit mode, 1875 * 32-bit perf tool cannot access 64-bit value atomically, which might lead to 1876 * the issues caused by the below sequence on multiple CPUs: when perf tool 1877 * accesses either the load operation or the store operation for 64-bit value, 1878 * on some architectures the operation is divided into two instructions, one 1879 * is for accessing the low 32-bit value and another is for the high 32-bit; 1880 * thus these two user operations can give the kernel chances to access the 1881 * 64-bit value, and thus leads to the unexpected load values. 1882 * 1883 * kernel (64-bit) user (32-bit) 1884 * 1885 * if (LOAD ->aux_tail) { --, LOAD ->aux_head_lo 1886 * STORE $aux_data | ,---> 1887 * FLUSH $aux_data | | LOAD ->aux_head_hi 1888 * STORE ->aux_head --|-------` smp_rmb() 1889 * } | LOAD $data 1890 * | smp_mb() 1891 * | STORE ->aux_tail_lo 1892 * `-----------> 1893 * STORE ->aux_tail_hi 1894 * 1895 * For this reason, it's impossible for the perf tool to work correctly when 1896 * the AUX head or tail is bigger than 4GB (more than 32 bits length); and we 1897 * can not simply limit the AUX ring buffer to less than 4GB, the reason is 1898 * the pointers can be increased monotonically, whatever the buffer size it is, 1899 * at the end the head and tail can be bigger than 4GB and carry out to the 1900 * high 32-bit. 1901 * 1902 * To mitigate the issues and improve the user experience, we can allow the 1903 * perf tool working in certain conditions and bail out with error if detect 1904 * any overflow cannot be handled. 1905 * 1906 * For reading the AUX head, it reads out the values for three times, and 1907 * compares the high 4 bytes of the values between the first time and the last 1908 * time, if there has no change for high 4 bytes injected by the kernel during 1909 * the user reading sequence, it's safe for use the second value. 1910 * 1911 * When compat_auxtrace_mmap__write_tail() detects any carrying in the high 1912 * 32 bits, it means there have two store operations in user space and it cannot 1913 * promise the atomicity for 64-bit write, so return '-1' in this case to tell 1914 * the caller an overflow error has happened. 1915 */ 1916 u64 __weak compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm) 1917 { 1918 struct perf_event_mmap_page *pc = mm->userpg; 1919 u64 first, second, last; 1920 u64 mask = (u64)(UINT32_MAX) << 32; 1921 1922 do { 1923 first = READ_ONCE(pc->aux_head); 1924 /* Ensure all reads are done after we read the head */ 1925 smp_rmb(); 1926 second = READ_ONCE(pc->aux_head); 1927 /* Ensure all reads are done after we read the head */ 1928 smp_rmb(); 1929 last = READ_ONCE(pc->aux_head); 1930 } while ((first & mask) != (last & mask)); 1931 1932 return second; 1933 } 1934 1935 int __weak compat_auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail) 1936 { 1937 struct perf_event_mmap_page *pc = mm->userpg; 1938 u64 mask = (u64)(UINT32_MAX) << 32; 1939 1940 if (tail & mask) 1941 return -1; 1942 1943 /* Ensure all reads are done before we write the tail out */ 1944 smp_mb(); 1945 WRITE_ONCE(pc->aux_tail, tail); 1946 return 0; 1947 } 1948 1949 static int __auxtrace_mmap__read(struct mmap *map, 1950 struct auxtrace_record *itr, struct perf_env *env, 1951 const struct perf_tool *tool, process_auxtrace_t fn, 1952 bool snapshot, size_t snapshot_size) 1953 { 1954 struct auxtrace_mmap *mm = &map->auxtrace_mmap; 1955 u64 head, old = mm->prev, offset, ref; 1956 unsigned char *data = mm->base; 1957 size_t size, head_off, old_off, len1, len2, padding; 1958 union perf_event ev; 1959 void *data1, *data2; 1960 int kernel_is_64_bit = perf_env__kernel_is_64_bit(env); 1961 1962 head = auxtrace_mmap__read_head(mm, kernel_is_64_bit); 1963 1964 if (snapshot && 1965 auxtrace_record__find_snapshot(itr, mm->idx, mm, data, &head, &old)) 1966 return -1; 1967 1968 if (old == head) 1969 return 0; 1970 1971 pr_debug3("auxtrace idx %d old %#"PRIx64" head %#"PRIx64" diff %#"PRIx64"\n", 1972 mm->idx, old, head, head - old); 1973 1974 if (mm->mask) { 1975 head_off = head & mm->mask; 1976 old_off = old & mm->mask; 1977 } else { 1978 head_off = head % mm->len; 1979 old_off = old % mm->len; 1980 } 1981 1982 if (head_off > old_off) 1983 size = head_off - old_off; 1984 else 1985 size = mm->len - (old_off - head_off); 1986 1987 if (snapshot && size > snapshot_size) 1988 size = snapshot_size; 1989 1990 ref = auxtrace_record__reference(itr); 1991 1992 if (head > old || size <= head || mm->mask) { 1993 offset = head - size; 1994 } else { 1995 /* 1996 * When the buffer size is not a power of 2, 'head' wraps at the 1997 * highest multiple of the buffer size, so we have to subtract 1998 * the remainder here. 1999 */ 2000 u64 rem = (0ULL - mm->len) % mm->len; 2001 2002 offset = head - size - rem; 2003 } 2004 2005 if (size > head_off) { 2006 len1 = size - head_off; 2007 data1 = &data[mm->len - len1]; 2008 len2 = head_off; 2009 data2 = &data[0]; 2010 } else { 2011 len1 = size; 2012 data1 = &data[head_off - len1]; 2013 len2 = 0; 2014 data2 = NULL; 2015 } 2016 2017 if (itr->alignment) { 2018 unsigned int unwanted = len1 % itr->alignment; 2019 2020 len1 -= unwanted; 2021 size -= unwanted; 2022 } 2023 2024 /* padding must be written by fn() e.g. record__process_auxtrace() */ 2025 padding = size & (PERF_AUXTRACE_RECORD_ALIGNMENT - 1); 2026 if (padding) 2027 padding = PERF_AUXTRACE_RECORD_ALIGNMENT - padding; 2028 2029 memset(&ev, 0, sizeof(ev)); 2030 ev.auxtrace.header.type = PERF_RECORD_AUXTRACE; 2031 ev.auxtrace.header.size = sizeof(ev.auxtrace); 2032 ev.auxtrace.size = size + padding; 2033 ev.auxtrace.offset = offset; 2034 ev.auxtrace.reference = ref; 2035 ev.auxtrace.idx = mm->idx; 2036 ev.auxtrace.tid = mm->tid; 2037 ev.auxtrace.cpu = mm->cpu; 2038 2039 if (fn(tool, map, &ev, data1, len1, data2, len2)) 2040 return -1; 2041 2042 mm->prev = head; 2043 2044 if (!snapshot) { 2045 int err; 2046 2047 err = auxtrace_mmap__write_tail(mm, head, kernel_is_64_bit); 2048 if (err < 0) 2049 return err; 2050 2051 if (itr->read_finish) { 2052 err = itr->read_finish(itr, mm->idx); 2053 if (err < 0) 2054 return err; 2055 } 2056 } 2057 2058 return 1; 2059 } 2060 2061 int auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr, 2062 struct perf_env *env, const struct perf_tool *tool, 2063 process_auxtrace_t fn) 2064 { 2065 return __auxtrace_mmap__read(map, itr, env, tool, fn, false, 0); 2066 } 2067 2068 int auxtrace_mmap__read_snapshot(struct mmap *map, 2069 struct auxtrace_record *itr, struct perf_env *env, 2070 const struct perf_tool *tool, process_auxtrace_t fn, 2071 size_t snapshot_size) 2072 { 2073 return __auxtrace_mmap__read(map, itr, env, tool, fn, true, snapshot_size); 2074 } 2075 2076 /** 2077 * struct auxtrace_cache - hash table to implement a cache 2078 * @hashtable: the hashtable 2079 * @sz: hashtable size (number of hlists) 2080 * @entry_size: size of an entry 2081 * @limit: limit the number of entries to this maximum, when reached the cache 2082 * is dropped and caching begins again with an empty cache 2083 * @cnt: current number of entries 2084 * @bits: hashtable size (@sz = 2^@bits) 2085 */ 2086 struct auxtrace_cache { 2087 struct hlist_head *hashtable; 2088 size_t sz; 2089 size_t entry_size; 2090 size_t limit; 2091 size_t cnt; 2092 unsigned int bits; 2093 }; 2094 2095 struct auxtrace_cache *auxtrace_cache__new(unsigned int bits, size_t entry_size, 2096 unsigned int limit_percent) 2097 { 2098 struct auxtrace_cache *c; 2099 struct hlist_head *ht; 2100 size_t sz, i; 2101 2102 c = zalloc(sizeof(struct auxtrace_cache)); 2103 if (!c) 2104 return NULL; 2105 2106 sz = 1UL << bits; 2107 2108 ht = calloc(sz, sizeof(struct hlist_head)); 2109 if (!ht) 2110 goto out_free; 2111 2112 for (i = 0; i < sz; i++) 2113 INIT_HLIST_HEAD(&ht[i]); 2114 2115 c->hashtable = ht; 2116 c->sz = sz; 2117 c->entry_size = entry_size; 2118 c->limit = (c->sz * limit_percent) / 100; 2119 c->bits = bits; 2120 2121 return c; 2122 2123 out_free: 2124 free(c); 2125 return NULL; 2126 } 2127 2128 static void auxtrace_cache__drop(struct auxtrace_cache *c) 2129 { 2130 struct auxtrace_cache_entry *entry; 2131 struct hlist_node *tmp; 2132 size_t i; 2133 2134 if (!c) 2135 return; 2136 2137 for (i = 0; i < c->sz; i++) { 2138 hlist_for_each_entry_safe(entry, tmp, &c->hashtable[i], hash) { 2139 hlist_del(&entry->hash); 2140 auxtrace_cache__free_entry(c, entry); 2141 } 2142 } 2143 2144 c->cnt = 0; 2145 } 2146 2147 void auxtrace_cache__free(struct auxtrace_cache *c) 2148 { 2149 if (!c) 2150 return; 2151 2152 auxtrace_cache__drop(c); 2153 zfree(&c->hashtable); 2154 free(c); 2155 } 2156 2157 void *auxtrace_cache__alloc_entry(struct auxtrace_cache *c) 2158 { 2159 return malloc(c->entry_size); 2160 } 2161 2162 void auxtrace_cache__free_entry(struct auxtrace_cache *c __maybe_unused, 2163 void *entry) 2164 { 2165 free(entry); 2166 } 2167 2168 int auxtrace_cache__add(struct auxtrace_cache *c, u32 key, 2169 struct auxtrace_cache_entry *entry) 2170 { 2171 if (c->limit && ++c->cnt > c->limit) 2172 auxtrace_cache__drop(c); 2173 2174 entry->key = key; 2175 hlist_add_head(&entry->hash, &c->hashtable[hash_32(key, c->bits)]); 2176 2177 return 0; 2178 } 2179 2180 static struct auxtrace_cache_entry *auxtrace_cache__rm(struct auxtrace_cache *c, 2181 u32 key) 2182 { 2183 struct auxtrace_cache_entry *entry; 2184 struct hlist_head *hlist; 2185 struct hlist_node *n; 2186 2187 if (!c) 2188 return NULL; 2189 2190 hlist = &c->hashtable[hash_32(key, c->bits)]; 2191 hlist_for_each_entry_safe(entry, n, hlist, hash) { 2192 if (entry->key == key) { 2193 hlist_del(&entry->hash); 2194 return entry; 2195 } 2196 } 2197 2198 return NULL; 2199 } 2200 2201 void auxtrace_cache__remove(struct auxtrace_cache *c, u32 key) 2202 { 2203 struct auxtrace_cache_entry *entry = auxtrace_cache__rm(c, key); 2204 2205 auxtrace_cache__free_entry(c, entry); 2206 } 2207 2208 void *auxtrace_cache__lookup(struct auxtrace_cache *c, u32 key) 2209 { 2210 struct auxtrace_cache_entry *entry; 2211 struct hlist_head *hlist; 2212 2213 if (!c) 2214 return NULL; 2215 2216 hlist = &c->hashtable[hash_32(key, c->bits)]; 2217 hlist_for_each_entry(entry, hlist, hash) { 2218 if (entry->key == key) 2219 return entry; 2220 } 2221 2222 return NULL; 2223 } 2224 2225 static void addr_filter__free_str(struct addr_filter *filt) 2226 { 2227 zfree(&filt->str); 2228 filt->action = NULL; 2229 filt->sym_from = NULL; 2230 filt->sym_to = NULL; 2231 filt->filename = NULL; 2232 } 2233 2234 static struct addr_filter *addr_filter__new(void) 2235 { 2236 struct addr_filter *filt = zalloc(sizeof(*filt)); 2237 2238 if (filt) 2239 INIT_LIST_HEAD(&filt->list); 2240 2241 return filt; 2242 } 2243 2244 static void addr_filter__free(struct addr_filter *filt) 2245 { 2246 if (filt) 2247 addr_filter__free_str(filt); 2248 free(filt); 2249 } 2250 2251 static void addr_filters__add(struct addr_filters *filts, 2252 struct addr_filter *filt) 2253 { 2254 list_add_tail(&filt->list, &filts->head); 2255 filts->cnt += 1; 2256 } 2257 2258 static void addr_filters__del(struct addr_filters *filts, 2259 struct addr_filter *filt) 2260 { 2261 list_del_init(&filt->list); 2262 filts->cnt -= 1; 2263 } 2264 2265 void addr_filters__init(struct addr_filters *filts) 2266 { 2267 INIT_LIST_HEAD(&filts->head); 2268 filts->cnt = 0; 2269 } 2270 2271 void addr_filters__exit(struct addr_filters *filts) 2272 { 2273 struct addr_filter *filt, *n; 2274 2275 list_for_each_entry_safe(filt, n, &filts->head, list) { 2276 addr_filters__del(filts, filt); 2277 addr_filter__free(filt); 2278 } 2279 } 2280 2281 static int parse_num_or_str(char **inp, u64 *num, const char **str, 2282 const char *str_delim) 2283 { 2284 *inp += strspn(*inp, " "); 2285 2286 if (isdigit(**inp)) { 2287 char *endptr; 2288 2289 if (!num) 2290 return -EINVAL; 2291 errno = 0; 2292 *num = strtoull(*inp, &endptr, 0); 2293 if (errno) 2294 return -errno; 2295 if (endptr == *inp) 2296 return -EINVAL; 2297 *inp = endptr; 2298 } else { 2299 size_t n; 2300 2301 if (!str) 2302 return -EINVAL; 2303 *inp += strspn(*inp, " "); 2304 *str = *inp; 2305 n = strcspn(*inp, str_delim); 2306 if (!n) 2307 return -EINVAL; 2308 *inp += n; 2309 if (**inp) { 2310 **inp = '\0'; 2311 *inp += 1; 2312 } 2313 } 2314 return 0; 2315 } 2316 2317 static int parse_action(struct addr_filter *filt) 2318 { 2319 if (!strcmp(filt->action, "filter")) { 2320 filt->start = true; 2321 filt->range = true; 2322 } else if (!strcmp(filt->action, "start")) { 2323 filt->start = true; 2324 } else if (!strcmp(filt->action, "stop")) { 2325 filt->start = false; 2326 } else if (!strcmp(filt->action, "tracestop")) { 2327 filt->start = false; 2328 filt->range = true; 2329 filt->action += 5; /* Change 'tracestop' to 'stop' */ 2330 } else { 2331 return -EINVAL; 2332 } 2333 return 0; 2334 } 2335 2336 static int parse_sym_idx(char **inp, int *idx) 2337 { 2338 *idx = -1; 2339 2340 *inp += strspn(*inp, " "); 2341 2342 if (**inp != '#') 2343 return 0; 2344 2345 *inp += 1; 2346 2347 if (**inp == 'g' || **inp == 'G') { 2348 *inp += 1; 2349 *idx = 0; 2350 } else { 2351 unsigned long num; 2352 char *endptr; 2353 2354 errno = 0; 2355 num = strtoul(*inp, &endptr, 0); 2356 if (errno) 2357 return -errno; 2358 if (endptr == *inp || num > INT_MAX) 2359 return -EINVAL; 2360 *inp = endptr; 2361 *idx = num; 2362 } 2363 2364 return 0; 2365 } 2366 2367 static int parse_addr_size(char **inp, u64 *num, const char **str, int *idx) 2368 { 2369 int err = parse_num_or_str(inp, num, str, " "); 2370 2371 if (!err && *str) 2372 err = parse_sym_idx(inp, idx); 2373 2374 return err; 2375 } 2376 2377 static int parse_one_filter(struct addr_filter *filt, const char **filter_inp) 2378 { 2379 char *fstr; 2380 int err; 2381 2382 filt->str = fstr = strdup(*filter_inp); 2383 if (!fstr) 2384 return -ENOMEM; 2385 2386 err = parse_num_or_str(&fstr, NULL, &filt->action, " "); 2387 if (err) 2388 goto out_err; 2389 2390 err = parse_action(filt); 2391 if (err) 2392 goto out_err; 2393 2394 err = parse_addr_size(&fstr, &filt->addr, &filt->sym_from, 2395 &filt->sym_from_idx); 2396 if (err) 2397 goto out_err; 2398 2399 fstr += strspn(fstr, " "); 2400 2401 if (*fstr == '/') { 2402 fstr += 1; 2403 err = parse_addr_size(&fstr, &filt->size, &filt->sym_to, 2404 &filt->sym_to_idx); 2405 if (err) 2406 goto out_err; 2407 filt->range = true; 2408 } 2409 2410 fstr += strspn(fstr, " "); 2411 2412 if (*fstr == '@') { 2413 fstr += 1; 2414 err = parse_num_or_str(&fstr, NULL, &filt->filename, " ,"); 2415 if (err) 2416 goto out_err; 2417 } 2418 2419 fstr += strspn(fstr, " ,"); 2420 2421 *filter_inp += fstr - filt->str; 2422 2423 return 0; 2424 2425 out_err: 2426 addr_filter__free_str(filt); 2427 2428 return err; 2429 } 2430 2431 int addr_filters__parse_bare_filter(struct addr_filters *filts, 2432 const char *filter) 2433 { 2434 struct addr_filter *filt; 2435 const char *fstr = filter; 2436 int err; 2437 2438 while (*fstr) { 2439 filt = addr_filter__new(); 2440 err = parse_one_filter(filt, &fstr); 2441 if (err) { 2442 addr_filter__free(filt); 2443 addr_filters__exit(filts); 2444 return err; 2445 } 2446 addr_filters__add(filts, filt); 2447 } 2448 2449 return 0; 2450 } 2451 2452 struct sym_args { 2453 const char *name; 2454 u64 start; 2455 u64 size; 2456 int idx; 2457 int cnt; 2458 bool started; 2459 bool global; 2460 bool selected; 2461 bool duplicate; 2462 bool near; 2463 }; 2464 2465 static bool kern_sym_name_match(const char *kname, const char *name) 2466 { 2467 size_t n = strlen(name); 2468 2469 return !strcmp(kname, name) || 2470 (!strncmp(kname, name, n) && kname[n] == '\t'); 2471 } 2472 2473 static bool kern_sym_match(struct sym_args *args, const char *name, char type) 2474 { 2475 /* A function with the same name, and global or the n'th found or any */ 2476 return kallsyms__is_function(type) && 2477 kern_sym_name_match(name, args->name) && 2478 ((args->global && isupper(type)) || 2479 (args->selected && ++(args->cnt) == args->idx) || 2480 (!args->global && !args->selected)); 2481 } 2482 2483 static int find_kern_sym_cb(void *arg, const char *name, char type, u64 start) 2484 { 2485 struct sym_args *args = arg; 2486 2487 if (args->started) { 2488 if (!args->size) 2489 args->size = start - args->start; 2490 if (args->selected) { 2491 if (args->size) 2492 return 1; 2493 } else if (kern_sym_match(args, name, type)) { 2494 args->duplicate = true; 2495 return 1; 2496 } 2497 } else if (kern_sym_match(args, name, type)) { 2498 args->started = true; 2499 args->start = start; 2500 } 2501 2502 return 0; 2503 } 2504 2505 static int print_kern_sym_cb(void *arg, const char *name, char type, u64 start) 2506 { 2507 struct sym_args *args = arg; 2508 2509 if (kern_sym_match(args, name, type)) { 2510 pr_err("#%d\t0x%"PRIx64"\t%c\t%s\n", 2511 ++args->cnt, start, type, name); 2512 args->near = true; 2513 } else if (args->near) { 2514 args->near = false; 2515 pr_err("\t\twhich is near\t\t%s\n", name); 2516 } 2517 2518 return 0; 2519 } 2520 2521 static int sym_not_found_error(const char *sym_name, int idx) 2522 { 2523 if (idx > 0) { 2524 pr_err("N'th occurrence (N=%d) of symbol '%s' not found.\n", 2525 idx, sym_name); 2526 } else if (!idx) { 2527 pr_err("Global symbol '%s' not found.\n", sym_name); 2528 } else { 2529 pr_err("Symbol '%s' not found.\n", sym_name); 2530 } 2531 pr_err("Note that symbols must be functions.\n"); 2532 2533 return -EINVAL; 2534 } 2535 2536 static int find_kern_sym(const char *sym_name, u64 *start, u64 *size, int idx) 2537 { 2538 struct sym_args args = { 2539 .name = sym_name, 2540 .idx = idx, 2541 .global = !idx, 2542 .selected = idx > 0, 2543 }; 2544 int err; 2545 2546 *start = 0; 2547 *size = 0; 2548 2549 err = kallsyms__parse("/proc/kallsyms", &args, find_kern_sym_cb); 2550 if (err < 0) { 2551 pr_err("Failed to parse /proc/kallsyms\n"); 2552 return err; 2553 } 2554 2555 if (args.duplicate) { 2556 pr_err("Multiple kernel symbols with name '%s'\n", sym_name); 2557 args.cnt = 0; 2558 kallsyms__parse("/proc/kallsyms", &args, print_kern_sym_cb); 2559 pr_err("Disambiguate symbol name by inserting #n after the name e.g. %s #2\n", 2560 sym_name); 2561 pr_err("Or select a global symbol by inserting #0 or #g or #G\n"); 2562 return -EINVAL; 2563 } 2564 2565 if (!args.started) { 2566 pr_err("Kernel symbol lookup: "); 2567 return sym_not_found_error(sym_name, idx); 2568 } 2569 2570 *start = args.start; 2571 *size = args.size; 2572 2573 return 0; 2574 } 2575 2576 static int find_entire_kern_cb(void *arg, const char *name __maybe_unused, 2577 char type, u64 start) 2578 { 2579 struct sym_args *args = arg; 2580 u64 size; 2581 2582 if (!kallsyms__is_function(type)) 2583 return 0; 2584 2585 if (!args->started) { 2586 args->started = true; 2587 args->start = start; 2588 } 2589 /* Don't know exactly where the kernel ends, so we add a page */ 2590 size = round_up(start, page_size) + page_size - args->start; 2591 if (size > args->size) 2592 args->size = size; 2593 2594 return 0; 2595 } 2596 2597 static int addr_filter__entire_kernel(struct addr_filter *filt) 2598 { 2599 struct sym_args args = { .started = false }; 2600 int err; 2601 2602 err = kallsyms__parse("/proc/kallsyms", &args, find_entire_kern_cb); 2603 if (err < 0 || !args.started) { 2604 pr_err("Failed to parse /proc/kallsyms\n"); 2605 return err; 2606 } 2607 2608 filt->addr = args.start; 2609 filt->size = args.size; 2610 2611 return 0; 2612 } 2613 2614 static int check_end_after_start(struct addr_filter *filt, u64 start, u64 size) 2615 { 2616 if (start + size >= filt->addr) 2617 return 0; 2618 2619 if (filt->sym_from) { 2620 pr_err("Symbol '%s' (0x%"PRIx64") comes before '%s' (0x%"PRIx64")\n", 2621 filt->sym_to, start, filt->sym_from, filt->addr); 2622 } else { 2623 pr_err("Symbol '%s' (0x%"PRIx64") comes before address 0x%"PRIx64")\n", 2624 filt->sym_to, start, filt->addr); 2625 } 2626 2627 return -EINVAL; 2628 } 2629 2630 static int addr_filter__resolve_kernel_syms(struct addr_filter *filt) 2631 { 2632 bool no_size = false; 2633 u64 start, size; 2634 int err; 2635 2636 if (symbol_conf.kptr_restrict) { 2637 pr_err("Kernel addresses are restricted. Unable to resolve kernel symbols.\n"); 2638 return -EINVAL; 2639 } 2640 2641 if (filt->sym_from && !strcmp(filt->sym_from, "*")) 2642 return addr_filter__entire_kernel(filt); 2643 2644 if (filt->sym_from) { 2645 err = find_kern_sym(filt->sym_from, &start, &size, 2646 filt->sym_from_idx); 2647 if (err) 2648 return err; 2649 filt->addr = start; 2650 if (filt->range && !filt->size && !filt->sym_to) { 2651 filt->size = size; 2652 no_size = !size; 2653 } 2654 } 2655 2656 if (filt->sym_to) { 2657 err = find_kern_sym(filt->sym_to, &start, &size, 2658 filt->sym_to_idx); 2659 if (err) 2660 return err; 2661 2662 err = check_end_after_start(filt, start, size); 2663 if (err) 2664 return err; 2665 filt->size = start + size - filt->addr; 2666 no_size = !size; 2667 } 2668 2669 /* The very last symbol in kallsyms does not imply a particular size */ 2670 if (no_size) { 2671 pr_err("Cannot determine size of symbol '%s'\n", 2672 filt->sym_to ? filt->sym_to : filt->sym_from); 2673 return -EINVAL; 2674 } 2675 2676 return 0; 2677 } 2678 2679 static struct dso *load_dso(const char *name) 2680 { 2681 struct map *map; 2682 struct dso *dso; 2683 2684 map = dso__new_map(name); 2685 if (!map) 2686 return NULL; 2687 2688 if (map__load(map) < 0) 2689 pr_err("File '%s' not found or has no symbols.\n", name); 2690 2691 dso = dso__get(map__dso(map)); 2692 2693 map__put(map); 2694 2695 return dso; 2696 } 2697 2698 static bool dso_sym_match(struct symbol *sym, const char *name, int *cnt, 2699 int idx) 2700 { 2701 /* Same name, and global or the n'th found or any */ 2702 return !arch__compare_symbol_names(name, sym->name) && 2703 ((!idx && symbol__binding(sym) == STB_GLOBAL) || 2704 (idx > 0 && ++*cnt == idx) || 2705 idx < 0); 2706 } 2707 2708 static void print_duplicate_syms(struct dso *dso, const char *sym_name) 2709 { 2710 struct symbol *sym; 2711 bool near = false; 2712 int cnt = 0; 2713 2714 pr_err("Multiple symbols with name '%s'\n", sym_name); 2715 2716 sym = dso__first_symbol(dso); 2717 while (sym) { 2718 if (dso_sym_match(sym, sym_name, &cnt, -1)) { 2719 pr_err("#%d\t0x%"PRIx64"\t%c\t%s\n", 2720 ++cnt, sym->start, 2721 symbol__binding(sym) == STB_GLOBAL ? 'g' : 2722 symbol__binding(sym) == STB_LOCAL ? 'l' : 'w', 2723 sym->name); 2724 near = true; 2725 } else if (near) { 2726 near = false; 2727 pr_err("\t\twhich is near\t\t%s\n", sym->name); 2728 } 2729 sym = dso__next_symbol(sym); 2730 } 2731 2732 pr_err("Disambiguate symbol name by inserting #n after the name e.g. %s #2\n", 2733 sym_name); 2734 pr_err("Or select a global symbol by inserting #0 or #g or #G\n"); 2735 } 2736 2737 static int find_dso_sym(struct dso *dso, const char *sym_name, u64 *start, 2738 u64 *size, int idx) 2739 { 2740 struct symbol *sym; 2741 int cnt = 0; 2742 2743 *start = 0; 2744 *size = 0; 2745 2746 sym = dso__first_symbol(dso); 2747 while (sym) { 2748 if (*start) { 2749 if (!*size) 2750 *size = sym->start - *start; 2751 if (idx > 0) { 2752 if (*size) 2753 return 0; 2754 } else if (dso_sym_match(sym, sym_name, &cnt, idx)) { 2755 print_duplicate_syms(dso, sym_name); 2756 return -EINVAL; 2757 } 2758 } else if (dso_sym_match(sym, sym_name, &cnt, idx)) { 2759 *start = sym->start; 2760 *size = sym->end - sym->start; 2761 } 2762 sym = dso__next_symbol(sym); 2763 } 2764 2765 if (!*start) 2766 return sym_not_found_error(sym_name, idx); 2767 2768 return 0; 2769 } 2770 2771 static int addr_filter__entire_dso(struct addr_filter *filt, struct dso *dso) 2772 { 2773 if (dso__data_file_size(dso, NULL)) { 2774 pr_err("Failed to determine filter for %s\nCannot determine file size.\n", 2775 filt->filename); 2776 return -EINVAL; 2777 } 2778 2779 filt->addr = 0; 2780 filt->size = dso__data(dso)->file_size; 2781 2782 return 0; 2783 } 2784 2785 static int addr_filter__resolve_syms(struct addr_filter *filt) 2786 { 2787 u64 start, size; 2788 struct dso *dso; 2789 int err = 0; 2790 2791 if (!filt->sym_from && !filt->sym_to) 2792 return 0; 2793 2794 if (!filt->filename) 2795 return addr_filter__resolve_kernel_syms(filt); 2796 2797 dso = load_dso(filt->filename); 2798 if (!dso) { 2799 pr_err("Failed to load symbols from: %s\n", filt->filename); 2800 return -EINVAL; 2801 } 2802 2803 if (filt->sym_from && !strcmp(filt->sym_from, "*")) { 2804 err = addr_filter__entire_dso(filt, dso); 2805 goto put_dso; 2806 } 2807 2808 if (filt->sym_from) { 2809 err = find_dso_sym(dso, filt->sym_from, &start, &size, 2810 filt->sym_from_idx); 2811 if (err) 2812 goto put_dso; 2813 filt->addr = start; 2814 if (filt->range && !filt->size && !filt->sym_to) 2815 filt->size = size; 2816 } 2817 2818 if (filt->sym_to) { 2819 err = find_dso_sym(dso, filt->sym_to, &start, &size, 2820 filt->sym_to_idx); 2821 if (err) 2822 goto put_dso; 2823 2824 err = check_end_after_start(filt, start, size); 2825 if (err) 2826 return err; 2827 2828 filt->size = start + size - filt->addr; 2829 } 2830 2831 put_dso: 2832 dso__put(dso); 2833 2834 return err; 2835 } 2836 2837 static char *addr_filter__to_str(struct addr_filter *filt) 2838 { 2839 char filename_buf[PATH_MAX]; 2840 const char *at = ""; 2841 const char *fn = ""; 2842 char *filter; 2843 int err; 2844 2845 if (filt->filename) { 2846 at = "@"; 2847 fn = realpath(filt->filename, filename_buf); 2848 if (!fn) 2849 return NULL; 2850 } 2851 2852 if (filt->range) { 2853 err = asprintf(&filter, "%s 0x%"PRIx64"/0x%"PRIx64"%s%s", 2854 filt->action, filt->addr, filt->size, at, fn); 2855 } else { 2856 err = asprintf(&filter, "%s 0x%"PRIx64"%s%s", 2857 filt->action, filt->addr, at, fn); 2858 } 2859 2860 return err < 0 ? NULL : filter; 2861 } 2862 2863 static int parse_addr_filter(struct evsel *evsel, const char *filter, 2864 int max_nr) 2865 { 2866 struct addr_filters filts; 2867 struct addr_filter *filt; 2868 int err; 2869 2870 addr_filters__init(&filts); 2871 2872 err = addr_filters__parse_bare_filter(&filts, filter); 2873 if (err) 2874 goto out_exit; 2875 2876 if (filts.cnt > max_nr) { 2877 pr_err("Error: number of address filters (%d) exceeds maximum (%d)\n", 2878 filts.cnt, max_nr); 2879 err = -EINVAL; 2880 goto out_exit; 2881 } 2882 2883 list_for_each_entry(filt, &filts.head, list) { 2884 char *new_filter; 2885 2886 err = addr_filter__resolve_syms(filt); 2887 if (err) 2888 goto out_exit; 2889 2890 new_filter = addr_filter__to_str(filt); 2891 if (!new_filter) { 2892 err = -ENOMEM; 2893 goto out_exit; 2894 } 2895 2896 if (evsel__append_addr_filter(evsel, new_filter)) { 2897 err = -ENOMEM; 2898 goto out_exit; 2899 } 2900 } 2901 2902 out_exit: 2903 addr_filters__exit(&filts); 2904 2905 if (err) { 2906 pr_err("Failed to parse address filter: '%s'\n", filter); 2907 pr_err("Filter format is: filter|start|stop|tracestop <start symbol or address> [/ <end symbol or size>] [@<file name>]\n"); 2908 pr_err("Where multiple filters are separated by space or comma.\n"); 2909 } 2910 2911 return err; 2912 } 2913 2914 static int evsel__nr_addr_filter(struct evsel *evsel) 2915 { 2916 struct perf_pmu *pmu = evsel__find_pmu(evsel); 2917 int nr_addr_filters = 0; 2918 2919 if (!pmu) 2920 return 0; 2921 2922 perf_pmu__scan_file(pmu, "nr_addr_filters", "%d", &nr_addr_filters); 2923 2924 return nr_addr_filters; 2925 } 2926 2927 int auxtrace_parse_filters(struct evlist *evlist) 2928 { 2929 struct evsel *evsel; 2930 char *filter; 2931 int err, max_nr; 2932 2933 evlist__for_each_entry(evlist, evsel) { 2934 filter = evsel->filter; 2935 max_nr = evsel__nr_addr_filter(evsel); 2936 if (!filter || !max_nr) 2937 continue; 2938 evsel->filter = NULL; 2939 err = parse_addr_filter(evsel, filter, max_nr); 2940 free(filter); 2941 if (err) 2942 return err; 2943 pr_debug("Address filter: %s\n", evsel->filter); 2944 } 2945 2946 return 0; 2947 } 2948 2949 int auxtrace__process_event(struct perf_session *session, union perf_event *event, 2950 struct perf_sample *sample, const struct perf_tool *tool) 2951 { 2952 if (!session->auxtrace) 2953 return 0; 2954 2955 return session->auxtrace->process_event(session, event, sample, tool); 2956 } 2957 2958 void auxtrace__dump_auxtrace_sample(struct perf_session *session, 2959 struct perf_sample *sample) 2960 { 2961 if (!session->auxtrace || !session->auxtrace->dump_auxtrace_sample || 2962 auxtrace__dont_decode(session)) 2963 return; 2964 2965 session->auxtrace->dump_auxtrace_sample(session, sample); 2966 } 2967 2968 int auxtrace__flush_events(struct perf_session *session, const struct perf_tool *tool) 2969 { 2970 if (!session->auxtrace) 2971 return 0; 2972 2973 return session->auxtrace->flush_events(session, tool); 2974 } 2975 2976 void auxtrace__free_events(struct perf_session *session) 2977 { 2978 if (!session->auxtrace) 2979 return; 2980 2981 return session->auxtrace->free_events(session); 2982 } 2983 2984 void auxtrace__free(struct perf_session *session) 2985 { 2986 if (!session->auxtrace) 2987 return; 2988 2989 return session->auxtrace->free(session); 2990 } 2991 2992 bool auxtrace__evsel_is_auxtrace(struct perf_session *session, 2993 struct evsel *evsel) 2994 { 2995 if (!session->auxtrace || !session->auxtrace->evsel_is_auxtrace) 2996 return false; 2997 2998 return session->auxtrace->evsel_is_auxtrace(session, evsel); 2999 } 3000