1 // SPDX-License-Identifier: GPL-2.0 2 #include <errno.h> 3 #include <inttypes.h> 4 #include "util.h" 5 #include "string2.h" 6 #include <sys/param.h> 7 #include <sys/types.h> 8 #include <byteswap.h> 9 #include <unistd.h> 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <linux/compiler.h> 13 #include <linux/list.h> 14 #include <linux/kernel.h> 15 #include <linux/bitops.h> 16 #include <linux/stringify.h> 17 #include <sys/stat.h> 18 #include <sys/utsname.h> 19 #include <linux/time64.h> 20 #include <dirent.h> 21 22 #include "evlist.h" 23 #include "evsel.h" 24 #include "header.h" 25 #include "memswap.h" 26 #include "../perf.h" 27 #include "trace-event.h" 28 #include "session.h" 29 #include "symbol.h" 30 #include "debug.h" 31 #include "cpumap.h" 32 #include "pmu.h" 33 #include "vdso.h" 34 #include "strbuf.h" 35 #include "build-id.h" 36 #include "data.h" 37 #include <api/fs/fs.h> 38 #include "asm/bug.h" 39 #include "tool.h" 40 #include "time-utils.h" 41 #include "units.h" 42 43 #include "sane_ctype.h" 44 45 /* 46 * magic2 = "PERFILE2" 47 * must be a numerical value to let the endianness 48 * determine the memory layout. That way we are able 49 * to detect endianness when reading the perf.data file 50 * back. 51 * 52 * we check for legacy (PERFFILE) format. 53 */ 54 static const char *__perf_magic1 = "PERFFILE"; 55 static const u64 __perf_magic2 = 0x32454c4946524550ULL; 56 static const u64 __perf_magic2_sw = 0x50455246494c4532ULL; 57 58 #define PERF_MAGIC __perf_magic2 59 60 const char perf_version_string[] = PERF_VERSION; 61 62 struct perf_file_attr { 63 struct perf_event_attr attr; 64 struct perf_file_section ids; 65 }; 66 67 struct feat_fd { 68 struct perf_header *ph; 69 int fd; 70 void *buf; /* Either buf != NULL or fd >= 0 */ 71 ssize_t offset; 72 size_t size; 73 struct perf_evsel *events; 74 }; 75 76 void perf_header__set_feat(struct perf_header *header, int feat) 77 { 78 set_bit(feat, header->adds_features); 79 } 80 81 void perf_header__clear_feat(struct perf_header *header, int feat) 82 { 83 clear_bit(feat, header->adds_features); 84 } 85 86 bool perf_header__has_feat(const struct perf_header *header, int feat) 87 { 88 return test_bit(feat, header->adds_features); 89 } 90 91 static int __do_write_fd(struct feat_fd *ff, const void *buf, size_t size) 92 { 93 ssize_t ret = writen(ff->fd, buf, size); 94 95 if (ret != (ssize_t)size) 96 return ret < 0 ? (int)ret : -1; 97 return 0; 98 } 99 100 static int __do_write_buf(struct feat_fd *ff, const void *buf, size_t size) 101 { 102 /* struct perf_event_header::size is u16 */ 103 const size_t max_size = 0xffff - sizeof(struct perf_event_header); 104 size_t new_size = ff->size; 105 void *addr; 106 107 if (size + ff->offset > max_size) 108 return -E2BIG; 109 110 while (size > (new_size - ff->offset)) 111 new_size <<= 1; 112 new_size = min(max_size, new_size); 113 114 if (ff->size < new_size) { 115 addr = realloc(ff->buf, new_size); 116 if (!addr) 117 return -ENOMEM; 118 ff->buf = addr; 119 ff->size = new_size; 120 } 121 122 memcpy(ff->buf + ff->offset, buf, size); 123 ff->offset += size; 124 125 return 0; 126 } 127 128 /* Return: 0 if succeded, -ERR if failed. */ 129 int do_write(struct feat_fd *ff, const void *buf, size_t size) 130 { 131 if (!ff->buf) 132 return __do_write_fd(ff, buf, size); 133 return __do_write_buf(ff, buf, size); 134 } 135 136 /* Return: 0 if succeded, -ERR if failed. */ 137 static int do_write_bitmap(struct feat_fd *ff, unsigned long *set, u64 size) 138 { 139 u64 *p = (u64 *) set; 140 int i, ret; 141 142 ret = do_write(ff, &size, sizeof(size)); 143 if (ret < 0) 144 return ret; 145 146 for (i = 0; (u64) i < BITS_TO_U64(size); i++) { 147 ret = do_write(ff, p + i, sizeof(*p)); 148 if (ret < 0) 149 return ret; 150 } 151 152 return 0; 153 } 154 155 /* Return: 0 if succeded, -ERR if failed. */ 156 int write_padded(struct feat_fd *ff, const void *bf, 157 size_t count, size_t count_aligned) 158 { 159 static const char zero_buf[NAME_ALIGN]; 160 int err = do_write(ff, bf, count); 161 162 if (!err) 163 err = do_write(ff, zero_buf, count_aligned - count); 164 165 return err; 166 } 167 168 #define string_size(str) \ 169 (PERF_ALIGN((strlen(str) + 1), NAME_ALIGN) + sizeof(u32)) 170 171 /* Return: 0 if succeded, -ERR if failed. */ 172 static int do_write_string(struct feat_fd *ff, const char *str) 173 { 174 u32 len, olen; 175 int ret; 176 177 olen = strlen(str) + 1; 178 len = PERF_ALIGN(olen, NAME_ALIGN); 179 180 /* write len, incl. \0 */ 181 ret = do_write(ff, &len, sizeof(len)); 182 if (ret < 0) 183 return ret; 184 185 return write_padded(ff, str, olen, len); 186 } 187 188 static int __do_read_fd(struct feat_fd *ff, void *addr, ssize_t size) 189 { 190 ssize_t ret = readn(ff->fd, addr, size); 191 192 if (ret != size) 193 return ret < 0 ? (int)ret : -1; 194 return 0; 195 } 196 197 static int __do_read_buf(struct feat_fd *ff, void *addr, ssize_t size) 198 { 199 if (size > (ssize_t)ff->size - ff->offset) 200 return -1; 201 202 memcpy(addr, ff->buf + ff->offset, size); 203 ff->offset += size; 204 205 return 0; 206 207 } 208 209 static int __do_read(struct feat_fd *ff, void *addr, ssize_t size) 210 { 211 if (!ff->buf) 212 return __do_read_fd(ff, addr, size); 213 return __do_read_buf(ff, addr, size); 214 } 215 216 static int do_read_u32(struct feat_fd *ff, u32 *addr) 217 { 218 int ret; 219 220 ret = __do_read(ff, addr, sizeof(*addr)); 221 if (ret) 222 return ret; 223 224 if (ff->ph->needs_swap) 225 *addr = bswap_32(*addr); 226 return 0; 227 } 228 229 static int do_read_u64(struct feat_fd *ff, u64 *addr) 230 { 231 int ret; 232 233 ret = __do_read(ff, addr, sizeof(*addr)); 234 if (ret) 235 return ret; 236 237 if (ff->ph->needs_swap) 238 *addr = bswap_64(*addr); 239 return 0; 240 } 241 242 static char *do_read_string(struct feat_fd *ff) 243 { 244 u32 len; 245 char *buf; 246 247 if (do_read_u32(ff, &len)) 248 return NULL; 249 250 buf = malloc(len); 251 if (!buf) 252 return NULL; 253 254 if (!__do_read(ff, buf, len)) { 255 /* 256 * strings are padded by zeroes 257 * thus the actual strlen of buf 258 * may be less than len 259 */ 260 return buf; 261 } 262 263 free(buf); 264 return NULL; 265 } 266 267 /* Return: 0 if succeded, -ERR if failed. */ 268 static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize) 269 { 270 unsigned long *set; 271 u64 size, *p; 272 int i, ret; 273 274 ret = do_read_u64(ff, &size); 275 if (ret) 276 return ret; 277 278 set = bitmap_alloc(size); 279 if (!set) 280 return -ENOMEM; 281 282 bitmap_zero(set, size); 283 284 p = (u64 *) set; 285 286 for (i = 0; (u64) i < BITS_TO_U64(size); i++) { 287 ret = do_read_u64(ff, p + i); 288 if (ret < 0) { 289 free(set); 290 return ret; 291 } 292 } 293 294 *pset = set; 295 *psize = size; 296 return 0; 297 } 298 299 static int write_tracing_data(struct feat_fd *ff, 300 struct perf_evlist *evlist) 301 { 302 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) 303 return -1; 304 305 return read_tracing_data(ff->fd, &evlist->entries); 306 } 307 308 static int write_build_id(struct feat_fd *ff, 309 struct perf_evlist *evlist __maybe_unused) 310 { 311 struct perf_session *session; 312 int err; 313 314 session = container_of(ff->ph, struct perf_session, header); 315 316 if (!perf_session__read_build_ids(session, true)) 317 return -1; 318 319 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) 320 return -1; 321 322 err = perf_session__write_buildid_table(session, ff); 323 if (err < 0) { 324 pr_debug("failed to write buildid table\n"); 325 return err; 326 } 327 perf_session__cache_build_ids(session); 328 329 return 0; 330 } 331 332 static int write_hostname(struct feat_fd *ff, 333 struct perf_evlist *evlist __maybe_unused) 334 { 335 struct utsname uts; 336 int ret; 337 338 ret = uname(&uts); 339 if (ret < 0) 340 return -1; 341 342 return do_write_string(ff, uts.nodename); 343 } 344 345 static int write_osrelease(struct feat_fd *ff, 346 struct perf_evlist *evlist __maybe_unused) 347 { 348 struct utsname uts; 349 int ret; 350 351 ret = uname(&uts); 352 if (ret < 0) 353 return -1; 354 355 return do_write_string(ff, uts.release); 356 } 357 358 static int write_arch(struct feat_fd *ff, 359 struct perf_evlist *evlist __maybe_unused) 360 { 361 struct utsname uts; 362 int ret; 363 364 ret = uname(&uts); 365 if (ret < 0) 366 return -1; 367 368 return do_write_string(ff, uts.machine); 369 } 370 371 static int write_version(struct feat_fd *ff, 372 struct perf_evlist *evlist __maybe_unused) 373 { 374 return do_write_string(ff, perf_version_string); 375 } 376 377 static int __write_cpudesc(struct feat_fd *ff, const char *cpuinfo_proc) 378 { 379 FILE *file; 380 char *buf = NULL; 381 char *s, *p; 382 const char *search = cpuinfo_proc; 383 size_t len = 0; 384 int ret = -1; 385 386 if (!search) 387 return -1; 388 389 file = fopen("/proc/cpuinfo", "r"); 390 if (!file) 391 return -1; 392 393 while (getline(&buf, &len, file) > 0) { 394 ret = strncmp(buf, search, strlen(search)); 395 if (!ret) 396 break; 397 } 398 399 if (ret) { 400 ret = -1; 401 goto done; 402 } 403 404 s = buf; 405 406 p = strchr(buf, ':'); 407 if (p && *(p+1) == ' ' && *(p+2)) 408 s = p + 2; 409 p = strchr(s, '\n'); 410 if (p) 411 *p = '\0'; 412 413 /* squash extra space characters (branding string) */ 414 p = s; 415 while (*p) { 416 if (isspace(*p)) { 417 char *r = p + 1; 418 char *q = r; 419 *p = ' '; 420 while (*q && isspace(*q)) 421 q++; 422 if (q != (p+1)) 423 while ((*r++ = *q++)); 424 } 425 p++; 426 } 427 ret = do_write_string(ff, s); 428 done: 429 free(buf); 430 fclose(file); 431 return ret; 432 } 433 434 static int write_cpudesc(struct feat_fd *ff, 435 struct perf_evlist *evlist __maybe_unused) 436 { 437 const char *cpuinfo_procs[] = CPUINFO_PROC; 438 unsigned int i; 439 440 for (i = 0; i < ARRAY_SIZE(cpuinfo_procs); i++) { 441 int ret; 442 ret = __write_cpudesc(ff, cpuinfo_procs[i]); 443 if (ret >= 0) 444 return ret; 445 } 446 return -1; 447 } 448 449 450 static int write_nrcpus(struct feat_fd *ff, 451 struct perf_evlist *evlist __maybe_unused) 452 { 453 long nr; 454 u32 nrc, nra; 455 int ret; 456 457 nrc = cpu__max_present_cpu(); 458 459 nr = sysconf(_SC_NPROCESSORS_ONLN); 460 if (nr < 0) 461 return -1; 462 463 nra = (u32)(nr & UINT_MAX); 464 465 ret = do_write(ff, &nrc, sizeof(nrc)); 466 if (ret < 0) 467 return ret; 468 469 return do_write(ff, &nra, sizeof(nra)); 470 } 471 472 static int write_event_desc(struct feat_fd *ff, 473 struct perf_evlist *evlist) 474 { 475 struct perf_evsel *evsel; 476 u32 nre, nri, sz; 477 int ret; 478 479 nre = evlist->nr_entries; 480 481 /* 482 * write number of events 483 */ 484 ret = do_write(ff, &nre, sizeof(nre)); 485 if (ret < 0) 486 return ret; 487 488 /* 489 * size of perf_event_attr struct 490 */ 491 sz = (u32)sizeof(evsel->attr); 492 ret = do_write(ff, &sz, sizeof(sz)); 493 if (ret < 0) 494 return ret; 495 496 evlist__for_each_entry(evlist, evsel) { 497 ret = do_write(ff, &evsel->attr, sz); 498 if (ret < 0) 499 return ret; 500 /* 501 * write number of unique id per event 502 * there is one id per instance of an event 503 * 504 * copy into an nri to be independent of the 505 * type of ids, 506 */ 507 nri = evsel->ids; 508 ret = do_write(ff, &nri, sizeof(nri)); 509 if (ret < 0) 510 return ret; 511 512 /* 513 * write event string as passed on cmdline 514 */ 515 ret = do_write_string(ff, perf_evsel__name(evsel)); 516 if (ret < 0) 517 return ret; 518 /* 519 * write unique ids for this event 520 */ 521 ret = do_write(ff, evsel->id, evsel->ids * sizeof(u64)); 522 if (ret < 0) 523 return ret; 524 } 525 return 0; 526 } 527 528 static int write_cmdline(struct feat_fd *ff, 529 struct perf_evlist *evlist __maybe_unused) 530 { 531 char buf[MAXPATHLEN]; 532 u32 n; 533 int i, ret; 534 535 /* actual path to perf binary */ 536 ret = readlink("/proc/self/exe", buf, sizeof(buf) - 1); 537 if (ret <= 0) 538 return -1; 539 540 /* readlink() does not add null termination */ 541 buf[ret] = '\0'; 542 543 /* account for binary path */ 544 n = perf_env.nr_cmdline + 1; 545 546 ret = do_write(ff, &n, sizeof(n)); 547 if (ret < 0) 548 return ret; 549 550 ret = do_write_string(ff, buf); 551 if (ret < 0) 552 return ret; 553 554 for (i = 0 ; i < perf_env.nr_cmdline; i++) { 555 ret = do_write_string(ff, perf_env.cmdline_argv[i]); 556 if (ret < 0) 557 return ret; 558 } 559 return 0; 560 } 561 562 #define CORE_SIB_FMT \ 563 "/sys/devices/system/cpu/cpu%d/topology/core_siblings_list" 564 #define THRD_SIB_FMT \ 565 "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list" 566 567 struct cpu_topo { 568 u32 cpu_nr; 569 u32 core_sib; 570 u32 thread_sib; 571 char **core_siblings; 572 char **thread_siblings; 573 }; 574 575 static int build_cpu_topo(struct cpu_topo *tp, int cpu) 576 { 577 FILE *fp; 578 char filename[MAXPATHLEN]; 579 char *buf = NULL, *p; 580 size_t len = 0; 581 ssize_t sret; 582 u32 i = 0; 583 int ret = -1; 584 585 sprintf(filename, CORE_SIB_FMT, cpu); 586 fp = fopen(filename, "r"); 587 if (!fp) 588 goto try_threads; 589 590 sret = getline(&buf, &len, fp); 591 fclose(fp); 592 if (sret <= 0) 593 goto try_threads; 594 595 p = strchr(buf, '\n'); 596 if (p) 597 *p = '\0'; 598 599 for (i = 0; i < tp->core_sib; i++) { 600 if (!strcmp(buf, tp->core_siblings[i])) 601 break; 602 } 603 if (i == tp->core_sib) { 604 tp->core_siblings[i] = buf; 605 tp->core_sib++; 606 buf = NULL; 607 len = 0; 608 } 609 ret = 0; 610 611 try_threads: 612 sprintf(filename, THRD_SIB_FMT, cpu); 613 fp = fopen(filename, "r"); 614 if (!fp) 615 goto done; 616 617 if (getline(&buf, &len, fp) <= 0) 618 goto done; 619 620 p = strchr(buf, '\n'); 621 if (p) 622 *p = '\0'; 623 624 for (i = 0; i < tp->thread_sib; i++) { 625 if (!strcmp(buf, tp->thread_siblings[i])) 626 break; 627 } 628 if (i == tp->thread_sib) { 629 tp->thread_siblings[i] = buf; 630 tp->thread_sib++; 631 buf = NULL; 632 } 633 ret = 0; 634 done: 635 if(fp) 636 fclose(fp); 637 free(buf); 638 return ret; 639 } 640 641 static void free_cpu_topo(struct cpu_topo *tp) 642 { 643 u32 i; 644 645 if (!tp) 646 return; 647 648 for (i = 0 ; i < tp->core_sib; i++) 649 zfree(&tp->core_siblings[i]); 650 651 for (i = 0 ; i < tp->thread_sib; i++) 652 zfree(&tp->thread_siblings[i]); 653 654 free(tp); 655 } 656 657 static struct cpu_topo *build_cpu_topology(void) 658 { 659 struct cpu_topo *tp = NULL; 660 void *addr; 661 u32 nr, i; 662 size_t sz; 663 long ncpus; 664 int ret = -1; 665 struct cpu_map *map; 666 667 ncpus = cpu__max_present_cpu(); 668 669 /* build online CPU map */ 670 map = cpu_map__new(NULL); 671 if (map == NULL) { 672 pr_debug("failed to get system cpumap\n"); 673 return NULL; 674 } 675 676 nr = (u32)(ncpus & UINT_MAX); 677 678 sz = nr * sizeof(char *); 679 addr = calloc(1, sizeof(*tp) + 2 * sz); 680 if (!addr) 681 goto out_free; 682 683 tp = addr; 684 tp->cpu_nr = nr; 685 addr += sizeof(*tp); 686 tp->core_siblings = addr; 687 addr += sz; 688 tp->thread_siblings = addr; 689 690 for (i = 0; i < nr; i++) { 691 if (!cpu_map__has(map, i)) 692 continue; 693 694 ret = build_cpu_topo(tp, i); 695 if (ret < 0) 696 break; 697 } 698 699 out_free: 700 cpu_map__put(map); 701 if (ret) { 702 free_cpu_topo(tp); 703 tp = NULL; 704 } 705 return tp; 706 } 707 708 static int write_cpu_topology(struct feat_fd *ff, 709 struct perf_evlist *evlist __maybe_unused) 710 { 711 struct cpu_topo *tp; 712 u32 i; 713 int ret, j; 714 715 tp = build_cpu_topology(); 716 if (!tp) 717 return -1; 718 719 ret = do_write(ff, &tp->core_sib, sizeof(tp->core_sib)); 720 if (ret < 0) 721 goto done; 722 723 for (i = 0; i < tp->core_sib; i++) { 724 ret = do_write_string(ff, tp->core_siblings[i]); 725 if (ret < 0) 726 goto done; 727 } 728 ret = do_write(ff, &tp->thread_sib, sizeof(tp->thread_sib)); 729 if (ret < 0) 730 goto done; 731 732 for (i = 0; i < tp->thread_sib; i++) { 733 ret = do_write_string(ff, tp->thread_siblings[i]); 734 if (ret < 0) 735 break; 736 } 737 738 ret = perf_env__read_cpu_topology_map(&perf_env); 739 if (ret < 0) 740 goto done; 741 742 for (j = 0; j < perf_env.nr_cpus_avail; j++) { 743 ret = do_write(ff, &perf_env.cpu[j].core_id, 744 sizeof(perf_env.cpu[j].core_id)); 745 if (ret < 0) 746 return ret; 747 ret = do_write(ff, &perf_env.cpu[j].socket_id, 748 sizeof(perf_env.cpu[j].socket_id)); 749 if (ret < 0) 750 return ret; 751 } 752 done: 753 free_cpu_topo(tp); 754 return ret; 755 } 756 757 758 759 static int write_total_mem(struct feat_fd *ff, 760 struct perf_evlist *evlist __maybe_unused) 761 { 762 char *buf = NULL; 763 FILE *fp; 764 size_t len = 0; 765 int ret = -1, n; 766 uint64_t mem; 767 768 fp = fopen("/proc/meminfo", "r"); 769 if (!fp) 770 return -1; 771 772 while (getline(&buf, &len, fp) > 0) { 773 ret = strncmp(buf, "MemTotal:", 9); 774 if (!ret) 775 break; 776 } 777 if (!ret) { 778 n = sscanf(buf, "%*s %"PRIu64, &mem); 779 if (n == 1) 780 ret = do_write(ff, &mem, sizeof(mem)); 781 } else 782 ret = -1; 783 free(buf); 784 fclose(fp); 785 return ret; 786 } 787 788 static int write_topo_node(struct feat_fd *ff, int node) 789 { 790 char str[MAXPATHLEN]; 791 char field[32]; 792 char *buf = NULL, *p; 793 size_t len = 0; 794 FILE *fp; 795 u64 mem_total, mem_free, mem; 796 int ret = -1; 797 798 sprintf(str, "/sys/devices/system/node/node%d/meminfo", node); 799 fp = fopen(str, "r"); 800 if (!fp) 801 return -1; 802 803 while (getline(&buf, &len, fp) > 0) { 804 /* skip over invalid lines */ 805 if (!strchr(buf, ':')) 806 continue; 807 if (sscanf(buf, "%*s %*d %31s %"PRIu64, field, &mem) != 2) 808 goto done; 809 if (!strcmp(field, "MemTotal:")) 810 mem_total = mem; 811 if (!strcmp(field, "MemFree:")) 812 mem_free = mem; 813 } 814 815 fclose(fp); 816 fp = NULL; 817 818 ret = do_write(ff, &mem_total, sizeof(u64)); 819 if (ret) 820 goto done; 821 822 ret = do_write(ff, &mem_free, sizeof(u64)); 823 if (ret) 824 goto done; 825 826 ret = -1; 827 sprintf(str, "/sys/devices/system/node/node%d/cpulist", node); 828 829 fp = fopen(str, "r"); 830 if (!fp) 831 goto done; 832 833 if (getline(&buf, &len, fp) <= 0) 834 goto done; 835 836 p = strchr(buf, '\n'); 837 if (p) 838 *p = '\0'; 839 840 ret = do_write_string(ff, buf); 841 done: 842 free(buf); 843 if (fp) 844 fclose(fp); 845 return ret; 846 } 847 848 static int write_numa_topology(struct feat_fd *ff, 849 struct perf_evlist *evlist __maybe_unused) 850 { 851 char *buf = NULL; 852 size_t len = 0; 853 FILE *fp; 854 struct cpu_map *node_map = NULL; 855 char *c; 856 u32 nr, i, j; 857 int ret = -1; 858 859 fp = fopen("/sys/devices/system/node/online", "r"); 860 if (!fp) 861 return -1; 862 863 if (getline(&buf, &len, fp) <= 0) 864 goto done; 865 866 c = strchr(buf, '\n'); 867 if (c) 868 *c = '\0'; 869 870 node_map = cpu_map__new(buf); 871 if (!node_map) 872 goto done; 873 874 nr = (u32)node_map->nr; 875 876 ret = do_write(ff, &nr, sizeof(nr)); 877 if (ret < 0) 878 goto done; 879 880 for (i = 0; i < nr; i++) { 881 j = (u32)node_map->map[i]; 882 ret = do_write(ff, &j, sizeof(j)); 883 if (ret < 0) 884 break; 885 886 ret = write_topo_node(ff, i); 887 if (ret < 0) 888 break; 889 } 890 done: 891 free(buf); 892 fclose(fp); 893 cpu_map__put(node_map); 894 return ret; 895 } 896 897 /* 898 * File format: 899 * 900 * struct pmu_mappings { 901 * u32 pmu_num; 902 * struct pmu_map { 903 * u32 type; 904 * char name[]; 905 * }[pmu_num]; 906 * }; 907 */ 908 909 static int write_pmu_mappings(struct feat_fd *ff, 910 struct perf_evlist *evlist __maybe_unused) 911 { 912 struct perf_pmu *pmu = NULL; 913 u32 pmu_num = 0; 914 int ret; 915 916 /* 917 * Do a first pass to count number of pmu to avoid lseek so this 918 * works in pipe mode as well. 919 */ 920 while ((pmu = perf_pmu__scan(pmu))) { 921 if (!pmu->name) 922 continue; 923 pmu_num++; 924 } 925 926 ret = do_write(ff, &pmu_num, sizeof(pmu_num)); 927 if (ret < 0) 928 return ret; 929 930 while ((pmu = perf_pmu__scan(pmu))) { 931 if (!pmu->name) 932 continue; 933 934 ret = do_write(ff, &pmu->type, sizeof(pmu->type)); 935 if (ret < 0) 936 return ret; 937 938 ret = do_write_string(ff, pmu->name); 939 if (ret < 0) 940 return ret; 941 } 942 943 return 0; 944 } 945 946 /* 947 * File format: 948 * 949 * struct group_descs { 950 * u32 nr_groups; 951 * struct group_desc { 952 * char name[]; 953 * u32 leader_idx; 954 * u32 nr_members; 955 * }[nr_groups]; 956 * }; 957 */ 958 static int write_group_desc(struct feat_fd *ff, 959 struct perf_evlist *evlist) 960 { 961 u32 nr_groups = evlist->nr_groups; 962 struct perf_evsel *evsel; 963 int ret; 964 965 ret = do_write(ff, &nr_groups, sizeof(nr_groups)); 966 if (ret < 0) 967 return ret; 968 969 evlist__for_each_entry(evlist, evsel) { 970 if (perf_evsel__is_group_leader(evsel) && 971 evsel->nr_members > 1) { 972 const char *name = evsel->group_name ?: "{anon_group}"; 973 u32 leader_idx = evsel->idx; 974 u32 nr_members = evsel->nr_members; 975 976 ret = do_write_string(ff, name); 977 if (ret < 0) 978 return ret; 979 980 ret = do_write(ff, &leader_idx, sizeof(leader_idx)); 981 if (ret < 0) 982 return ret; 983 984 ret = do_write(ff, &nr_members, sizeof(nr_members)); 985 if (ret < 0) 986 return ret; 987 } 988 } 989 return 0; 990 } 991 992 /* 993 * default get_cpuid(): nothing gets recorded 994 * actual implementation must be in arch/$(SRCARCH)/util/header.c 995 */ 996 int __weak get_cpuid(char *buffer __maybe_unused, size_t sz __maybe_unused) 997 { 998 return -1; 999 } 1000 1001 static int write_cpuid(struct feat_fd *ff, 1002 struct perf_evlist *evlist __maybe_unused) 1003 { 1004 char buffer[64]; 1005 int ret; 1006 1007 ret = get_cpuid(buffer, sizeof(buffer)); 1008 if (!ret) 1009 goto write_it; 1010 1011 return -1; 1012 write_it: 1013 return do_write_string(ff, buffer); 1014 } 1015 1016 static int write_branch_stack(struct feat_fd *ff __maybe_unused, 1017 struct perf_evlist *evlist __maybe_unused) 1018 { 1019 return 0; 1020 } 1021 1022 static int write_auxtrace(struct feat_fd *ff, 1023 struct perf_evlist *evlist __maybe_unused) 1024 { 1025 struct perf_session *session; 1026 int err; 1027 1028 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) 1029 return -1; 1030 1031 session = container_of(ff->ph, struct perf_session, header); 1032 1033 err = auxtrace_index__write(ff->fd, &session->auxtrace_index); 1034 if (err < 0) 1035 pr_err("Failed to write auxtrace index\n"); 1036 return err; 1037 } 1038 1039 static int cpu_cache_level__sort(const void *a, const void *b) 1040 { 1041 struct cpu_cache_level *cache_a = (struct cpu_cache_level *)a; 1042 struct cpu_cache_level *cache_b = (struct cpu_cache_level *)b; 1043 1044 return cache_a->level - cache_b->level; 1045 } 1046 1047 static bool cpu_cache_level__cmp(struct cpu_cache_level *a, struct cpu_cache_level *b) 1048 { 1049 if (a->level != b->level) 1050 return false; 1051 1052 if (a->line_size != b->line_size) 1053 return false; 1054 1055 if (a->sets != b->sets) 1056 return false; 1057 1058 if (a->ways != b->ways) 1059 return false; 1060 1061 if (strcmp(a->type, b->type)) 1062 return false; 1063 1064 if (strcmp(a->size, b->size)) 1065 return false; 1066 1067 if (strcmp(a->map, b->map)) 1068 return false; 1069 1070 return true; 1071 } 1072 1073 static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 level) 1074 { 1075 char path[PATH_MAX], file[PATH_MAX]; 1076 struct stat st; 1077 size_t len; 1078 1079 scnprintf(path, PATH_MAX, "devices/system/cpu/cpu%d/cache/index%d/", cpu, level); 1080 scnprintf(file, PATH_MAX, "%s/%s", sysfs__mountpoint(), path); 1081 1082 if (stat(file, &st)) 1083 return 1; 1084 1085 scnprintf(file, PATH_MAX, "%s/level", path); 1086 if (sysfs__read_int(file, (int *) &cache->level)) 1087 return -1; 1088 1089 scnprintf(file, PATH_MAX, "%s/coherency_line_size", path); 1090 if (sysfs__read_int(file, (int *) &cache->line_size)) 1091 return -1; 1092 1093 scnprintf(file, PATH_MAX, "%s/number_of_sets", path); 1094 if (sysfs__read_int(file, (int *) &cache->sets)) 1095 return -1; 1096 1097 scnprintf(file, PATH_MAX, "%s/ways_of_associativity", path); 1098 if (sysfs__read_int(file, (int *) &cache->ways)) 1099 return -1; 1100 1101 scnprintf(file, PATH_MAX, "%s/type", path); 1102 if (sysfs__read_str(file, &cache->type, &len)) 1103 return -1; 1104 1105 cache->type[len] = 0; 1106 cache->type = rtrim(cache->type); 1107 1108 scnprintf(file, PATH_MAX, "%s/size", path); 1109 if (sysfs__read_str(file, &cache->size, &len)) { 1110 free(cache->type); 1111 return -1; 1112 } 1113 1114 cache->size[len] = 0; 1115 cache->size = rtrim(cache->size); 1116 1117 scnprintf(file, PATH_MAX, "%s/shared_cpu_list", path); 1118 if (sysfs__read_str(file, &cache->map, &len)) { 1119 free(cache->map); 1120 free(cache->type); 1121 return -1; 1122 } 1123 1124 cache->map[len] = 0; 1125 cache->map = rtrim(cache->map); 1126 return 0; 1127 } 1128 1129 static void cpu_cache_level__fprintf(FILE *out, struct cpu_cache_level *c) 1130 { 1131 fprintf(out, "L%d %-15s %8s [%s]\n", c->level, c->type, c->size, c->map); 1132 } 1133 1134 static int build_caches(struct cpu_cache_level caches[], u32 size, u32 *cntp) 1135 { 1136 u32 i, cnt = 0; 1137 long ncpus; 1138 u32 nr, cpu; 1139 u16 level; 1140 1141 ncpus = sysconf(_SC_NPROCESSORS_CONF); 1142 if (ncpus < 0) 1143 return -1; 1144 1145 nr = (u32)(ncpus & UINT_MAX); 1146 1147 for (cpu = 0; cpu < nr; cpu++) { 1148 for (level = 0; level < 10; level++) { 1149 struct cpu_cache_level c; 1150 int err; 1151 1152 err = cpu_cache_level__read(&c, cpu, level); 1153 if (err < 0) 1154 return err; 1155 1156 if (err == 1) 1157 break; 1158 1159 for (i = 0; i < cnt; i++) { 1160 if (cpu_cache_level__cmp(&c, &caches[i])) 1161 break; 1162 } 1163 1164 if (i == cnt) 1165 caches[cnt++] = c; 1166 else 1167 cpu_cache_level__free(&c); 1168 1169 if (WARN_ONCE(cnt == size, "way too many cpu caches..")) 1170 goto out; 1171 } 1172 } 1173 out: 1174 *cntp = cnt; 1175 return 0; 1176 } 1177 1178 #define MAX_CACHES 2000 1179 1180 static int write_cache(struct feat_fd *ff, 1181 struct perf_evlist *evlist __maybe_unused) 1182 { 1183 struct cpu_cache_level caches[MAX_CACHES]; 1184 u32 cnt = 0, i, version = 1; 1185 int ret; 1186 1187 ret = build_caches(caches, MAX_CACHES, &cnt); 1188 if (ret) 1189 goto out; 1190 1191 qsort(&caches, cnt, sizeof(struct cpu_cache_level), cpu_cache_level__sort); 1192 1193 ret = do_write(ff, &version, sizeof(u32)); 1194 if (ret < 0) 1195 goto out; 1196 1197 ret = do_write(ff, &cnt, sizeof(u32)); 1198 if (ret < 0) 1199 goto out; 1200 1201 for (i = 0; i < cnt; i++) { 1202 struct cpu_cache_level *c = &caches[i]; 1203 1204 #define _W(v) \ 1205 ret = do_write(ff, &c->v, sizeof(u32)); \ 1206 if (ret < 0) \ 1207 goto out; 1208 1209 _W(level) 1210 _W(line_size) 1211 _W(sets) 1212 _W(ways) 1213 #undef _W 1214 1215 #define _W(v) \ 1216 ret = do_write_string(ff, (const char *) c->v); \ 1217 if (ret < 0) \ 1218 goto out; 1219 1220 _W(type) 1221 _W(size) 1222 _W(map) 1223 #undef _W 1224 } 1225 1226 out: 1227 for (i = 0; i < cnt; i++) 1228 cpu_cache_level__free(&caches[i]); 1229 return ret; 1230 } 1231 1232 static int write_stat(struct feat_fd *ff __maybe_unused, 1233 struct perf_evlist *evlist __maybe_unused) 1234 { 1235 return 0; 1236 } 1237 1238 static int write_sample_time(struct feat_fd *ff, 1239 struct perf_evlist *evlist) 1240 { 1241 int ret; 1242 1243 ret = do_write(ff, &evlist->first_sample_time, 1244 sizeof(evlist->first_sample_time)); 1245 if (ret < 0) 1246 return ret; 1247 1248 return do_write(ff, &evlist->last_sample_time, 1249 sizeof(evlist->last_sample_time)); 1250 } 1251 1252 1253 static int memory_node__read(struct memory_node *n, unsigned long idx) 1254 { 1255 unsigned int phys, size = 0; 1256 char path[PATH_MAX]; 1257 struct dirent *ent; 1258 DIR *dir; 1259 1260 #define for_each_memory(mem, dir) \ 1261 while ((ent = readdir(dir))) \ 1262 if (strcmp(ent->d_name, ".") && \ 1263 strcmp(ent->d_name, "..") && \ 1264 sscanf(ent->d_name, "memory%u", &mem) == 1) 1265 1266 scnprintf(path, PATH_MAX, 1267 "%s/devices/system/node/node%lu", 1268 sysfs__mountpoint(), idx); 1269 1270 dir = opendir(path); 1271 if (!dir) { 1272 pr_warning("failed: cant' open memory sysfs data\n"); 1273 return -1; 1274 } 1275 1276 for_each_memory(phys, dir) { 1277 size = max(phys, size); 1278 } 1279 1280 size++; 1281 1282 n->set = bitmap_alloc(size); 1283 if (!n->set) { 1284 closedir(dir); 1285 return -ENOMEM; 1286 } 1287 1288 bitmap_zero(n->set, size); 1289 n->node = idx; 1290 n->size = size; 1291 1292 rewinddir(dir); 1293 1294 for_each_memory(phys, dir) { 1295 set_bit(phys, n->set); 1296 } 1297 1298 closedir(dir); 1299 return 0; 1300 } 1301 1302 static int memory_node__sort(const void *a, const void *b) 1303 { 1304 const struct memory_node *na = a; 1305 const struct memory_node *nb = b; 1306 1307 return na->node - nb->node; 1308 } 1309 1310 static int build_mem_topology(struct memory_node *nodes, u64 size, u64 *cntp) 1311 { 1312 char path[PATH_MAX]; 1313 struct dirent *ent; 1314 DIR *dir; 1315 u64 cnt = 0; 1316 int ret = 0; 1317 1318 scnprintf(path, PATH_MAX, "%s/devices/system/node/", 1319 sysfs__mountpoint()); 1320 1321 dir = opendir(path); 1322 if (!dir) { 1323 pr_debug2("%s: could't read %s, does this arch have topology information?\n", 1324 __func__, path); 1325 return -1; 1326 } 1327 1328 while (!ret && (ent = readdir(dir))) { 1329 unsigned int idx; 1330 int r; 1331 1332 if (!strcmp(ent->d_name, ".") || 1333 !strcmp(ent->d_name, "..")) 1334 continue; 1335 1336 r = sscanf(ent->d_name, "node%u", &idx); 1337 if (r != 1) 1338 continue; 1339 1340 if (WARN_ONCE(cnt >= size, 1341 "failed to write MEM_TOPOLOGY, way too many nodes\n")) 1342 return -1; 1343 1344 ret = memory_node__read(&nodes[cnt++], idx); 1345 } 1346 1347 *cntp = cnt; 1348 closedir(dir); 1349 1350 if (!ret) 1351 qsort(nodes, cnt, sizeof(nodes[0]), memory_node__sort); 1352 1353 return ret; 1354 } 1355 1356 #define MAX_MEMORY_NODES 2000 1357 1358 /* 1359 * The MEM_TOPOLOGY holds physical memory map for every 1360 * node in system. The format of data is as follows: 1361 * 1362 * 0 - version | for future changes 1363 * 8 - block_size_bytes | /sys/devices/system/memory/block_size_bytes 1364 * 16 - count | number of nodes 1365 * 1366 * For each node we store map of physical indexes for 1367 * each node: 1368 * 1369 * 32 - node id | node index 1370 * 40 - size | size of bitmap 1371 * 48 - bitmap | bitmap of memory indexes that belongs to node 1372 */ 1373 static int write_mem_topology(struct feat_fd *ff __maybe_unused, 1374 struct perf_evlist *evlist __maybe_unused) 1375 { 1376 static struct memory_node nodes[MAX_MEMORY_NODES]; 1377 u64 bsize, version = 1, i, nr; 1378 int ret; 1379 1380 ret = sysfs__read_xll("devices/system/memory/block_size_bytes", 1381 (unsigned long long *) &bsize); 1382 if (ret) 1383 return ret; 1384 1385 ret = build_mem_topology(&nodes[0], MAX_MEMORY_NODES, &nr); 1386 if (ret) 1387 return ret; 1388 1389 ret = do_write(ff, &version, sizeof(version)); 1390 if (ret < 0) 1391 goto out; 1392 1393 ret = do_write(ff, &bsize, sizeof(bsize)); 1394 if (ret < 0) 1395 goto out; 1396 1397 ret = do_write(ff, &nr, sizeof(nr)); 1398 if (ret < 0) 1399 goto out; 1400 1401 for (i = 0; i < nr; i++) { 1402 struct memory_node *n = &nodes[i]; 1403 1404 #define _W(v) \ 1405 ret = do_write(ff, &n->v, sizeof(n->v)); \ 1406 if (ret < 0) \ 1407 goto out; 1408 1409 _W(node) 1410 _W(size) 1411 1412 #undef _W 1413 1414 ret = do_write_bitmap(ff, n->set, n->size); 1415 if (ret < 0) 1416 goto out; 1417 } 1418 1419 out: 1420 return ret; 1421 } 1422 1423 static void print_hostname(struct feat_fd *ff, FILE *fp) 1424 { 1425 fprintf(fp, "# hostname : %s\n", ff->ph->env.hostname); 1426 } 1427 1428 static void print_osrelease(struct feat_fd *ff, FILE *fp) 1429 { 1430 fprintf(fp, "# os release : %s\n", ff->ph->env.os_release); 1431 } 1432 1433 static void print_arch(struct feat_fd *ff, FILE *fp) 1434 { 1435 fprintf(fp, "# arch : %s\n", ff->ph->env.arch); 1436 } 1437 1438 static void print_cpudesc(struct feat_fd *ff, FILE *fp) 1439 { 1440 fprintf(fp, "# cpudesc : %s\n", ff->ph->env.cpu_desc); 1441 } 1442 1443 static void print_nrcpus(struct feat_fd *ff, FILE *fp) 1444 { 1445 fprintf(fp, "# nrcpus online : %u\n", ff->ph->env.nr_cpus_online); 1446 fprintf(fp, "# nrcpus avail : %u\n", ff->ph->env.nr_cpus_avail); 1447 } 1448 1449 static void print_version(struct feat_fd *ff, FILE *fp) 1450 { 1451 fprintf(fp, "# perf version : %s\n", ff->ph->env.version); 1452 } 1453 1454 static void print_cmdline(struct feat_fd *ff, FILE *fp) 1455 { 1456 int nr, i; 1457 1458 nr = ff->ph->env.nr_cmdline; 1459 1460 fprintf(fp, "# cmdline : "); 1461 1462 for (i = 0; i < nr; i++) { 1463 char *argv_i = strdup(ff->ph->env.cmdline_argv[i]); 1464 if (!argv_i) { 1465 fprintf(fp, "%s ", ff->ph->env.cmdline_argv[i]); 1466 } else { 1467 char *mem = argv_i; 1468 do { 1469 char *quote = strchr(argv_i, '\''); 1470 if (!quote) 1471 break; 1472 *quote++ = '\0'; 1473 fprintf(fp, "%s\\\'", argv_i); 1474 argv_i = quote; 1475 } while (1); 1476 fprintf(fp, "%s ", argv_i); 1477 free(mem); 1478 } 1479 } 1480 fputc('\n', fp); 1481 } 1482 1483 static void print_cpu_topology(struct feat_fd *ff, FILE *fp) 1484 { 1485 struct perf_header *ph = ff->ph; 1486 int cpu_nr = ph->env.nr_cpus_avail; 1487 int nr, i; 1488 char *str; 1489 1490 nr = ph->env.nr_sibling_cores; 1491 str = ph->env.sibling_cores; 1492 1493 for (i = 0; i < nr; i++) { 1494 fprintf(fp, "# sibling cores : %s\n", str); 1495 str += strlen(str) + 1; 1496 } 1497 1498 nr = ph->env.nr_sibling_threads; 1499 str = ph->env.sibling_threads; 1500 1501 for (i = 0; i < nr; i++) { 1502 fprintf(fp, "# sibling threads : %s\n", str); 1503 str += strlen(str) + 1; 1504 } 1505 1506 if (ph->env.cpu != NULL) { 1507 for (i = 0; i < cpu_nr; i++) 1508 fprintf(fp, "# CPU %d: Core ID %d, Socket ID %d\n", i, 1509 ph->env.cpu[i].core_id, ph->env.cpu[i].socket_id); 1510 } else 1511 fprintf(fp, "# Core ID and Socket ID information is not available\n"); 1512 } 1513 1514 static void free_event_desc(struct perf_evsel *events) 1515 { 1516 struct perf_evsel *evsel; 1517 1518 if (!events) 1519 return; 1520 1521 for (evsel = events; evsel->attr.size; evsel++) { 1522 zfree(&evsel->name); 1523 zfree(&evsel->id); 1524 } 1525 1526 free(events); 1527 } 1528 1529 static struct perf_evsel *read_event_desc(struct feat_fd *ff) 1530 { 1531 struct perf_evsel *evsel, *events = NULL; 1532 u64 *id; 1533 void *buf = NULL; 1534 u32 nre, sz, nr, i, j; 1535 size_t msz; 1536 1537 /* number of events */ 1538 if (do_read_u32(ff, &nre)) 1539 goto error; 1540 1541 if (do_read_u32(ff, &sz)) 1542 goto error; 1543 1544 /* buffer to hold on file attr struct */ 1545 buf = malloc(sz); 1546 if (!buf) 1547 goto error; 1548 1549 /* the last event terminates with evsel->attr.size == 0: */ 1550 events = calloc(nre + 1, sizeof(*events)); 1551 if (!events) 1552 goto error; 1553 1554 msz = sizeof(evsel->attr); 1555 if (sz < msz) 1556 msz = sz; 1557 1558 for (i = 0, evsel = events; i < nre; evsel++, i++) { 1559 evsel->idx = i; 1560 1561 /* 1562 * must read entire on-file attr struct to 1563 * sync up with layout. 1564 */ 1565 if (__do_read(ff, buf, sz)) 1566 goto error; 1567 1568 if (ff->ph->needs_swap) 1569 perf_event__attr_swap(buf); 1570 1571 memcpy(&evsel->attr, buf, msz); 1572 1573 if (do_read_u32(ff, &nr)) 1574 goto error; 1575 1576 if (ff->ph->needs_swap) 1577 evsel->needs_swap = true; 1578 1579 evsel->name = do_read_string(ff); 1580 if (!evsel->name) 1581 goto error; 1582 1583 if (!nr) 1584 continue; 1585 1586 id = calloc(nr, sizeof(*id)); 1587 if (!id) 1588 goto error; 1589 evsel->ids = nr; 1590 evsel->id = id; 1591 1592 for (j = 0 ; j < nr; j++) { 1593 if (do_read_u64(ff, id)) 1594 goto error; 1595 id++; 1596 } 1597 } 1598 out: 1599 free(buf); 1600 return events; 1601 error: 1602 free_event_desc(events); 1603 events = NULL; 1604 goto out; 1605 } 1606 1607 static int __desc_attr__fprintf(FILE *fp, const char *name, const char *val, 1608 void *priv __maybe_unused) 1609 { 1610 return fprintf(fp, ", %s = %s", name, val); 1611 } 1612 1613 static void print_event_desc(struct feat_fd *ff, FILE *fp) 1614 { 1615 struct perf_evsel *evsel, *events; 1616 u32 j; 1617 u64 *id; 1618 1619 if (ff->events) 1620 events = ff->events; 1621 else 1622 events = read_event_desc(ff); 1623 1624 if (!events) { 1625 fprintf(fp, "# event desc: not available or unable to read\n"); 1626 return; 1627 } 1628 1629 for (evsel = events; evsel->attr.size; evsel++) { 1630 fprintf(fp, "# event : name = %s, ", evsel->name); 1631 1632 if (evsel->ids) { 1633 fprintf(fp, ", id = {"); 1634 for (j = 0, id = evsel->id; j < evsel->ids; j++, id++) { 1635 if (j) 1636 fputc(',', fp); 1637 fprintf(fp, " %"PRIu64, *id); 1638 } 1639 fprintf(fp, " }"); 1640 } 1641 1642 perf_event_attr__fprintf(fp, &evsel->attr, __desc_attr__fprintf, NULL); 1643 1644 fputc('\n', fp); 1645 } 1646 1647 free_event_desc(events); 1648 ff->events = NULL; 1649 } 1650 1651 static void print_total_mem(struct feat_fd *ff, FILE *fp) 1652 { 1653 fprintf(fp, "# total memory : %llu kB\n", ff->ph->env.total_mem); 1654 } 1655 1656 static void print_numa_topology(struct feat_fd *ff, FILE *fp) 1657 { 1658 int i; 1659 struct numa_node *n; 1660 1661 for (i = 0; i < ff->ph->env.nr_numa_nodes; i++) { 1662 n = &ff->ph->env.numa_nodes[i]; 1663 1664 fprintf(fp, "# node%u meminfo : total = %"PRIu64" kB," 1665 " free = %"PRIu64" kB\n", 1666 n->node, n->mem_total, n->mem_free); 1667 1668 fprintf(fp, "# node%u cpu list : ", n->node); 1669 cpu_map__fprintf(n->map, fp); 1670 } 1671 } 1672 1673 static void print_cpuid(struct feat_fd *ff, FILE *fp) 1674 { 1675 fprintf(fp, "# cpuid : %s\n", ff->ph->env.cpuid); 1676 } 1677 1678 static void print_branch_stack(struct feat_fd *ff __maybe_unused, FILE *fp) 1679 { 1680 fprintf(fp, "# contains samples with branch stack\n"); 1681 } 1682 1683 static void print_auxtrace(struct feat_fd *ff __maybe_unused, FILE *fp) 1684 { 1685 fprintf(fp, "# contains AUX area data (e.g. instruction trace)\n"); 1686 } 1687 1688 static void print_stat(struct feat_fd *ff __maybe_unused, FILE *fp) 1689 { 1690 fprintf(fp, "# contains stat data\n"); 1691 } 1692 1693 static void print_cache(struct feat_fd *ff, FILE *fp __maybe_unused) 1694 { 1695 int i; 1696 1697 fprintf(fp, "# CPU cache info:\n"); 1698 for (i = 0; i < ff->ph->env.caches_cnt; i++) { 1699 fprintf(fp, "# "); 1700 cpu_cache_level__fprintf(fp, &ff->ph->env.caches[i]); 1701 } 1702 } 1703 1704 static void print_pmu_mappings(struct feat_fd *ff, FILE *fp) 1705 { 1706 const char *delimiter = "# pmu mappings: "; 1707 char *str, *tmp; 1708 u32 pmu_num; 1709 u32 type; 1710 1711 pmu_num = ff->ph->env.nr_pmu_mappings; 1712 if (!pmu_num) { 1713 fprintf(fp, "# pmu mappings: not available\n"); 1714 return; 1715 } 1716 1717 str = ff->ph->env.pmu_mappings; 1718 1719 while (pmu_num) { 1720 type = strtoul(str, &tmp, 0); 1721 if (*tmp != ':') 1722 goto error; 1723 1724 str = tmp + 1; 1725 fprintf(fp, "%s%s = %" PRIu32, delimiter, str, type); 1726 1727 delimiter = ", "; 1728 str += strlen(str) + 1; 1729 pmu_num--; 1730 } 1731 1732 fprintf(fp, "\n"); 1733 1734 if (!pmu_num) 1735 return; 1736 error: 1737 fprintf(fp, "# pmu mappings: unable to read\n"); 1738 } 1739 1740 static void print_group_desc(struct feat_fd *ff, FILE *fp) 1741 { 1742 struct perf_session *session; 1743 struct perf_evsel *evsel; 1744 u32 nr = 0; 1745 1746 session = container_of(ff->ph, struct perf_session, header); 1747 1748 evlist__for_each_entry(session->evlist, evsel) { 1749 if (perf_evsel__is_group_leader(evsel) && 1750 evsel->nr_members > 1) { 1751 fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", 1752 perf_evsel__name(evsel)); 1753 1754 nr = evsel->nr_members - 1; 1755 } else if (nr) { 1756 fprintf(fp, ",%s", perf_evsel__name(evsel)); 1757 1758 if (--nr == 0) 1759 fprintf(fp, "}\n"); 1760 } 1761 } 1762 } 1763 1764 static void print_sample_time(struct feat_fd *ff, FILE *fp) 1765 { 1766 struct perf_session *session; 1767 char time_buf[32]; 1768 double d; 1769 1770 session = container_of(ff->ph, struct perf_session, header); 1771 1772 timestamp__scnprintf_usec(session->evlist->first_sample_time, 1773 time_buf, sizeof(time_buf)); 1774 fprintf(fp, "# time of first sample : %s\n", time_buf); 1775 1776 timestamp__scnprintf_usec(session->evlist->last_sample_time, 1777 time_buf, sizeof(time_buf)); 1778 fprintf(fp, "# time of last sample : %s\n", time_buf); 1779 1780 d = (double)(session->evlist->last_sample_time - 1781 session->evlist->first_sample_time) / NSEC_PER_MSEC; 1782 1783 fprintf(fp, "# sample duration : %10.3f ms\n", d); 1784 } 1785 1786 static void memory_node__fprintf(struct memory_node *n, 1787 unsigned long long bsize, FILE *fp) 1788 { 1789 char buf_map[100], buf_size[50]; 1790 unsigned long long size; 1791 1792 size = bsize * bitmap_weight(n->set, n->size); 1793 unit_number__scnprintf(buf_size, 50, size); 1794 1795 bitmap_scnprintf(n->set, n->size, buf_map, 100); 1796 fprintf(fp, "# %3" PRIu64 " [%s]: %s\n", n->node, buf_size, buf_map); 1797 } 1798 1799 static void print_mem_topology(struct feat_fd *ff, FILE *fp) 1800 { 1801 struct memory_node *nodes; 1802 int i, nr; 1803 1804 nodes = ff->ph->env.memory_nodes; 1805 nr = ff->ph->env.nr_memory_nodes; 1806 1807 fprintf(fp, "# memory nodes (nr %d, block size 0x%llx):\n", 1808 nr, ff->ph->env.memory_bsize); 1809 1810 for (i = 0; i < nr; i++) { 1811 memory_node__fprintf(&nodes[i], ff->ph->env.memory_bsize, fp); 1812 } 1813 } 1814 1815 static int __event_process_build_id(struct build_id_event *bev, 1816 char *filename, 1817 struct perf_session *session) 1818 { 1819 int err = -1; 1820 struct machine *machine; 1821 u16 cpumode; 1822 struct dso *dso; 1823 enum dso_kernel_type dso_type; 1824 1825 machine = perf_session__findnew_machine(session, bev->pid); 1826 if (!machine) 1827 goto out; 1828 1829 cpumode = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; 1830 1831 switch (cpumode) { 1832 case PERF_RECORD_MISC_KERNEL: 1833 dso_type = DSO_TYPE_KERNEL; 1834 break; 1835 case PERF_RECORD_MISC_GUEST_KERNEL: 1836 dso_type = DSO_TYPE_GUEST_KERNEL; 1837 break; 1838 case PERF_RECORD_MISC_USER: 1839 case PERF_RECORD_MISC_GUEST_USER: 1840 dso_type = DSO_TYPE_USER; 1841 break; 1842 default: 1843 goto out; 1844 } 1845 1846 dso = machine__findnew_dso(machine, filename); 1847 if (dso != NULL) { 1848 char sbuild_id[SBUILD_ID_SIZE]; 1849 1850 dso__set_build_id(dso, &bev->build_id); 1851 1852 if (dso_type != DSO_TYPE_USER) { 1853 struct kmod_path m = { .name = NULL, }; 1854 1855 if (!kmod_path__parse_name(&m, filename) && m.kmod) 1856 dso__set_module_info(dso, &m, machine); 1857 else 1858 dso->kernel = dso_type; 1859 1860 free(m.name); 1861 } 1862 1863 build_id__sprintf(dso->build_id, sizeof(dso->build_id), 1864 sbuild_id); 1865 pr_debug("build id event received for %s: %s\n", 1866 dso->long_name, sbuild_id); 1867 dso__put(dso); 1868 } 1869 1870 err = 0; 1871 out: 1872 return err; 1873 } 1874 1875 static int perf_header__read_build_ids_abi_quirk(struct perf_header *header, 1876 int input, u64 offset, u64 size) 1877 { 1878 struct perf_session *session = container_of(header, struct perf_session, header); 1879 struct { 1880 struct perf_event_header header; 1881 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 1882 char filename[0]; 1883 } old_bev; 1884 struct build_id_event bev; 1885 char filename[PATH_MAX]; 1886 u64 limit = offset + size; 1887 1888 while (offset < limit) { 1889 ssize_t len; 1890 1891 if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev)) 1892 return -1; 1893 1894 if (header->needs_swap) 1895 perf_event_header__bswap(&old_bev.header); 1896 1897 len = old_bev.header.size - sizeof(old_bev); 1898 if (readn(input, filename, len) != len) 1899 return -1; 1900 1901 bev.header = old_bev.header; 1902 1903 /* 1904 * As the pid is the missing value, we need to fill 1905 * it properly. The header.misc value give us nice hint. 1906 */ 1907 bev.pid = HOST_KERNEL_ID; 1908 if (bev.header.misc == PERF_RECORD_MISC_GUEST_USER || 1909 bev.header.misc == PERF_RECORD_MISC_GUEST_KERNEL) 1910 bev.pid = DEFAULT_GUEST_KERNEL_ID; 1911 1912 memcpy(bev.build_id, old_bev.build_id, sizeof(bev.build_id)); 1913 __event_process_build_id(&bev, filename, session); 1914 1915 offset += bev.header.size; 1916 } 1917 1918 return 0; 1919 } 1920 1921 static int perf_header__read_build_ids(struct perf_header *header, 1922 int input, u64 offset, u64 size) 1923 { 1924 struct perf_session *session = container_of(header, struct perf_session, header); 1925 struct build_id_event bev; 1926 char filename[PATH_MAX]; 1927 u64 limit = offset + size, orig_offset = offset; 1928 int err = -1; 1929 1930 while (offset < limit) { 1931 ssize_t len; 1932 1933 if (readn(input, &bev, sizeof(bev)) != sizeof(bev)) 1934 goto out; 1935 1936 if (header->needs_swap) 1937 perf_event_header__bswap(&bev.header); 1938 1939 len = bev.header.size - sizeof(bev); 1940 if (readn(input, filename, len) != len) 1941 goto out; 1942 /* 1943 * The a1645ce1 changeset: 1944 * 1945 * "perf: 'perf kvm' tool for monitoring guest performance from host" 1946 * 1947 * Added a field to struct build_id_event that broke the file 1948 * format. 1949 * 1950 * Since the kernel build-id is the first entry, process the 1951 * table using the old format if the well known 1952 * '[kernel.kallsyms]' string for the kernel build-id has the 1953 * first 4 characters chopped off (where the pid_t sits). 1954 */ 1955 if (memcmp(filename, "nel.kallsyms]", 13) == 0) { 1956 if (lseek(input, orig_offset, SEEK_SET) == (off_t)-1) 1957 return -1; 1958 return perf_header__read_build_ids_abi_quirk(header, input, offset, size); 1959 } 1960 1961 __event_process_build_id(&bev, filename, session); 1962 1963 offset += bev.header.size; 1964 } 1965 err = 0; 1966 out: 1967 return err; 1968 } 1969 1970 /* Macro for features that simply need to read and store a string. */ 1971 #define FEAT_PROCESS_STR_FUN(__feat, __feat_env) \ 1972 static int process_##__feat(struct feat_fd *ff, void *data __maybe_unused) \ 1973 {\ 1974 ff->ph->env.__feat_env = do_read_string(ff); \ 1975 return ff->ph->env.__feat_env ? 0 : -ENOMEM; \ 1976 } 1977 1978 FEAT_PROCESS_STR_FUN(hostname, hostname); 1979 FEAT_PROCESS_STR_FUN(osrelease, os_release); 1980 FEAT_PROCESS_STR_FUN(version, version); 1981 FEAT_PROCESS_STR_FUN(arch, arch); 1982 FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc); 1983 FEAT_PROCESS_STR_FUN(cpuid, cpuid); 1984 1985 static int process_tracing_data(struct feat_fd *ff, void *data) 1986 { 1987 ssize_t ret = trace_report(ff->fd, data, false); 1988 1989 return ret < 0 ? -1 : 0; 1990 } 1991 1992 static int process_build_id(struct feat_fd *ff, void *data __maybe_unused) 1993 { 1994 if (perf_header__read_build_ids(ff->ph, ff->fd, ff->offset, ff->size)) 1995 pr_debug("Failed to read buildids, continuing...\n"); 1996 return 0; 1997 } 1998 1999 static int process_nrcpus(struct feat_fd *ff, void *data __maybe_unused) 2000 { 2001 int ret; 2002 u32 nr_cpus_avail, nr_cpus_online; 2003 2004 ret = do_read_u32(ff, &nr_cpus_avail); 2005 if (ret) 2006 return ret; 2007 2008 ret = do_read_u32(ff, &nr_cpus_online); 2009 if (ret) 2010 return ret; 2011 ff->ph->env.nr_cpus_avail = (int)nr_cpus_avail; 2012 ff->ph->env.nr_cpus_online = (int)nr_cpus_online; 2013 return 0; 2014 } 2015 2016 static int process_total_mem(struct feat_fd *ff, void *data __maybe_unused) 2017 { 2018 u64 total_mem; 2019 int ret; 2020 2021 ret = do_read_u64(ff, &total_mem); 2022 if (ret) 2023 return -1; 2024 ff->ph->env.total_mem = (unsigned long long)total_mem; 2025 return 0; 2026 } 2027 2028 static struct perf_evsel * 2029 perf_evlist__find_by_index(struct perf_evlist *evlist, int idx) 2030 { 2031 struct perf_evsel *evsel; 2032 2033 evlist__for_each_entry(evlist, evsel) { 2034 if (evsel->idx == idx) 2035 return evsel; 2036 } 2037 2038 return NULL; 2039 } 2040 2041 static void 2042 perf_evlist__set_event_name(struct perf_evlist *evlist, 2043 struct perf_evsel *event) 2044 { 2045 struct perf_evsel *evsel; 2046 2047 if (!event->name) 2048 return; 2049 2050 evsel = perf_evlist__find_by_index(evlist, event->idx); 2051 if (!evsel) 2052 return; 2053 2054 if (evsel->name) 2055 return; 2056 2057 evsel->name = strdup(event->name); 2058 } 2059 2060 static int 2061 process_event_desc(struct feat_fd *ff, void *data __maybe_unused) 2062 { 2063 struct perf_session *session; 2064 struct perf_evsel *evsel, *events = read_event_desc(ff); 2065 2066 if (!events) 2067 return 0; 2068 2069 session = container_of(ff->ph, struct perf_session, header); 2070 2071 if (session->data->is_pipe) { 2072 /* Save events for reading later by print_event_desc, 2073 * since they can't be read again in pipe mode. */ 2074 ff->events = events; 2075 } 2076 2077 for (evsel = events; evsel->attr.size; evsel++) 2078 perf_evlist__set_event_name(session->evlist, evsel); 2079 2080 if (!session->data->is_pipe) 2081 free_event_desc(events); 2082 2083 return 0; 2084 } 2085 2086 static int process_cmdline(struct feat_fd *ff, void *data __maybe_unused) 2087 { 2088 char *str, *cmdline = NULL, **argv = NULL; 2089 u32 nr, i, len = 0; 2090 2091 if (do_read_u32(ff, &nr)) 2092 return -1; 2093 2094 ff->ph->env.nr_cmdline = nr; 2095 2096 cmdline = zalloc(ff->size + nr + 1); 2097 if (!cmdline) 2098 return -1; 2099 2100 argv = zalloc(sizeof(char *) * (nr + 1)); 2101 if (!argv) 2102 goto error; 2103 2104 for (i = 0; i < nr; i++) { 2105 str = do_read_string(ff); 2106 if (!str) 2107 goto error; 2108 2109 argv[i] = cmdline + len; 2110 memcpy(argv[i], str, strlen(str) + 1); 2111 len += strlen(str) + 1; 2112 free(str); 2113 } 2114 ff->ph->env.cmdline = cmdline; 2115 ff->ph->env.cmdline_argv = (const char **) argv; 2116 return 0; 2117 2118 error: 2119 free(argv); 2120 free(cmdline); 2121 return -1; 2122 } 2123 2124 static int process_cpu_topology(struct feat_fd *ff, void *data __maybe_unused) 2125 { 2126 u32 nr, i; 2127 char *str; 2128 struct strbuf sb; 2129 int cpu_nr = ff->ph->env.nr_cpus_avail; 2130 u64 size = 0; 2131 struct perf_header *ph = ff->ph; 2132 bool do_core_id_test = true; 2133 2134 ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu)); 2135 if (!ph->env.cpu) 2136 return -1; 2137 2138 if (do_read_u32(ff, &nr)) 2139 goto free_cpu; 2140 2141 ph->env.nr_sibling_cores = nr; 2142 size += sizeof(u32); 2143 if (strbuf_init(&sb, 128) < 0) 2144 goto free_cpu; 2145 2146 for (i = 0; i < nr; i++) { 2147 str = do_read_string(ff); 2148 if (!str) 2149 goto error; 2150 2151 /* include a NULL character at the end */ 2152 if (strbuf_add(&sb, str, strlen(str) + 1) < 0) 2153 goto error; 2154 size += string_size(str); 2155 free(str); 2156 } 2157 ph->env.sibling_cores = strbuf_detach(&sb, NULL); 2158 2159 if (do_read_u32(ff, &nr)) 2160 return -1; 2161 2162 ph->env.nr_sibling_threads = nr; 2163 size += sizeof(u32); 2164 2165 for (i = 0; i < nr; i++) { 2166 str = do_read_string(ff); 2167 if (!str) 2168 goto error; 2169 2170 /* include a NULL character at the end */ 2171 if (strbuf_add(&sb, str, strlen(str) + 1) < 0) 2172 goto error; 2173 size += string_size(str); 2174 free(str); 2175 } 2176 ph->env.sibling_threads = strbuf_detach(&sb, NULL); 2177 2178 /* 2179 * The header may be from old perf, 2180 * which doesn't include core id and socket id information. 2181 */ 2182 if (ff->size <= size) { 2183 zfree(&ph->env.cpu); 2184 return 0; 2185 } 2186 2187 /* On s390 the socket_id number is not related to the numbers of cpus. 2188 * The socket_id number might be higher than the numbers of cpus. 2189 * This depends on the configuration. 2190 */ 2191 if (ph->env.arch && !strncmp(ph->env.arch, "s390", 4)) 2192 do_core_id_test = false; 2193 2194 for (i = 0; i < (u32)cpu_nr; i++) { 2195 if (do_read_u32(ff, &nr)) 2196 goto free_cpu; 2197 2198 ph->env.cpu[i].core_id = nr; 2199 2200 if (do_read_u32(ff, &nr)) 2201 goto free_cpu; 2202 2203 if (do_core_id_test && nr != (u32)-1 && nr > (u32)cpu_nr) { 2204 pr_debug("socket_id number is too big." 2205 "You may need to upgrade the perf tool.\n"); 2206 goto free_cpu; 2207 } 2208 2209 ph->env.cpu[i].socket_id = nr; 2210 } 2211 2212 return 0; 2213 2214 error: 2215 strbuf_release(&sb); 2216 free_cpu: 2217 zfree(&ph->env.cpu); 2218 return -1; 2219 } 2220 2221 static int process_numa_topology(struct feat_fd *ff, void *data __maybe_unused) 2222 { 2223 struct numa_node *nodes, *n; 2224 u32 nr, i; 2225 char *str; 2226 2227 /* nr nodes */ 2228 if (do_read_u32(ff, &nr)) 2229 return -1; 2230 2231 nodes = zalloc(sizeof(*nodes) * nr); 2232 if (!nodes) 2233 return -ENOMEM; 2234 2235 for (i = 0; i < nr; i++) { 2236 n = &nodes[i]; 2237 2238 /* node number */ 2239 if (do_read_u32(ff, &n->node)) 2240 goto error; 2241 2242 if (do_read_u64(ff, &n->mem_total)) 2243 goto error; 2244 2245 if (do_read_u64(ff, &n->mem_free)) 2246 goto error; 2247 2248 str = do_read_string(ff); 2249 if (!str) 2250 goto error; 2251 2252 n->map = cpu_map__new(str); 2253 if (!n->map) 2254 goto error; 2255 2256 free(str); 2257 } 2258 ff->ph->env.nr_numa_nodes = nr; 2259 ff->ph->env.numa_nodes = nodes; 2260 return 0; 2261 2262 error: 2263 free(nodes); 2264 return -1; 2265 } 2266 2267 static int process_pmu_mappings(struct feat_fd *ff, void *data __maybe_unused) 2268 { 2269 char *name; 2270 u32 pmu_num; 2271 u32 type; 2272 struct strbuf sb; 2273 2274 if (do_read_u32(ff, &pmu_num)) 2275 return -1; 2276 2277 if (!pmu_num) { 2278 pr_debug("pmu mappings not available\n"); 2279 return 0; 2280 } 2281 2282 ff->ph->env.nr_pmu_mappings = pmu_num; 2283 if (strbuf_init(&sb, 128) < 0) 2284 return -1; 2285 2286 while (pmu_num) { 2287 if (do_read_u32(ff, &type)) 2288 goto error; 2289 2290 name = do_read_string(ff); 2291 if (!name) 2292 goto error; 2293 2294 if (strbuf_addf(&sb, "%u:%s", type, name) < 0) 2295 goto error; 2296 /* include a NULL character at the end */ 2297 if (strbuf_add(&sb, "", 1) < 0) 2298 goto error; 2299 2300 if (!strcmp(name, "msr")) 2301 ff->ph->env.msr_pmu_type = type; 2302 2303 free(name); 2304 pmu_num--; 2305 } 2306 ff->ph->env.pmu_mappings = strbuf_detach(&sb, NULL); 2307 return 0; 2308 2309 error: 2310 strbuf_release(&sb); 2311 return -1; 2312 } 2313 2314 static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused) 2315 { 2316 size_t ret = -1; 2317 u32 i, nr, nr_groups; 2318 struct perf_session *session; 2319 struct perf_evsel *evsel, *leader = NULL; 2320 struct group_desc { 2321 char *name; 2322 u32 leader_idx; 2323 u32 nr_members; 2324 } *desc; 2325 2326 if (do_read_u32(ff, &nr_groups)) 2327 return -1; 2328 2329 ff->ph->env.nr_groups = nr_groups; 2330 if (!nr_groups) { 2331 pr_debug("group desc not available\n"); 2332 return 0; 2333 } 2334 2335 desc = calloc(nr_groups, sizeof(*desc)); 2336 if (!desc) 2337 return -1; 2338 2339 for (i = 0; i < nr_groups; i++) { 2340 desc[i].name = do_read_string(ff); 2341 if (!desc[i].name) 2342 goto out_free; 2343 2344 if (do_read_u32(ff, &desc[i].leader_idx)) 2345 goto out_free; 2346 2347 if (do_read_u32(ff, &desc[i].nr_members)) 2348 goto out_free; 2349 } 2350 2351 /* 2352 * Rebuild group relationship based on the group_desc 2353 */ 2354 session = container_of(ff->ph, struct perf_session, header); 2355 session->evlist->nr_groups = nr_groups; 2356 2357 i = nr = 0; 2358 evlist__for_each_entry(session->evlist, evsel) { 2359 if (evsel->idx == (int) desc[i].leader_idx) { 2360 evsel->leader = evsel; 2361 /* {anon_group} is a dummy name */ 2362 if (strcmp(desc[i].name, "{anon_group}")) { 2363 evsel->group_name = desc[i].name; 2364 desc[i].name = NULL; 2365 } 2366 evsel->nr_members = desc[i].nr_members; 2367 2368 if (i >= nr_groups || nr > 0) { 2369 pr_debug("invalid group desc\n"); 2370 goto out_free; 2371 } 2372 2373 leader = evsel; 2374 nr = evsel->nr_members - 1; 2375 i++; 2376 } else if (nr) { 2377 /* This is a group member */ 2378 evsel->leader = leader; 2379 2380 nr--; 2381 } 2382 } 2383 2384 if (i != nr_groups || nr != 0) { 2385 pr_debug("invalid group desc\n"); 2386 goto out_free; 2387 } 2388 2389 ret = 0; 2390 out_free: 2391 for (i = 0; i < nr_groups; i++) 2392 zfree(&desc[i].name); 2393 free(desc); 2394 2395 return ret; 2396 } 2397 2398 static int process_auxtrace(struct feat_fd *ff, void *data __maybe_unused) 2399 { 2400 struct perf_session *session; 2401 int err; 2402 2403 session = container_of(ff->ph, struct perf_session, header); 2404 2405 err = auxtrace_index__process(ff->fd, ff->size, session, 2406 ff->ph->needs_swap); 2407 if (err < 0) 2408 pr_err("Failed to process auxtrace index\n"); 2409 return err; 2410 } 2411 2412 static int process_cache(struct feat_fd *ff, void *data __maybe_unused) 2413 { 2414 struct cpu_cache_level *caches; 2415 u32 cnt, i, version; 2416 2417 if (do_read_u32(ff, &version)) 2418 return -1; 2419 2420 if (version != 1) 2421 return -1; 2422 2423 if (do_read_u32(ff, &cnt)) 2424 return -1; 2425 2426 caches = zalloc(sizeof(*caches) * cnt); 2427 if (!caches) 2428 return -1; 2429 2430 for (i = 0; i < cnt; i++) { 2431 struct cpu_cache_level c; 2432 2433 #define _R(v) \ 2434 if (do_read_u32(ff, &c.v))\ 2435 goto out_free_caches; \ 2436 2437 _R(level) 2438 _R(line_size) 2439 _R(sets) 2440 _R(ways) 2441 #undef _R 2442 2443 #define _R(v) \ 2444 c.v = do_read_string(ff); \ 2445 if (!c.v) \ 2446 goto out_free_caches; 2447 2448 _R(type) 2449 _R(size) 2450 _R(map) 2451 #undef _R 2452 2453 caches[i] = c; 2454 } 2455 2456 ff->ph->env.caches = caches; 2457 ff->ph->env.caches_cnt = cnt; 2458 return 0; 2459 out_free_caches: 2460 free(caches); 2461 return -1; 2462 } 2463 2464 static int process_sample_time(struct feat_fd *ff, void *data __maybe_unused) 2465 { 2466 struct perf_session *session; 2467 u64 first_sample_time, last_sample_time; 2468 int ret; 2469 2470 session = container_of(ff->ph, struct perf_session, header); 2471 2472 ret = do_read_u64(ff, &first_sample_time); 2473 if (ret) 2474 return -1; 2475 2476 ret = do_read_u64(ff, &last_sample_time); 2477 if (ret) 2478 return -1; 2479 2480 session->evlist->first_sample_time = first_sample_time; 2481 session->evlist->last_sample_time = last_sample_time; 2482 return 0; 2483 } 2484 2485 static int process_mem_topology(struct feat_fd *ff, 2486 void *data __maybe_unused) 2487 { 2488 struct memory_node *nodes; 2489 u64 version, i, nr, bsize; 2490 int ret = -1; 2491 2492 if (do_read_u64(ff, &version)) 2493 return -1; 2494 2495 if (version != 1) 2496 return -1; 2497 2498 if (do_read_u64(ff, &bsize)) 2499 return -1; 2500 2501 if (do_read_u64(ff, &nr)) 2502 return -1; 2503 2504 nodes = zalloc(sizeof(*nodes) * nr); 2505 if (!nodes) 2506 return -1; 2507 2508 for (i = 0; i < nr; i++) { 2509 struct memory_node n; 2510 2511 #define _R(v) \ 2512 if (do_read_u64(ff, &n.v)) \ 2513 goto out; \ 2514 2515 _R(node) 2516 _R(size) 2517 2518 #undef _R 2519 2520 if (do_read_bitmap(ff, &n.set, &n.size)) 2521 goto out; 2522 2523 nodes[i] = n; 2524 } 2525 2526 ff->ph->env.memory_bsize = bsize; 2527 ff->ph->env.memory_nodes = nodes; 2528 ff->ph->env.nr_memory_nodes = nr; 2529 ret = 0; 2530 2531 out: 2532 if (ret) 2533 free(nodes); 2534 return ret; 2535 } 2536 2537 struct feature_ops { 2538 int (*write)(struct feat_fd *ff, struct perf_evlist *evlist); 2539 void (*print)(struct feat_fd *ff, FILE *fp); 2540 int (*process)(struct feat_fd *ff, void *data); 2541 const char *name; 2542 bool full_only; 2543 bool synthesize; 2544 }; 2545 2546 #define FEAT_OPR(n, func, __full_only) \ 2547 [HEADER_##n] = { \ 2548 .name = __stringify(n), \ 2549 .write = write_##func, \ 2550 .print = print_##func, \ 2551 .full_only = __full_only, \ 2552 .process = process_##func, \ 2553 .synthesize = true \ 2554 } 2555 2556 #define FEAT_OPN(n, func, __full_only) \ 2557 [HEADER_##n] = { \ 2558 .name = __stringify(n), \ 2559 .write = write_##func, \ 2560 .print = print_##func, \ 2561 .full_only = __full_only, \ 2562 .process = process_##func \ 2563 } 2564 2565 /* feature_ops not implemented: */ 2566 #define print_tracing_data NULL 2567 #define print_build_id NULL 2568 2569 #define process_branch_stack NULL 2570 #define process_stat NULL 2571 2572 2573 static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = { 2574 FEAT_OPN(TRACING_DATA, tracing_data, false), 2575 FEAT_OPN(BUILD_ID, build_id, false), 2576 FEAT_OPR(HOSTNAME, hostname, false), 2577 FEAT_OPR(OSRELEASE, osrelease, false), 2578 FEAT_OPR(VERSION, version, false), 2579 FEAT_OPR(ARCH, arch, false), 2580 FEAT_OPR(NRCPUS, nrcpus, false), 2581 FEAT_OPR(CPUDESC, cpudesc, false), 2582 FEAT_OPR(CPUID, cpuid, false), 2583 FEAT_OPR(TOTAL_MEM, total_mem, false), 2584 FEAT_OPR(EVENT_DESC, event_desc, false), 2585 FEAT_OPR(CMDLINE, cmdline, false), 2586 FEAT_OPR(CPU_TOPOLOGY, cpu_topology, true), 2587 FEAT_OPR(NUMA_TOPOLOGY, numa_topology, true), 2588 FEAT_OPN(BRANCH_STACK, branch_stack, false), 2589 FEAT_OPR(PMU_MAPPINGS, pmu_mappings, false), 2590 FEAT_OPN(GROUP_DESC, group_desc, false), 2591 FEAT_OPN(AUXTRACE, auxtrace, false), 2592 FEAT_OPN(STAT, stat, false), 2593 FEAT_OPN(CACHE, cache, true), 2594 FEAT_OPR(SAMPLE_TIME, sample_time, false), 2595 FEAT_OPR(MEM_TOPOLOGY, mem_topology, true), 2596 }; 2597 2598 struct header_print_data { 2599 FILE *fp; 2600 bool full; /* extended list of headers */ 2601 }; 2602 2603 static int perf_file_section__fprintf_info(struct perf_file_section *section, 2604 struct perf_header *ph, 2605 int feat, int fd, void *data) 2606 { 2607 struct header_print_data *hd = data; 2608 struct feat_fd ff; 2609 2610 if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { 2611 pr_debug("Failed to lseek to %" PRIu64 " offset for feature " 2612 "%d, continuing...\n", section->offset, feat); 2613 return 0; 2614 } 2615 if (feat >= HEADER_LAST_FEATURE) { 2616 pr_warning("unknown feature %d\n", feat); 2617 return 0; 2618 } 2619 if (!feat_ops[feat].print) 2620 return 0; 2621 2622 ff = (struct feat_fd) { 2623 .fd = fd, 2624 .ph = ph, 2625 }; 2626 2627 if (!feat_ops[feat].full_only || hd->full) 2628 feat_ops[feat].print(&ff, hd->fp); 2629 else 2630 fprintf(hd->fp, "# %s info available, use -I to display\n", 2631 feat_ops[feat].name); 2632 2633 return 0; 2634 } 2635 2636 int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full) 2637 { 2638 struct header_print_data hd; 2639 struct perf_header *header = &session->header; 2640 int fd = perf_data__fd(session->data); 2641 struct stat st; 2642 int ret, bit; 2643 2644 hd.fp = fp; 2645 hd.full = full; 2646 2647 ret = fstat(fd, &st); 2648 if (ret == -1) 2649 return -1; 2650 2651 fprintf(fp, "# captured on : %s", ctime(&st.st_ctime)); 2652 2653 fprintf(fp, "# header version : %u\n", header->version); 2654 fprintf(fp, "# data offset : %" PRIu64 "\n", header->data_offset); 2655 fprintf(fp, "# data size : %" PRIu64 "\n", header->data_size); 2656 fprintf(fp, "# feat offset : %" PRIu64 "\n", header->feat_offset); 2657 2658 perf_header__process_sections(header, fd, &hd, 2659 perf_file_section__fprintf_info); 2660 2661 if (session->data->is_pipe) 2662 return 0; 2663 2664 fprintf(fp, "# missing features: "); 2665 for_each_clear_bit(bit, header->adds_features, HEADER_LAST_FEATURE) { 2666 if (bit) 2667 fprintf(fp, "%s ", feat_ops[bit].name); 2668 } 2669 2670 fprintf(fp, "\n"); 2671 return 0; 2672 } 2673 2674 static int do_write_feat(struct feat_fd *ff, int type, 2675 struct perf_file_section **p, 2676 struct perf_evlist *evlist) 2677 { 2678 int err; 2679 int ret = 0; 2680 2681 if (perf_header__has_feat(ff->ph, type)) { 2682 if (!feat_ops[type].write) 2683 return -1; 2684 2685 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) 2686 return -1; 2687 2688 (*p)->offset = lseek(ff->fd, 0, SEEK_CUR); 2689 2690 err = feat_ops[type].write(ff, evlist); 2691 if (err < 0) { 2692 pr_debug("failed to write feature %s\n", feat_ops[type].name); 2693 2694 /* undo anything written */ 2695 lseek(ff->fd, (*p)->offset, SEEK_SET); 2696 2697 return -1; 2698 } 2699 (*p)->size = lseek(ff->fd, 0, SEEK_CUR) - (*p)->offset; 2700 (*p)++; 2701 } 2702 return ret; 2703 } 2704 2705 static int perf_header__adds_write(struct perf_header *header, 2706 struct perf_evlist *evlist, int fd) 2707 { 2708 int nr_sections; 2709 struct feat_fd ff; 2710 struct perf_file_section *feat_sec, *p; 2711 int sec_size; 2712 u64 sec_start; 2713 int feat; 2714 int err; 2715 2716 ff = (struct feat_fd){ 2717 .fd = fd, 2718 .ph = header, 2719 }; 2720 2721 nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS); 2722 if (!nr_sections) 2723 return 0; 2724 2725 feat_sec = p = calloc(nr_sections, sizeof(*feat_sec)); 2726 if (feat_sec == NULL) 2727 return -ENOMEM; 2728 2729 sec_size = sizeof(*feat_sec) * nr_sections; 2730 2731 sec_start = header->feat_offset; 2732 lseek(fd, sec_start + sec_size, SEEK_SET); 2733 2734 for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) { 2735 if (do_write_feat(&ff, feat, &p, evlist)) 2736 perf_header__clear_feat(header, feat); 2737 } 2738 2739 lseek(fd, sec_start, SEEK_SET); 2740 /* 2741 * may write more than needed due to dropped feature, but 2742 * this is okay, reader will skip the mising entries 2743 */ 2744 err = do_write(&ff, feat_sec, sec_size); 2745 if (err < 0) 2746 pr_debug("failed to write feature section\n"); 2747 free(feat_sec); 2748 return err; 2749 } 2750 2751 int perf_header__write_pipe(int fd) 2752 { 2753 struct perf_pipe_file_header f_header; 2754 struct feat_fd ff; 2755 int err; 2756 2757 ff = (struct feat_fd){ .fd = fd }; 2758 2759 f_header = (struct perf_pipe_file_header){ 2760 .magic = PERF_MAGIC, 2761 .size = sizeof(f_header), 2762 }; 2763 2764 err = do_write(&ff, &f_header, sizeof(f_header)); 2765 if (err < 0) { 2766 pr_debug("failed to write perf pipe header\n"); 2767 return err; 2768 } 2769 2770 return 0; 2771 } 2772 2773 int perf_session__write_header(struct perf_session *session, 2774 struct perf_evlist *evlist, 2775 int fd, bool at_exit) 2776 { 2777 struct perf_file_header f_header; 2778 struct perf_file_attr f_attr; 2779 struct perf_header *header = &session->header; 2780 struct perf_evsel *evsel; 2781 struct feat_fd ff; 2782 u64 attr_offset; 2783 int err; 2784 2785 ff = (struct feat_fd){ .fd = fd}; 2786 lseek(fd, sizeof(f_header), SEEK_SET); 2787 2788 evlist__for_each_entry(session->evlist, evsel) { 2789 evsel->id_offset = lseek(fd, 0, SEEK_CUR); 2790 err = do_write(&ff, evsel->id, evsel->ids * sizeof(u64)); 2791 if (err < 0) { 2792 pr_debug("failed to write perf header\n"); 2793 return err; 2794 } 2795 } 2796 2797 attr_offset = lseek(ff.fd, 0, SEEK_CUR); 2798 2799 evlist__for_each_entry(evlist, evsel) { 2800 f_attr = (struct perf_file_attr){ 2801 .attr = evsel->attr, 2802 .ids = { 2803 .offset = evsel->id_offset, 2804 .size = evsel->ids * sizeof(u64), 2805 } 2806 }; 2807 err = do_write(&ff, &f_attr, sizeof(f_attr)); 2808 if (err < 0) { 2809 pr_debug("failed to write perf header attribute\n"); 2810 return err; 2811 } 2812 } 2813 2814 if (!header->data_offset) 2815 header->data_offset = lseek(fd, 0, SEEK_CUR); 2816 header->feat_offset = header->data_offset + header->data_size; 2817 2818 if (at_exit) { 2819 err = perf_header__adds_write(header, evlist, fd); 2820 if (err < 0) 2821 return err; 2822 } 2823 2824 f_header = (struct perf_file_header){ 2825 .magic = PERF_MAGIC, 2826 .size = sizeof(f_header), 2827 .attr_size = sizeof(f_attr), 2828 .attrs = { 2829 .offset = attr_offset, 2830 .size = evlist->nr_entries * sizeof(f_attr), 2831 }, 2832 .data = { 2833 .offset = header->data_offset, 2834 .size = header->data_size, 2835 }, 2836 /* event_types is ignored, store zeros */ 2837 }; 2838 2839 memcpy(&f_header.adds_features, &header->adds_features, sizeof(header->adds_features)); 2840 2841 lseek(fd, 0, SEEK_SET); 2842 err = do_write(&ff, &f_header, sizeof(f_header)); 2843 if (err < 0) { 2844 pr_debug("failed to write perf header\n"); 2845 return err; 2846 } 2847 lseek(fd, header->data_offset + header->data_size, SEEK_SET); 2848 2849 return 0; 2850 } 2851 2852 static int perf_header__getbuffer64(struct perf_header *header, 2853 int fd, void *buf, size_t size) 2854 { 2855 if (readn(fd, buf, size) <= 0) 2856 return -1; 2857 2858 if (header->needs_swap) 2859 mem_bswap_64(buf, size); 2860 2861 return 0; 2862 } 2863 2864 int perf_header__process_sections(struct perf_header *header, int fd, 2865 void *data, 2866 int (*process)(struct perf_file_section *section, 2867 struct perf_header *ph, 2868 int feat, int fd, void *data)) 2869 { 2870 struct perf_file_section *feat_sec, *sec; 2871 int nr_sections; 2872 int sec_size; 2873 int feat; 2874 int err; 2875 2876 nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS); 2877 if (!nr_sections) 2878 return 0; 2879 2880 feat_sec = sec = calloc(nr_sections, sizeof(*feat_sec)); 2881 if (!feat_sec) 2882 return -1; 2883 2884 sec_size = sizeof(*feat_sec) * nr_sections; 2885 2886 lseek(fd, header->feat_offset, SEEK_SET); 2887 2888 err = perf_header__getbuffer64(header, fd, feat_sec, sec_size); 2889 if (err < 0) 2890 goto out_free; 2891 2892 for_each_set_bit(feat, header->adds_features, HEADER_LAST_FEATURE) { 2893 err = process(sec++, header, feat, fd, data); 2894 if (err < 0) 2895 goto out_free; 2896 } 2897 err = 0; 2898 out_free: 2899 free(feat_sec); 2900 return err; 2901 } 2902 2903 static const int attr_file_abi_sizes[] = { 2904 [0] = PERF_ATTR_SIZE_VER0, 2905 [1] = PERF_ATTR_SIZE_VER1, 2906 [2] = PERF_ATTR_SIZE_VER2, 2907 [3] = PERF_ATTR_SIZE_VER3, 2908 [4] = PERF_ATTR_SIZE_VER4, 2909 0, 2910 }; 2911 2912 /* 2913 * In the legacy file format, the magic number is not used to encode endianness. 2914 * hdr_sz was used to encode endianness. But given that hdr_sz can vary based 2915 * on ABI revisions, we need to try all combinations for all endianness to 2916 * detect the endianness. 2917 */ 2918 static int try_all_file_abis(uint64_t hdr_sz, struct perf_header *ph) 2919 { 2920 uint64_t ref_size, attr_size; 2921 int i; 2922 2923 for (i = 0 ; attr_file_abi_sizes[i]; i++) { 2924 ref_size = attr_file_abi_sizes[i] 2925 + sizeof(struct perf_file_section); 2926 if (hdr_sz != ref_size) { 2927 attr_size = bswap_64(hdr_sz); 2928 if (attr_size != ref_size) 2929 continue; 2930 2931 ph->needs_swap = true; 2932 } 2933 pr_debug("ABI%d perf.data file detected, need_swap=%d\n", 2934 i, 2935 ph->needs_swap); 2936 return 0; 2937 } 2938 /* could not determine endianness */ 2939 return -1; 2940 } 2941 2942 #define PERF_PIPE_HDR_VER0 16 2943 2944 static const size_t attr_pipe_abi_sizes[] = { 2945 [0] = PERF_PIPE_HDR_VER0, 2946 0, 2947 }; 2948 2949 /* 2950 * In the legacy pipe format, there is an implicit assumption that endiannesss 2951 * between host recording the samples, and host parsing the samples is the 2952 * same. This is not always the case given that the pipe output may always be 2953 * redirected into a file and analyzed on a different machine with possibly a 2954 * different endianness and perf_event ABI revsions in the perf tool itself. 2955 */ 2956 static int try_all_pipe_abis(uint64_t hdr_sz, struct perf_header *ph) 2957 { 2958 u64 attr_size; 2959 int i; 2960 2961 for (i = 0 ; attr_pipe_abi_sizes[i]; i++) { 2962 if (hdr_sz != attr_pipe_abi_sizes[i]) { 2963 attr_size = bswap_64(hdr_sz); 2964 if (attr_size != hdr_sz) 2965 continue; 2966 2967 ph->needs_swap = true; 2968 } 2969 pr_debug("Pipe ABI%d perf.data file detected\n", i); 2970 return 0; 2971 } 2972 return -1; 2973 } 2974 2975 bool is_perf_magic(u64 magic) 2976 { 2977 if (!memcmp(&magic, __perf_magic1, sizeof(magic)) 2978 || magic == __perf_magic2 2979 || magic == __perf_magic2_sw) 2980 return true; 2981 2982 return false; 2983 } 2984 2985 static int check_magic_endian(u64 magic, uint64_t hdr_sz, 2986 bool is_pipe, struct perf_header *ph) 2987 { 2988 int ret; 2989 2990 /* check for legacy format */ 2991 ret = memcmp(&magic, __perf_magic1, sizeof(magic)); 2992 if (ret == 0) { 2993 ph->version = PERF_HEADER_VERSION_1; 2994 pr_debug("legacy perf.data format\n"); 2995 if (is_pipe) 2996 return try_all_pipe_abis(hdr_sz, ph); 2997 2998 return try_all_file_abis(hdr_sz, ph); 2999 } 3000 /* 3001 * the new magic number serves two purposes: 3002 * - unique number to identify actual perf.data files 3003 * - encode endianness of file 3004 */ 3005 ph->version = PERF_HEADER_VERSION_2; 3006 3007 /* check magic number with one endianness */ 3008 if (magic == __perf_magic2) 3009 return 0; 3010 3011 /* check magic number with opposite endianness */ 3012 if (magic != __perf_magic2_sw) 3013 return -1; 3014 3015 ph->needs_swap = true; 3016 3017 return 0; 3018 } 3019 3020 int perf_file_header__read(struct perf_file_header *header, 3021 struct perf_header *ph, int fd) 3022 { 3023 ssize_t ret; 3024 3025 lseek(fd, 0, SEEK_SET); 3026 3027 ret = readn(fd, header, sizeof(*header)); 3028 if (ret <= 0) 3029 return -1; 3030 3031 if (check_magic_endian(header->magic, 3032 header->attr_size, false, ph) < 0) { 3033 pr_debug("magic/endian check failed\n"); 3034 return -1; 3035 } 3036 3037 if (ph->needs_swap) { 3038 mem_bswap_64(header, offsetof(struct perf_file_header, 3039 adds_features)); 3040 } 3041 3042 if (header->size != sizeof(*header)) { 3043 /* Support the previous format */ 3044 if (header->size == offsetof(typeof(*header), adds_features)) 3045 bitmap_zero(header->adds_features, HEADER_FEAT_BITS); 3046 else 3047 return -1; 3048 } else if (ph->needs_swap) { 3049 /* 3050 * feature bitmap is declared as an array of unsigned longs -- 3051 * not good since its size can differ between the host that 3052 * generated the data file and the host analyzing the file. 3053 * 3054 * We need to handle endianness, but we don't know the size of 3055 * the unsigned long where the file was generated. Take a best 3056 * guess at determining it: try 64-bit swap first (ie., file 3057 * created on a 64-bit host), and check if the hostname feature 3058 * bit is set (this feature bit is forced on as of fbe96f2). 3059 * If the bit is not, undo the 64-bit swap and try a 32-bit 3060 * swap. If the hostname bit is still not set (e.g., older data 3061 * file), punt and fallback to the original behavior -- 3062 * clearing all feature bits and setting buildid. 3063 */ 3064 mem_bswap_64(&header->adds_features, 3065 BITS_TO_U64(HEADER_FEAT_BITS)); 3066 3067 if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { 3068 /* unswap as u64 */ 3069 mem_bswap_64(&header->adds_features, 3070 BITS_TO_U64(HEADER_FEAT_BITS)); 3071 3072 /* unswap as u32 */ 3073 mem_bswap_32(&header->adds_features, 3074 BITS_TO_U32(HEADER_FEAT_BITS)); 3075 } 3076 3077 if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { 3078 bitmap_zero(header->adds_features, HEADER_FEAT_BITS); 3079 set_bit(HEADER_BUILD_ID, header->adds_features); 3080 } 3081 } 3082 3083 memcpy(&ph->adds_features, &header->adds_features, 3084 sizeof(ph->adds_features)); 3085 3086 ph->data_offset = header->data.offset; 3087 ph->data_size = header->data.size; 3088 ph->feat_offset = header->data.offset + header->data.size; 3089 return 0; 3090 } 3091 3092 static int perf_file_section__process(struct perf_file_section *section, 3093 struct perf_header *ph, 3094 int feat, int fd, void *data) 3095 { 3096 struct feat_fd fdd = { 3097 .fd = fd, 3098 .ph = ph, 3099 .size = section->size, 3100 .offset = section->offset, 3101 }; 3102 3103 if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { 3104 pr_debug("Failed to lseek to %" PRIu64 " offset for feature " 3105 "%d, continuing...\n", section->offset, feat); 3106 return 0; 3107 } 3108 3109 if (feat >= HEADER_LAST_FEATURE) { 3110 pr_debug("unknown feature %d, continuing...\n", feat); 3111 return 0; 3112 } 3113 3114 if (!feat_ops[feat].process) 3115 return 0; 3116 3117 return feat_ops[feat].process(&fdd, data); 3118 } 3119 3120 static int perf_file_header__read_pipe(struct perf_pipe_file_header *header, 3121 struct perf_header *ph, int fd, 3122 bool repipe) 3123 { 3124 struct feat_fd ff = { 3125 .fd = STDOUT_FILENO, 3126 .ph = ph, 3127 }; 3128 ssize_t ret; 3129 3130 ret = readn(fd, header, sizeof(*header)); 3131 if (ret <= 0) 3132 return -1; 3133 3134 if (check_magic_endian(header->magic, header->size, true, ph) < 0) { 3135 pr_debug("endian/magic failed\n"); 3136 return -1; 3137 } 3138 3139 if (ph->needs_swap) 3140 header->size = bswap_64(header->size); 3141 3142 if (repipe && do_write(&ff, header, sizeof(*header)) < 0) 3143 return -1; 3144 3145 return 0; 3146 } 3147 3148 static int perf_header__read_pipe(struct perf_session *session) 3149 { 3150 struct perf_header *header = &session->header; 3151 struct perf_pipe_file_header f_header; 3152 3153 if (perf_file_header__read_pipe(&f_header, header, 3154 perf_data__fd(session->data), 3155 session->repipe) < 0) { 3156 pr_debug("incompatible file format\n"); 3157 return -EINVAL; 3158 } 3159 3160 return 0; 3161 } 3162 3163 static int read_attr(int fd, struct perf_header *ph, 3164 struct perf_file_attr *f_attr) 3165 { 3166 struct perf_event_attr *attr = &f_attr->attr; 3167 size_t sz, left; 3168 size_t our_sz = sizeof(f_attr->attr); 3169 ssize_t ret; 3170 3171 memset(f_attr, 0, sizeof(*f_attr)); 3172 3173 /* read minimal guaranteed structure */ 3174 ret = readn(fd, attr, PERF_ATTR_SIZE_VER0); 3175 if (ret <= 0) { 3176 pr_debug("cannot read %d bytes of header attr\n", 3177 PERF_ATTR_SIZE_VER0); 3178 return -1; 3179 } 3180 3181 /* on file perf_event_attr size */ 3182 sz = attr->size; 3183 3184 if (ph->needs_swap) 3185 sz = bswap_32(sz); 3186 3187 if (sz == 0) { 3188 /* assume ABI0 */ 3189 sz = PERF_ATTR_SIZE_VER0; 3190 } else if (sz > our_sz) { 3191 pr_debug("file uses a more recent and unsupported ABI" 3192 " (%zu bytes extra)\n", sz - our_sz); 3193 return -1; 3194 } 3195 /* what we have not yet read and that we know about */ 3196 left = sz - PERF_ATTR_SIZE_VER0; 3197 if (left) { 3198 void *ptr = attr; 3199 ptr += PERF_ATTR_SIZE_VER0; 3200 3201 ret = readn(fd, ptr, left); 3202 } 3203 /* read perf_file_section, ids are read in caller */ 3204 ret = readn(fd, &f_attr->ids, sizeof(f_attr->ids)); 3205 3206 return ret <= 0 ? -1 : 0; 3207 } 3208 3209 static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel, 3210 struct pevent *pevent) 3211 { 3212 struct event_format *event; 3213 char bf[128]; 3214 3215 /* already prepared */ 3216 if (evsel->tp_format) 3217 return 0; 3218 3219 if (pevent == NULL) { 3220 pr_debug("broken or missing trace data\n"); 3221 return -1; 3222 } 3223 3224 event = pevent_find_event(pevent, evsel->attr.config); 3225 if (event == NULL) { 3226 pr_debug("cannot find event format for %d\n", (int)evsel->attr.config); 3227 return -1; 3228 } 3229 3230 if (!evsel->name) { 3231 snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); 3232 evsel->name = strdup(bf); 3233 if (evsel->name == NULL) 3234 return -1; 3235 } 3236 3237 evsel->tp_format = event; 3238 return 0; 3239 } 3240 3241 static int perf_evlist__prepare_tracepoint_events(struct perf_evlist *evlist, 3242 struct pevent *pevent) 3243 { 3244 struct perf_evsel *pos; 3245 3246 evlist__for_each_entry(evlist, pos) { 3247 if (pos->attr.type == PERF_TYPE_TRACEPOINT && 3248 perf_evsel__prepare_tracepoint_event(pos, pevent)) 3249 return -1; 3250 } 3251 3252 return 0; 3253 } 3254 3255 int perf_session__read_header(struct perf_session *session) 3256 { 3257 struct perf_data *data = session->data; 3258 struct perf_header *header = &session->header; 3259 struct perf_file_header f_header; 3260 struct perf_file_attr f_attr; 3261 u64 f_id; 3262 int nr_attrs, nr_ids, i, j; 3263 int fd = perf_data__fd(data); 3264 3265 session->evlist = perf_evlist__new(); 3266 if (session->evlist == NULL) 3267 return -ENOMEM; 3268 3269 session->evlist->env = &header->env; 3270 session->machines.host.env = &header->env; 3271 if (perf_data__is_pipe(data)) 3272 return perf_header__read_pipe(session); 3273 3274 if (perf_file_header__read(&f_header, header, fd) < 0) 3275 return -EINVAL; 3276 3277 /* 3278 * Sanity check that perf.data was written cleanly; data size is 3279 * initialized to 0 and updated only if the on_exit function is run. 3280 * If data size is still 0 then the file contains only partial 3281 * information. Just warn user and process it as much as it can. 3282 */ 3283 if (f_header.data.size == 0) { 3284 pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n" 3285 "Was the 'perf record' command properly terminated?\n", 3286 data->file.path); 3287 } 3288 3289 nr_attrs = f_header.attrs.size / f_header.attr_size; 3290 lseek(fd, f_header.attrs.offset, SEEK_SET); 3291 3292 for (i = 0; i < nr_attrs; i++) { 3293 struct perf_evsel *evsel; 3294 off_t tmp; 3295 3296 if (read_attr(fd, header, &f_attr) < 0) 3297 goto out_errno; 3298 3299 if (header->needs_swap) { 3300 f_attr.ids.size = bswap_64(f_attr.ids.size); 3301 f_attr.ids.offset = bswap_64(f_attr.ids.offset); 3302 perf_event__attr_swap(&f_attr.attr); 3303 } 3304 3305 tmp = lseek(fd, 0, SEEK_CUR); 3306 evsel = perf_evsel__new(&f_attr.attr); 3307 3308 if (evsel == NULL) 3309 goto out_delete_evlist; 3310 3311 evsel->needs_swap = header->needs_swap; 3312 /* 3313 * Do it before so that if perf_evsel__alloc_id fails, this 3314 * entry gets purged too at perf_evlist__delete(). 3315 */ 3316 perf_evlist__add(session->evlist, evsel); 3317 3318 nr_ids = f_attr.ids.size / sizeof(u64); 3319 /* 3320 * We don't have the cpu and thread maps on the header, so 3321 * for allocating the perf_sample_id table we fake 1 cpu and 3322 * hattr->ids threads. 3323 */ 3324 if (perf_evsel__alloc_id(evsel, 1, nr_ids)) 3325 goto out_delete_evlist; 3326 3327 lseek(fd, f_attr.ids.offset, SEEK_SET); 3328 3329 for (j = 0; j < nr_ids; j++) { 3330 if (perf_header__getbuffer64(header, fd, &f_id, sizeof(f_id))) 3331 goto out_errno; 3332 3333 perf_evlist__id_add(session->evlist, evsel, 0, j, f_id); 3334 } 3335 3336 lseek(fd, tmp, SEEK_SET); 3337 } 3338 3339 perf_header__process_sections(header, fd, &session->tevent, 3340 perf_file_section__process); 3341 3342 if (perf_evlist__prepare_tracepoint_events(session->evlist, 3343 session->tevent.pevent)) 3344 goto out_delete_evlist; 3345 3346 return 0; 3347 out_errno: 3348 return -errno; 3349 3350 out_delete_evlist: 3351 perf_evlist__delete(session->evlist); 3352 session->evlist = NULL; 3353 return -ENOMEM; 3354 } 3355 3356 int perf_event__synthesize_attr(struct perf_tool *tool, 3357 struct perf_event_attr *attr, u32 ids, u64 *id, 3358 perf_event__handler_t process) 3359 { 3360 union perf_event *ev; 3361 size_t size; 3362 int err; 3363 3364 size = sizeof(struct perf_event_attr); 3365 size = PERF_ALIGN(size, sizeof(u64)); 3366 size += sizeof(struct perf_event_header); 3367 size += ids * sizeof(u64); 3368 3369 ev = malloc(size); 3370 3371 if (ev == NULL) 3372 return -ENOMEM; 3373 3374 ev->attr.attr = *attr; 3375 memcpy(ev->attr.id, id, ids * sizeof(u64)); 3376 3377 ev->attr.header.type = PERF_RECORD_HEADER_ATTR; 3378 ev->attr.header.size = (u16)size; 3379 3380 if (ev->attr.header.size == size) 3381 err = process(tool, ev, NULL, NULL); 3382 else 3383 err = -E2BIG; 3384 3385 free(ev); 3386 3387 return err; 3388 } 3389 3390 int perf_event__synthesize_features(struct perf_tool *tool, 3391 struct perf_session *session, 3392 struct perf_evlist *evlist, 3393 perf_event__handler_t process) 3394 { 3395 struct perf_header *header = &session->header; 3396 struct feat_fd ff; 3397 struct feature_event *fe; 3398 size_t sz, sz_hdr; 3399 int feat, ret; 3400 3401 sz_hdr = sizeof(fe->header); 3402 sz = sizeof(union perf_event); 3403 /* get a nice alignment */ 3404 sz = PERF_ALIGN(sz, page_size); 3405 3406 memset(&ff, 0, sizeof(ff)); 3407 3408 ff.buf = malloc(sz); 3409 if (!ff.buf) 3410 return -ENOMEM; 3411 3412 ff.size = sz - sz_hdr; 3413 3414 for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) { 3415 if (!feat_ops[feat].synthesize) { 3416 pr_debug("No record header feature for header :%d\n", feat); 3417 continue; 3418 } 3419 3420 ff.offset = sizeof(*fe); 3421 3422 ret = feat_ops[feat].write(&ff, evlist); 3423 if (ret || ff.offset <= (ssize_t)sizeof(*fe)) { 3424 pr_debug("Error writing feature\n"); 3425 continue; 3426 } 3427 /* ff.buf may have changed due to realloc in do_write() */ 3428 fe = ff.buf; 3429 memset(fe, 0, sizeof(*fe)); 3430 3431 fe->feat_id = feat; 3432 fe->header.type = PERF_RECORD_HEADER_FEATURE; 3433 fe->header.size = ff.offset; 3434 3435 ret = process(tool, ff.buf, NULL, NULL); 3436 if (ret) { 3437 free(ff.buf); 3438 return ret; 3439 } 3440 } 3441 3442 /* Send HEADER_LAST_FEATURE mark. */ 3443 fe = ff.buf; 3444 fe->feat_id = HEADER_LAST_FEATURE; 3445 fe->header.type = PERF_RECORD_HEADER_FEATURE; 3446 fe->header.size = sizeof(*fe); 3447 3448 ret = process(tool, ff.buf, NULL, NULL); 3449 3450 free(ff.buf); 3451 return ret; 3452 } 3453 3454 int perf_event__process_feature(struct perf_tool *tool, 3455 union perf_event *event, 3456 struct perf_session *session __maybe_unused) 3457 { 3458 struct feat_fd ff = { .fd = 0 }; 3459 struct feature_event *fe = (struct feature_event *)event; 3460 int type = fe->header.type; 3461 u64 feat = fe->feat_id; 3462 3463 if (type < 0 || type >= PERF_RECORD_HEADER_MAX) { 3464 pr_warning("invalid record type %d in pipe-mode\n", type); 3465 return 0; 3466 } 3467 if (feat == HEADER_RESERVED || feat >= HEADER_LAST_FEATURE) { 3468 pr_warning("invalid record type %d in pipe-mode\n", type); 3469 return -1; 3470 } 3471 3472 if (!feat_ops[feat].process) 3473 return 0; 3474 3475 ff.buf = (void *)fe->data; 3476 ff.size = event->header.size - sizeof(event->header); 3477 ff.ph = &session->header; 3478 3479 if (feat_ops[feat].process(&ff, NULL)) 3480 return -1; 3481 3482 if (!feat_ops[feat].print || !tool->show_feat_hdr) 3483 return 0; 3484 3485 if (!feat_ops[feat].full_only || 3486 tool->show_feat_hdr >= SHOW_FEAT_HEADER_FULL_INFO) { 3487 feat_ops[feat].print(&ff, stdout); 3488 } else { 3489 fprintf(stdout, "# %s info available, use -I to display\n", 3490 feat_ops[feat].name); 3491 } 3492 3493 return 0; 3494 } 3495 3496 static struct event_update_event * 3497 event_update_event__new(size_t size, u64 type, u64 id) 3498 { 3499 struct event_update_event *ev; 3500 3501 size += sizeof(*ev); 3502 size = PERF_ALIGN(size, sizeof(u64)); 3503 3504 ev = zalloc(size); 3505 if (ev) { 3506 ev->header.type = PERF_RECORD_EVENT_UPDATE; 3507 ev->header.size = (u16)size; 3508 ev->type = type; 3509 ev->id = id; 3510 } 3511 return ev; 3512 } 3513 3514 int 3515 perf_event__synthesize_event_update_unit(struct perf_tool *tool, 3516 struct perf_evsel *evsel, 3517 perf_event__handler_t process) 3518 { 3519 struct event_update_event *ev; 3520 size_t size = strlen(evsel->unit); 3521 int err; 3522 3523 ev = event_update_event__new(size + 1, PERF_EVENT_UPDATE__UNIT, evsel->id[0]); 3524 if (ev == NULL) 3525 return -ENOMEM; 3526 3527 strncpy(ev->data, evsel->unit, size); 3528 err = process(tool, (union perf_event *)ev, NULL, NULL); 3529 free(ev); 3530 return err; 3531 } 3532 3533 int 3534 perf_event__synthesize_event_update_scale(struct perf_tool *tool, 3535 struct perf_evsel *evsel, 3536 perf_event__handler_t process) 3537 { 3538 struct event_update_event *ev; 3539 struct event_update_event_scale *ev_data; 3540 int err; 3541 3542 ev = event_update_event__new(sizeof(*ev_data), PERF_EVENT_UPDATE__SCALE, evsel->id[0]); 3543 if (ev == NULL) 3544 return -ENOMEM; 3545 3546 ev_data = (struct event_update_event_scale *) ev->data; 3547 ev_data->scale = evsel->scale; 3548 err = process(tool, (union perf_event*) ev, NULL, NULL); 3549 free(ev); 3550 return err; 3551 } 3552 3553 int 3554 perf_event__synthesize_event_update_name(struct perf_tool *tool, 3555 struct perf_evsel *evsel, 3556 perf_event__handler_t process) 3557 { 3558 struct event_update_event *ev; 3559 size_t len = strlen(evsel->name); 3560 int err; 3561 3562 ev = event_update_event__new(len + 1, PERF_EVENT_UPDATE__NAME, evsel->id[0]); 3563 if (ev == NULL) 3564 return -ENOMEM; 3565 3566 strncpy(ev->data, evsel->name, len); 3567 err = process(tool, (union perf_event*) ev, NULL, NULL); 3568 free(ev); 3569 return err; 3570 } 3571 3572 int 3573 perf_event__synthesize_event_update_cpus(struct perf_tool *tool, 3574 struct perf_evsel *evsel, 3575 perf_event__handler_t process) 3576 { 3577 size_t size = sizeof(struct event_update_event); 3578 struct event_update_event *ev; 3579 int max, err; 3580 u16 type; 3581 3582 if (!evsel->own_cpus) 3583 return 0; 3584 3585 ev = cpu_map_data__alloc(evsel->own_cpus, &size, &type, &max); 3586 if (!ev) 3587 return -ENOMEM; 3588 3589 ev->header.type = PERF_RECORD_EVENT_UPDATE; 3590 ev->header.size = (u16)size; 3591 ev->type = PERF_EVENT_UPDATE__CPUS; 3592 ev->id = evsel->id[0]; 3593 3594 cpu_map_data__synthesize((struct cpu_map_data *) ev->data, 3595 evsel->own_cpus, 3596 type, max); 3597 3598 err = process(tool, (union perf_event*) ev, NULL, NULL); 3599 free(ev); 3600 return err; 3601 } 3602 3603 size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp) 3604 { 3605 struct event_update_event *ev = &event->event_update; 3606 struct event_update_event_scale *ev_scale; 3607 struct event_update_event_cpus *ev_cpus; 3608 struct cpu_map *map; 3609 size_t ret; 3610 3611 ret = fprintf(fp, "\n... id: %" PRIu64 "\n", ev->id); 3612 3613 switch (ev->type) { 3614 case PERF_EVENT_UPDATE__SCALE: 3615 ev_scale = (struct event_update_event_scale *) ev->data; 3616 ret += fprintf(fp, "... scale: %f\n", ev_scale->scale); 3617 break; 3618 case PERF_EVENT_UPDATE__UNIT: 3619 ret += fprintf(fp, "... unit: %s\n", ev->data); 3620 break; 3621 case PERF_EVENT_UPDATE__NAME: 3622 ret += fprintf(fp, "... name: %s\n", ev->data); 3623 break; 3624 case PERF_EVENT_UPDATE__CPUS: 3625 ev_cpus = (struct event_update_event_cpus *) ev->data; 3626 ret += fprintf(fp, "... "); 3627 3628 map = cpu_map__new_data(&ev_cpus->cpus); 3629 if (map) 3630 ret += cpu_map__fprintf(map, fp); 3631 else 3632 ret += fprintf(fp, "failed to get cpus\n"); 3633 break; 3634 default: 3635 ret += fprintf(fp, "... unknown type\n"); 3636 break; 3637 } 3638 3639 return ret; 3640 } 3641 3642 int perf_event__synthesize_attrs(struct perf_tool *tool, 3643 struct perf_session *session, 3644 perf_event__handler_t process) 3645 { 3646 struct perf_evsel *evsel; 3647 int err = 0; 3648 3649 evlist__for_each_entry(session->evlist, evsel) { 3650 err = perf_event__synthesize_attr(tool, &evsel->attr, evsel->ids, 3651 evsel->id, process); 3652 if (err) { 3653 pr_debug("failed to create perf header attribute\n"); 3654 return err; 3655 } 3656 } 3657 3658 return err; 3659 } 3660 3661 static bool has_unit(struct perf_evsel *counter) 3662 { 3663 return counter->unit && *counter->unit; 3664 } 3665 3666 static bool has_scale(struct perf_evsel *counter) 3667 { 3668 return counter->scale != 1; 3669 } 3670 3671 int perf_event__synthesize_extra_attr(struct perf_tool *tool, 3672 struct perf_evlist *evsel_list, 3673 perf_event__handler_t process, 3674 bool is_pipe) 3675 { 3676 struct perf_evsel *counter; 3677 int err; 3678 3679 /* 3680 * Synthesize other events stuff not carried within 3681 * attr event - unit, scale, name 3682 */ 3683 evlist__for_each_entry(evsel_list, counter) { 3684 if (!counter->supported) 3685 continue; 3686 3687 /* 3688 * Synthesize unit and scale only if it's defined. 3689 */ 3690 if (has_unit(counter)) { 3691 err = perf_event__synthesize_event_update_unit(tool, counter, process); 3692 if (err < 0) { 3693 pr_err("Couldn't synthesize evsel unit.\n"); 3694 return err; 3695 } 3696 } 3697 3698 if (has_scale(counter)) { 3699 err = perf_event__synthesize_event_update_scale(tool, counter, process); 3700 if (err < 0) { 3701 pr_err("Couldn't synthesize evsel counter.\n"); 3702 return err; 3703 } 3704 } 3705 3706 if (counter->own_cpus) { 3707 err = perf_event__synthesize_event_update_cpus(tool, counter, process); 3708 if (err < 0) { 3709 pr_err("Couldn't synthesize evsel cpus.\n"); 3710 return err; 3711 } 3712 } 3713 3714 /* 3715 * Name is needed only for pipe output, 3716 * perf.data carries event names. 3717 */ 3718 if (is_pipe) { 3719 err = perf_event__synthesize_event_update_name(tool, counter, process); 3720 if (err < 0) { 3721 pr_err("Couldn't synthesize evsel name.\n"); 3722 return err; 3723 } 3724 } 3725 } 3726 return 0; 3727 } 3728 3729 int perf_event__process_attr(struct perf_tool *tool __maybe_unused, 3730 union perf_event *event, 3731 struct perf_evlist **pevlist) 3732 { 3733 u32 i, ids, n_ids; 3734 struct perf_evsel *evsel; 3735 struct perf_evlist *evlist = *pevlist; 3736 3737 if (evlist == NULL) { 3738 *pevlist = evlist = perf_evlist__new(); 3739 if (evlist == NULL) 3740 return -ENOMEM; 3741 } 3742 3743 evsel = perf_evsel__new(&event->attr.attr); 3744 if (evsel == NULL) 3745 return -ENOMEM; 3746 3747 perf_evlist__add(evlist, evsel); 3748 3749 ids = event->header.size; 3750 ids -= (void *)&event->attr.id - (void *)event; 3751 n_ids = ids / sizeof(u64); 3752 /* 3753 * We don't have the cpu and thread maps on the header, so 3754 * for allocating the perf_sample_id table we fake 1 cpu and 3755 * hattr->ids threads. 3756 */ 3757 if (perf_evsel__alloc_id(evsel, 1, n_ids)) 3758 return -ENOMEM; 3759 3760 for (i = 0; i < n_ids; i++) { 3761 perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]); 3762 } 3763 3764 return 0; 3765 } 3766 3767 int perf_event__process_event_update(struct perf_tool *tool __maybe_unused, 3768 union perf_event *event, 3769 struct perf_evlist **pevlist) 3770 { 3771 struct event_update_event *ev = &event->event_update; 3772 struct event_update_event_scale *ev_scale; 3773 struct event_update_event_cpus *ev_cpus; 3774 struct perf_evlist *evlist; 3775 struct perf_evsel *evsel; 3776 struct cpu_map *map; 3777 3778 if (!pevlist || *pevlist == NULL) 3779 return -EINVAL; 3780 3781 evlist = *pevlist; 3782 3783 evsel = perf_evlist__id2evsel(evlist, ev->id); 3784 if (evsel == NULL) 3785 return -EINVAL; 3786 3787 switch (ev->type) { 3788 case PERF_EVENT_UPDATE__UNIT: 3789 evsel->unit = strdup(ev->data); 3790 break; 3791 case PERF_EVENT_UPDATE__NAME: 3792 evsel->name = strdup(ev->data); 3793 break; 3794 case PERF_EVENT_UPDATE__SCALE: 3795 ev_scale = (struct event_update_event_scale *) ev->data; 3796 evsel->scale = ev_scale->scale; 3797 break; 3798 case PERF_EVENT_UPDATE__CPUS: 3799 ev_cpus = (struct event_update_event_cpus *) ev->data; 3800 3801 map = cpu_map__new_data(&ev_cpus->cpus); 3802 if (map) 3803 evsel->own_cpus = map; 3804 else 3805 pr_err("failed to get event_update cpus\n"); 3806 default: 3807 break; 3808 } 3809 3810 return 0; 3811 } 3812 3813 int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, 3814 struct perf_evlist *evlist, 3815 perf_event__handler_t process) 3816 { 3817 union perf_event ev; 3818 struct tracing_data *tdata; 3819 ssize_t size = 0, aligned_size = 0, padding; 3820 struct feat_fd ff; 3821 int err __maybe_unused = 0; 3822 3823 /* 3824 * We are going to store the size of the data followed 3825 * by the data contents. Since the fd descriptor is a pipe, 3826 * we cannot seek back to store the size of the data once 3827 * we know it. Instead we: 3828 * 3829 * - write the tracing data to the temp file 3830 * - get/write the data size to pipe 3831 * - write the tracing data from the temp file 3832 * to the pipe 3833 */ 3834 tdata = tracing_data_get(&evlist->entries, fd, true); 3835 if (!tdata) 3836 return -1; 3837 3838 memset(&ev, 0, sizeof(ev)); 3839 3840 ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA; 3841 size = tdata->size; 3842 aligned_size = PERF_ALIGN(size, sizeof(u64)); 3843 padding = aligned_size - size; 3844 ev.tracing_data.header.size = sizeof(ev.tracing_data); 3845 ev.tracing_data.size = aligned_size; 3846 3847 process(tool, &ev, NULL, NULL); 3848 3849 /* 3850 * The put function will copy all the tracing data 3851 * stored in temp file to the pipe. 3852 */ 3853 tracing_data_put(tdata); 3854 3855 ff = (struct feat_fd){ .fd = fd }; 3856 if (write_padded(&ff, NULL, 0, padding)) 3857 return -1; 3858 3859 return aligned_size; 3860 } 3861 3862 int perf_event__process_tracing_data(struct perf_tool *tool __maybe_unused, 3863 union perf_event *event, 3864 struct perf_session *session) 3865 { 3866 ssize_t size_read, padding, size = event->tracing_data.size; 3867 int fd = perf_data__fd(session->data); 3868 off_t offset = lseek(fd, 0, SEEK_CUR); 3869 char buf[BUFSIZ]; 3870 3871 /* setup for reading amidst mmap */ 3872 lseek(fd, offset + sizeof(struct tracing_data_event), 3873 SEEK_SET); 3874 3875 size_read = trace_report(fd, &session->tevent, 3876 session->repipe); 3877 padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read; 3878 3879 if (readn(fd, buf, padding) < 0) { 3880 pr_err("%s: reading input file", __func__); 3881 return -1; 3882 } 3883 if (session->repipe) { 3884 int retw = write(STDOUT_FILENO, buf, padding); 3885 if (retw <= 0 || retw != padding) { 3886 pr_err("%s: repiping tracing data padding", __func__); 3887 return -1; 3888 } 3889 } 3890 3891 if (size_read + padding != size) { 3892 pr_err("%s: tracing data size mismatch", __func__); 3893 return -1; 3894 } 3895 3896 perf_evlist__prepare_tracepoint_events(session->evlist, 3897 session->tevent.pevent); 3898 3899 return size_read + padding; 3900 } 3901 3902 int perf_event__synthesize_build_id(struct perf_tool *tool, 3903 struct dso *pos, u16 misc, 3904 perf_event__handler_t process, 3905 struct machine *machine) 3906 { 3907 union perf_event ev; 3908 size_t len; 3909 int err = 0; 3910 3911 if (!pos->hit) 3912 return err; 3913 3914 memset(&ev, 0, sizeof(ev)); 3915 3916 len = pos->long_name_len + 1; 3917 len = PERF_ALIGN(len, NAME_ALIGN); 3918 memcpy(&ev.build_id.build_id, pos->build_id, sizeof(pos->build_id)); 3919 ev.build_id.header.type = PERF_RECORD_HEADER_BUILD_ID; 3920 ev.build_id.header.misc = misc; 3921 ev.build_id.pid = machine->pid; 3922 ev.build_id.header.size = sizeof(ev.build_id) + len; 3923 memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); 3924 3925 err = process(tool, &ev, NULL, machine); 3926 3927 return err; 3928 } 3929 3930 int perf_event__process_build_id(struct perf_tool *tool __maybe_unused, 3931 union perf_event *event, 3932 struct perf_session *session) 3933 { 3934 __event_process_build_id(&event->build_id, 3935 event->build_id.filename, 3936 session); 3937 return 0; 3938 } 3939