1 #include "util.h" 2 #include <sys/types.h> 3 #include <byteswap.h> 4 #include <unistd.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <linux/list.h> 8 #include <linux/kernel.h> 9 #include <linux/bitops.h> 10 #include <sys/utsname.h> 11 12 #include "evlist.h" 13 #include "evsel.h" 14 #include "header.h" 15 #include "../perf.h" 16 #include "trace-event.h" 17 #include "session.h" 18 #include "symbol.h" 19 #include "debug.h" 20 #include "cpumap.h" 21 #include "pmu.h" 22 #include "vdso.h" 23 #include "strbuf.h" 24 #include "build-id.h" 25 #include "data.h" 26 27 static u32 header_argc; 28 static const char **header_argv; 29 30 /* 31 * magic2 = "PERFILE2" 32 * must be a numerical value to let the endianness 33 * determine the memory layout. That way we are able 34 * to detect endianness when reading the perf.data file 35 * back. 36 * 37 * we check for legacy (PERFFILE) format. 38 */ 39 static const char *__perf_magic1 = "PERFFILE"; 40 static const u64 __perf_magic2 = 0x32454c4946524550ULL; 41 static const u64 __perf_magic2_sw = 0x50455246494c4532ULL; 42 43 #define PERF_MAGIC __perf_magic2 44 45 struct perf_file_attr { 46 struct perf_event_attr attr; 47 struct perf_file_section ids; 48 }; 49 50 void perf_header__set_feat(struct perf_header *header, int feat) 51 { 52 set_bit(feat, header->adds_features); 53 } 54 55 void perf_header__clear_feat(struct perf_header *header, int feat) 56 { 57 clear_bit(feat, header->adds_features); 58 } 59 60 bool perf_header__has_feat(const struct perf_header *header, int feat) 61 { 62 return test_bit(feat, header->adds_features); 63 } 64 65 static int do_write(int fd, const void *buf, size_t size) 66 { 67 while (size) { 68 int ret = write(fd, buf, size); 69 70 if (ret < 0) 71 return -errno; 72 73 size -= ret; 74 buf += ret; 75 } 76 77 return 0; 78 } 79 80 int write_padded(int fd, const void *bf, size_t count, size_t count_aligned) 81 { 82 static const char zero_buf[NAME_ALIGN]; 83 int err = do_write(fd, bf, count); 84 85 if (!err) 86 err = do_write(fd, zero_buf, count_aligned - count); 87 88 return err; 89 } 90 91 #define string_size(str) \ 92 (PERF_ALIGN((strlen(str) + 1), NAME_ALIGN) + sizeof(u32)) 93 94 static int do_write_string(int fd, const char *str) 95 { 96 u32 len, olen; 97 int ret; 98 99 olen = strlen(str) + 1; 100 len = PERF_ALIGN(olen, NAME_ALIGN); 101 102 /* write len, incl. \0 */ 103 ret = do_write(fd, &len, sizeof(len)); 104 if (ret < 0) 105 return ret; 106 107 return write_padded(fd, str, olen, len); 108 } 109 110 static char *do_read_string(int fd, struct perf_header *ph) 111 { 112 ssize_t sz, ret; 113 u32 len; 114 char *buf; 115 116 sz = readn(fd, &len, sizeof(len)); 117 if (sz < (ssize_t)sizeof(len)) 118 return NULL; 119 120 if (ph->needs_swap) 121 len = bswap_32(len); 122 123 buf = malloc(len); 124 if (!buf) 125 return NULL; 126 127 ret = readn(fd, buf, len); 128 if (ret == (ssize_t)len) { 129 /* 130 * strings are padded by zeroes 131 * thus the actual strlen of buf 132 * may be less than len 133 */ 134 return buf; 135 } 136 137 free(buf); 138 return NULL; 139 } 140 141 int 142 perf_header__set_cmdline(int argc, const char **argv) 143 { 144 int i; 145 146 /* 147 * If header_argv has already been set, do not override it. 148 * This allows a command to set the cmdline, parse args and 149 * then call another builtin function that implements a 150 * command -- e.g, cmd_kvm calling cmd_record. 151 */ 152 if (header_argv) 153 return 0; 154 155 header_argc = (u32)argc; 156 157 /* do not include NULL termination */ 158 header_argv = calloc(argc, sizeof(char *)); 159 if (!header_argv) 160 return -ENOMEM; 161 162 /* 163 * must copy argv contents because it gets moved 164 * around during option parsing 165 */ 166 for (i = 0; i < argc ; i++) 167 header_argv[i] = argv[i]; 168 169 return 0; 170 } 171 172 static int write_tracing_data(int fd, struct perf_header *h __maybe_unused, 173 struct perf_evlist *evlist) 174 { 175 return read_tracing_data(fd, &evlist->entries); 176 } 177 178 179 static int write_build_id(int fd, struct perf_header *h, 180 struct perf_evlist *evlist __maybe_unused) 181 { 182 struct perf_session *session; 183 int err; 184 185 session = container_of(h, struct perf_session, header); 186 187 if (!perf_session__read_build_ids(session, true)) 188 return -1; 189 190 err = perf_session__write_buildid_table(session, fd); 191 if (err < 0) { 192 pr_debug("failed to write buildid table\n"); 193 return err; 194 } 195 perf_session__cache_build_ids(session); 196 197 return 0; 198 } 199 200 static int write_hostname(int fd, struct perf_header *h __maybe_unused, 201 struct perf_evlist *evlist __maybe_unused) 202 { 203 struct utsname uts; 204 int ret; 205 206 ret = uname(&uts); 207 if (ret < 0) 208 return -1; 209 210 return do_write_string(fd, uts.nodename); 211 } 212 213 static int write_osrelease(int fd, struct perf_header *h __maybe_unused, 214 struct perf_evlist *evlist __maybe_unused) 215 { 216 struct utsname uts; 217 int ret; 218 219 ret = uname(&uts); 220 if (ret < 0) 221 return -1; 222 223 return do_write_string(fd, uts.release); 224 } 225 226 static int write_arch(int fd, struct perf_header *h __maybe_unused, 227 struct perf_evlist *evlist __maybe_unused) 228 { 229 struct utsname uts; 230 int ret; 231 232 ret = uname(&uts); 233 if (ret < 0) 234 return -1; 235 236 return do_write_string(fd, uts.machine); 237 } 238 239 static int write_version(int fd, struct perf_header *h __maybe_unused, 240 struct perf_evlist *evlist __maybe_unused) 241 { 242 return do_write_string(fd, perf_version_string); 243 } 244 245 static int __write_cpudesc(int fd, const char *cpuinfo_proc) 246 { 247 FILE *file; 248 char *buf = NULL; 249 char *s, *p; 250 const char *search = cpuinfo_proc; 251 size_t len = 0; 252 int ret = -1; 253 254 if (!search) 255 return -1; 256 257 file = fopen("/proc/cpuinfo", "r"); 258 if (!file) 259 return -1; 260 261 while (getline(&buf, &len, file) > 0) { 262 ret = strncmp(buf, search, strlen(search)); 263 if (!ret) 264 break; 265 } 266 267 if (ret) { 268 ret = -1; 269 goto done; 270 } 271 272 s = buf; 273 274 p = strchr(buf, ':'); 275 if (p && *(p+1) == ' ' && *(p+2)) 276 s = p + 2; 277 p = strchr(s, '\n'); 278 if (p) 279 *p = '\0'; 280 281 /* squash extra space characters (branding string) */ 282 p = s; 283 while (*p) { 284 if (isspace(*p)) { 285 char *r = p + 1; 286 char *q = r; 287 *p = ' '; 288 while (*q && isspace(*q)) 289 q++; 290 if (q != (p+1)) 291 while ((*r++ = *q++)); 292 } 293 p++; 294 } 295 ret = do_write_string(fd, s); 296 done: 297 free(buf); 298 fclose(file); 299 return ret; 300 } 301 302 static int write_cpudesc(int fd, struct perf_header *h __maybe_unused, 303 struct perf_evlist *evlist __maybe_unused) 304 { 305 #ifndef CPUINFO_PROC 306 #define CPUINFO_PROC {"model name", } 307 #endif 308 const char *cpuinfo_procs[] = CPUINFO_PROC; 309 unsigned int i; 310 311 for (i = 0; i < ARRAY_SIZE(cpuinfo_procs); i++) { 312 int ret; 313 ret = __write_cpudesc(fd, cpuinfo_procs[i]); 314 if (ret >= 0) 315 return ret; 316 } 317 return -1; 318 } 319 320 321 static int write_nrcpus(int fd, struct perf_header *h __maybe_unused, 322 struct perf_evlist *evlist __maybe_unused) 323 { 324 long nr; 325 u32 nrc, nra; 326 int ret; 327 328 nr = sysconf(_SC_NPROCESSORS_CONF); 329 if (nr < 0) 330 return -1; 331 332 nrc = (u32)(nr & UINT_MAX); 333 334 nr = sysconf(_SC_NPROCESSORS_ONLN); 335 if (nr < 0) 336 return -1; 337 338 nra = (u32)(nr & UINT_MAX); 339 340 ret = do_write(fd, &nrc, sizeof(nrc)); 341 if (ret < 0) 342 return ret; 343 344 return do_write(fd, &nra, sizeof(nra)); 345 } 346 347 static int write_event_desc(int fd, struct perf_header *h __maybe_unused, 348 struct perf_evlist *evlist) 349 { 350 struct perf_evsel *evsel; 351 u32 nre, nri, sz; 352 int ret; 353 354 nre = evlist->nr_entries; 355 356 /* 357 * write number of events 358 */ 359 ret = do_write(fd, &nre, sizeof(nre)); 360 if (ret < 0) 361 return ret; 362 363 /* 364 * size of perf_event_attr struct 365 */ 366 sz = (u32)sizeof(evsel->attr); 367 ret = do_write(fd, &sz, sizeof(sz)); 368 if (ret < 0) 369 return ret; 370 371 evlist__for_each(evlist, evsel) { 372 ret = do_write(fd, &evsel->attr, sz); 373 if (ret < 0) 374 return ret; 375 /* 376 * write number of unique id per event 377 * there is one id per instance of an event 378 * 379 * copy into an nri to be independent of the 380 * type of ids, 381 */ 382 nri = evsel->ids; 383 ret = do_write(fd, &nri, sizeof(nri)); 384 if (ret < 0) 385 return ret; 386 387 /* 388 * write event string as passed on cmdline 389 */ 390 ret = do_write_string(fd, perf_evsel__name(evsel)); 391 if (ret < 0) 392 return ret; 393 /* 394 * write unique ids for this event 395 */ 396 ret = do_write(fd, evsel->id, evsel->ids * sizeof(u64)); 397 if (ret < 0) 398 return ret; 399 } 400 return 0; 401 } 402 403 static int write_cmdline(int fd, struct perf_header *h __maybe_unused, 404 struct perf_evlist *evlist __maybe_unused) 405 { 406 char buf[MAXPATHLEN]; 407 char proc[32]; 408 u32 i, n; 409 int ret; 410 411 /* 412 * actual atual path to perf binary 413 */ 414 sprintf(proc, "/proc/%d/exe", getpid()); 415 ret = readlink(proc, buf, sizeof(buf)); 416 if (ret <= 0) 417 return -1; 418 419 /* readlink() does not add null termination */ 420 buf[ret] = '\0'; 421 422 /* account for binary path */ 423 n = header_argc + 1; 424 425 ret = do_write(fd, &n, sizeof(n)); 426 if (ret < 0) 427 return ret; 428 429 ret = do_write_string(fd, buf); 430 if (ret < 0) 431 return ret; 432 433 for (i = 0 ; i < header_argc; i++) { 434 ret = do_write_string(fd, header_argv[i]); 435 if (ret < 0) 436 return ret; 437 } 438 return 0; 439 } 440 441 #define CORE_SIB_FMT \ 442 "/sys/devices/system/cpu/cpu%d/topology/core_siblings_list" 443 #define THRD_SIB_FMT \ 444 "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list" 445 446 struct cpu_topo { 447 u32 cpu_nr; 448 u32 core_sib; 449 u32 thread_sib; 450 char **core_siblings; 451 char **thread_siblings; 452 int *core_id; 453 int *phy_pkg_id; 454 }; 455 456 static int build_cpu_topo(struct cpu_topo *tp, int cpu) 457 { 458 FILE *fp; 459 char filename[MAXPATHLEN]; 460 char *buf = NULL, *p; 461 size_t len = 0; 462 ssize_t sret; 463 u32 i = 0; 464 int ret = -1; 465 466 sprintf(filename, CORE_SIB_FMT, cpu); 467 fp = fopen(filename, "r"); 468 if (!fp) 469 goto try_threads; 470 471 sret = getline(&buf, &len, fp); 472 fclose(fp); 473 if (sret <= 0) 474 goto try_threads; 475 476 p = strchr(buf, '\n'); 477 if (p) 478 *p = '\0'; 479 480 for (i = 0; i < tp->core_sib; i++) { 481 if (!strcmp(buf, tp->core_siblings[i])) 482 break; 483 } 484 if (i == tp->core_sib) { 485 tp->core_siblings[i] = buf; 486 tp->core_sib++; 487 buf = NULL; 488 len = 0; 489 } 490 ret = 0; 491 492 try_threads: 493 sprintf(filename, THRD_SIB_FMT, cpu); 494 fp = fopen(filename, "r"); 495 if (!fp) 496 goto done; 497 498 if (getline(&buf, &len, fp) <= 0) 499 goto done; 500 501 p = strchr(buf, '\n'); 502 if (p) 503 *p = '\0'; 504 505 for (i = 0; i < tp->thread_sib; i++) { 506 if (!strcmp(buf, tp->thread_siblings[i])) 507 break; 508 } 509 if (i == tp->thread_sib) { 510 tp->thread_siblings[i] = buf; 511 tp->thread_sib++; 512 buf = NULL; 513 } 514 ret = 0; 515 done: 516 tp->core_id[cpu] = cpu_map__get_core_id(cpu); 517 tp->phy_pkg_id[cpu] = cpu_map__get_socket_id(cpu); 518 519 if(fp) 520 fclose(fp); 521 free(buf); 522 return ret; 523 } 524 525 static void free_cpu_topo(struct cpu_topo *tp) 526 { 527 u32 i; 528 529 if (!tp) 530 return; 531 532 for (i = 0 ; i < tp->core_sib; i++) 533 zfree(&tp->core_siblings[i]); 534 535 for (i = 0 ; i < tp->thread_sib; i++) 536 zfree(&tp->thread_siblings[i]); 537 538 free(tp); 539 } 540 541 static struct cpu_topo *build_cpu_topology(void) 542 { 543 struct cpu_topo *tp; 544 void *addr; 545 u32 nr, i; 546 size_t sz, sz_id; 547 long ncpus; 548 int ret = -1; 549 550 ncpus = sysconf(_SC_NPROCESSORS_CONF); 551 if (ncpus < 0) 552 return NULL; 553 554 nr = (u32)(ncpus & UINT_MAX); 555 556 sz = nr * sizeof(char *); 557 sz_id = nr * sizeof(int); 558 559 addr = calloc(1, sizeof(*tp) + 2 * sz + 2 * sz_id); 560 if (!addr) 561 return NULL; 562 563 tp = addr; 564 tp->cpu_nr = nr; 565 addr += sizeof(*tp); 566 tp->core_siblings = addr; 567 addr += sz; 568 tp->thread_siblings = addr; 569 addr += sz; 570 tp->core_id = addr; 571 addr += sz_id; 572 tp->phy_pkg_id = addr; 573 574 for (i = 0; i < nr; i++) { 575 ret = build_cpu_topo(tp, i); 576 if (ret < 0) 577 break; 578 } 579 if (ret) { 580 free_cpu_topo(tp); 581 tp = NULL; 582 } 583 return tp; 584 } 585 586 static int write_cpu_topology(int fd, struct perf_header *h __maybe_unused, 587 struct perf_evlist *evlist __maybe_unused) 588 { 589 struct cpu_topo *tp; 590 u32 i; 591 int ret; 592 593 tp = build_cpu_topology(); 594 if (!tp) 595 return -1; 596 597 ret = do_write(fd, &tp->core_sib, sizeof(tp->core_sib)); 598 if (ret < 0) 599 goto done; 600 601 for (i = 0; i < tp->core_sib; i++) { 602 ret = do_write_string(fd, tp->core_siblings[i]); 603 if (ret < 0) 604 goto done; 605 } 606 ret = do_write(fd, &tp->thread_sib, sizeof(tp->thread_sib)); 607 if (ret < 0) 608 goto done; 609 610 for (i = 0; i < tp->thread_sib; i++) { 611 ret = do_write_string(fd, tp->thread_siblings[i]); 612 if (ret < 0) 613 break; 614 } 615 616 for (i = 0; i < tp->cpu_nr; i++) { 617 ret = do_write(fd, &tp->core_id[i], sizeof(int)); 618 if (ret < 0) 619 return ret; 620 ret = do_write(fd, &tp->phy_pkg_id[i], sizeof(int)); 621 if (ret < 0) 622 return ret; 623 } 624 done: 625 free_cpu_topo(tp); 626 return ret; 627 } 628 629 630 631 static int write_total_mem(int fd, struct perf_header *h __maybe_unused, 632 struct perf_evlist *evlist __maybe_unused) 633 { 634 char *buf = NULL; 635 FILE *fp; 636 size_t len = 0; 637 int ret = -1, n; 638 uint64_t mem; 639 640 fp = fopen("/proc/meminfo", "r"); 641 if (!fp) 642 return -1; 643 644 while (getline(&buf, &len, fp) > 0) { 645 ret = strncmp(buf, "MemTotal:", 9); 646 if (!ret) 647 break; 648 } 649 if (!ret) { 650 n = sscanf(buf, "%*s %"PRIu64, &mem); 651 if (n == 1) 652 ret = do_write(fd, &mem, sizeof(mem)); 653 } else 654 ret = -1; 655 free(buf); 656 fclose(fp); 657 return ret; 658 } 659 660 static int write_topo_node(int fd, int node) 661 { 662 char str[MAXPATHLEN]; 663 char field[32]; 664 char *buf = NULL, *p; 665 size_t len = 0; 666 FILE *fp; 667 u64 mem_total, mem_free, mem; 668 int ret = -1; 669 670 sprintf(str, "/sys/devices/system/node/node%d/meminfo", node); 671 fp = fopen(str, "r"); 672 if (!fp) 673 return -1; 674 675 while (getline(&buf, &len, fp) > 0) { 676 /* skip over invalid lines */ 677 if (!strchr(buf, ':')) 678 continue; 679 if (sscanf(buf, "%*s %*d %31s %"PRIu64, field, &mem) != 2) 680 goto done; 681 if (!strcmp(field, "MemTotal:")) 682 mem_total = mem; 683 if (!strcmp(field, "MemFree:")) 684 mem_free = mem; 685 } 686 687 fclose(fp); 688 fp = NULL; 689 690 ret = do_write(fd, &mem_total, sizeof(u64)); 691 if (ret) 692 goto done; 693 694 ret = do_write(fd, &mem_free, sizeof(u64)); 695 if (ret) 696 goto done; 697 698 ret = -1; 699 sprintf(str, "/sys/devices/system/node/node%d/cpulist", node); 700 701 fp = fopen(str, "r"); 702 if (!fp) 703 goto done; 704 705 if (getline(&buf, &len, fp) <= 0) 706 goto done; 707 708 p = strchr(buf, '\n'); 709 if (p) 710 *p = '\0'; 711 712 ret = do_write_string(fd, buf); 713 done: 714 free(buf); 715 if (fp) 716 fclose(fp); 717 return ret; 718 } 719 720 static int write_numa_topology(int fd, struct perf_header *h __maybe_unused, 721 struct perf_evlist *evlist __maybe_unused) 722 { 723 char *buf = NULL; 724 size_t len = 0; 725 FILE *fp; 726 struct cpu_map *node_map = NULL; 727 char *c; 728 u32 nr, i, j; 729 int ret = -1; 730 731 fp = fopen("/sys/devices/system/node/online", "r"); 732 if (!fp) 733 return -1; 734 735 if (getline(&buf, &len, fp) <= 0) 736 goto done; 737 738 c = strchr(buf, '\n'); 739 if (c) 740 *c = '\0'; 741 742 node_map = cpu_map__new(buf); 743 if (!node_map) 744 goto done; 745 746 nr = (u32)node_map->nr; 747 748 ret = do_write(fd, &nr, sizeof(nr)); 749 if (ret < 0) 750 goto done; 751 752 for (i = 0; i < nr; i++) { 753 j = (u32)node_map->map[i]; 754 ret = do_write(fd, &j, sizeof(j)); 755 if (ret < 0) 756 break; 757 758 ret = write_topo_node(fd, i); 759 if (ret < 0) 760 break; 761 } 762 done: 763 free(buf); 764 fclose(fp); 765 free(node_map); 766 return ret; 767 } 768 769 /* 770 * File format: 771 * 772 * struct pmu_mappings { 773 * u32 pmu_num; 774 * struct pmu_map { 775 * u32 type; 776 * char name[]; 777 * }[pmu_num]; 778 * }; 779 */ 780 781 static int write_pmu_mappings(int fd, struct perf_header *h __maybe_unused, 782 struct perf_evlist *evlist __maybe_unused) 783 { 784 struct perf_pmu *pmu = NULL; 785 off_t offset = lseek(fd, 0, SEEK_CUR); 786 __u32 pmu_num = 0; 787 int ret; 788 789 /* write real pmu_num later */ 790 ret = do_write(fd, &pmu_num, sizeof(pmu_num)); 791 if (ret < 0) 792 return ret; 793 794 while ((pmu = perf_pmu__scan(pmu))) { 795 if (!pmu->name) 796 continue; 797 pmu_num++; 798 799 ret = do_write(fd, &pmu->type, sizeof(pmu->type)); 800 if (ret < 0) 801 return ret; 802 803 ret = do_write_string(fd, pmu->name); 804 if (ret < 0) 805 return ret; 806 } 807 808 if (pwrite(fd, &pmu_num, sizeof(pmu_num), offset) != sizeof(pmu_num)) { 809 /* discard all */ 810 lseek(fd, offset, SEEK_SET); 811 return -1; 812 } 813 814 return 0; 815 } 816 817 /* 818 * File format: 819 * 820 * struct group_descs { 821 * u32 nr_groups; 822 * struct group_desc { 823 * char name[]; 824 * u32 leader_idx; 825 * u32 nr_members; 826 * }[nr_groups]; 827 * }; 828 */ 829 static int write_group_desc(int fd, struct perf_header *h __maybe_unused, 830 struct perf_evlist *evlist) 831 { 832 u32 nr_groups = evlist->nr_groups; 833 struct perf_evsel *evsel; 834 int ret; 835 836 ret = do_write(fd, &nr_groups, sizeof(nr_groups)); 837 if (ret < 0) 838 return ret; 839 840 evlist__for_each(evlist, evsel) { 841 if (perf_evsel__is_group_leader(evsel) && 842 evsel->nr_members > 1) { 843 const char *name = evsel->group_name ?: "{anon_group}"; 844 u32 leader_idx = evsel->idx; 845 u32 nr_members = evsel->nr_members; 846 847 ret = do_write_string(fd, name); 848 if (ret < 0) 849 return ret; 850 851 ret = do_write(fd, &leader_idx, sizeof(leader_idx)); 852 if (ret < 0) 853 return ret; 854 855 ret = do_write(fd, &nr_members, sizeof(nr_members)); 856 if (ret < 0) 857 return ret; 858 } 859 } 860 return 0; 861 } 862 863 /* 864 * default get_cpuid(): nothing gets recorded 865 * actual implementation must be in arch/$(ARCH)/util/header.c 866 */ 867 int __attribute__ ((weak)) get_cpuid(char *buffer __maybe_unused, 868 size_t sz __maybe_unused) 869 { 870 return -1; 871 } 872 873 static int write_cpuid(int fd, struct perf_header *h __maybe_unused, 874 struct perf_evlist *evlist __maybe_unused) 875 { 876 char buffer[64]; 877 int ret; 878 879 ret = get_cpuid(buffer, sizeof(buffer)); 880 if (!ret) 881 goto write_it; 882 883 return -1; 884 write_it: 885 return do_write_string(fd, buffer); 886 } 887 888 static int write_branch_stack(int fd __maybe_unused, 889 struct perf_header *h __maybe_unused, 890 struct perf_evlist *evlist __maybe_unused) 891 { 892 return 0; 893 } 894 895 static int write_auxtrace(int fd, struct perf_header *h, 896 struct perf_evlist *evlist __maybe_unused) 897 { 898 struct perf_session *session; 899 int err; 900 901 session = container_of(h, struct perf_session, header); 902 903 err = auxtrace_index__write(fd, &session->auxtrace_index); 904 if (err < 0) 905 pr_err("Failed to write auxtrace index\n"); 906 return err; 907 } 908 909 static void print_hostname(struct perf_header *ph, int fd __maybe_unused, 910 FILE *fp) 911 { 912 fprintf(fp, "# hostname : %s\n", ph->env.hostname); 913 } 914 915 static void print_osrelease(struct perf_header *ph, int fd __maybe_unused, 916 FILE *fp) 917 { 918 fprintf(fp, "# os release : %s\n", ph->env.os_release); 919 } 920 921 static void print_arch(struct perf_header *ph, int fd __maybe_unused, FILE *fp) 922 { 923 fprintf(fp, "# arch : %s\n", ph->env.arch); 924 } 925 926 static void print_cpudesc(struct perf_header *ph, int fd __maybe_unused, 927 FILE *fp) 928 { 929 fprintf(fp, "# cpudesc : %s\n", ph->env.cpu_desc); 930 } 931 932 static void print_nrcpus(struct perf_header *ph, int fd __maybe_unused, 933 FILE *fp) 934 { 935 fprintf(fp, "# nrcpus online : %u\n", ph->env.nr_cpus_online); 936 fprintf(fp, "# nrcpus avail : %u\n", ph->env.nr_cpus_avail); 937 } 938 939 static void print_version(struct perf_header *ph, int fd __maybe_unused, 940 FILE *fp) 941 { 942 fprintf(fp, "# perf version : %s\n", ph->env.version); 943 } 944 945 static void print_cmdline(struct perf_header *ph, int fd __maybe_unused, 946 FILE *fp) 947 { 948 int nr, i; 949 950 nr = ph->env.nr_cmdline; 951 952 fprintf(fp, "# cmdline : "); 953 954 for (i = 0; i < nr; i++) 955 fprintf(fp, "%s ", ph->env.cmdline_argv[i]); 956 fputc('\n', fp); 957 } 958 959 static void print_cpu_topology(struct perf_header *ph, int fd __maybe_unused, 960 FILE *fp) 961 { 962 int nr, i; 963 char *str; 964 int cpu_nr = ph->env.nr_cpus_online; 965 966 nr = ph->env.nr_sibling_cores; 967 str = ph->env.sibling_cores; 968 969 for (i = 0; i < nr; i++) { 970 fprintf(fp, "# sibling cores : %s\n", str); 971 str += strlen(str) + 1; 972 } 973 974 nr = ph->env.nr_sibling_threads; 975 str = ph->env.sibling_threads; 976 977 for (i = 0; i < nr; i++) { 978 fprintf(fp, "# sibling threads : %s\n", str); 979 str += strlen(str) + 1; 980 } 981 982 if (ph->env.cpu != NULL) { 983 for (i = 0; i < cpu_nr; i++) 984 fprintf(fp, "# CPU %d: Core ID %d, Socket ID %d\n", i, 985 ph->env.cpu[i].core_id, ph->env.cpu[i].socket_id); 986 } else 987 fprintf(fp, "# Core ID and Socket ID information is not available\n"); 988 } 989 990 static void free_event_desc(struct perf_evsel *events) 991 { 992 struct perf_evsel *evsel; 993 994 if (!events) 995 return; 996 997 for (evsel = events; evsel->attr.size; evsel++) { 998 zfree(&evsel->name); 999 zfree(&evsel->id); 1000 } 1001 1002 free(events); 1003 } 1004 1005 static struct perf_evsel * 1006 read_event_desc(struct perf_header *ph, int fd) 1007 { 1008 struct perf_evsel *evsel, *events = NULL; 1009 u64 *id; 1010 void *buf = NULL; 1011 u32 nre, sz, nr, i, j; 1012 ssize_t ret; 1013 size_t msz; 1014 1015 /* number of events */ 1016 ret = readn(fd, &nre, sizeof(nre)); 1017 if (ret != (ssize_t)sizeof(nre)) 1018 goto error; 1019 1020 if (ph->needs_swap) 1021 nre = bswap_32(nre); 1022 1023 ret = readn(fd, &sz, sizeof(sz)); 1024 if (ret != (ssize_t)sizeof(sz)) 1025 goto error; 1026 1027 if (ph->needs_swap) 1028 sz = bswap_32(sz); 1029 1030 /* buffer to hold on file attr struct */ 1031 buf = malloc(sz); 1032 if (!buf) 1033 goto error; 1034 1035 /* the last event terminates with evsel->attr.size == 0: */ 1036 events = calloc(nre + 1, sizeof(*events)); 1037 if (!events) 1038 goto error; 1039 1040 msz = sizeof(evsel->attr); 1041 if (sz < msz) 1042 msz = sz; 1043 1044 for (i = 0, evsel = events; i < nre; evsel++, i++) { 1045 evsel->idx = i; 1046 1047 /* 1048 * must read entire on-file attr struct to 1049 * sync up with layout. 1050 */ 1051 ret = readn(fd, buf, sz); 1052 if (ret != (ssize_t)sz) 1053 goto error; 1054 1055 if (ph->needs_swap) 1056 perf_event__attr_swap(buf); 1057 1058 memcpy(&evsel->attr, buf, msz); 1059 1060 ret = readn(fd, &nr, sizeof(nr)); 1061 if (ret != (ssize_t)sizeof(nr)) 1062 goto error; 1063 1064 if (ph->needs_swap) { 1065 nr = bswap_32(nr); 1066 evsel->needs_swap = true; 1067 } 1068 1069 evsel->name = do_read_string(fd, ph); 1070 1071 if (!nr) 1072 continue; 1073 1074 id = calloc(nr, sizeof(*id)); 1075 if (!id) 1076 goto error; 1077 evsel->ids = nr; 1078 evsel->id = id; 1079 1080 for (j = 0 ; j < nr; j++) { 1081 ret = readn(fd, id, sizeof(*id)); 1082 if (ret != (ssize_t)sizeof(*id)) 1083 goto error; 1084 if (ph->needs_swap) 1085 *id = bswap_64(*id); 1086 id++; 1087 } 1088 } 1089 out: 1090 free(buf); 1091 return events; 1092 error: 1093 free_event_desc(events); 1094 events = NULL; 1095 goto out; 1096 } 1097 1098 static int __desc_attr__fprintf(FILE *fp, const char *name, const char *val, 1099 void *priv __attribute__((unused))) 1100 { 1101 return fprintf(fp, ", %s = %s", name, val); 1102 } 1103 1104 static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) 1105 { 1106 struct perf_evsel *evsel, *events = read_event_desc(ph, fd); 1107 u32 j; 1108 u64 *id; 1109 1110 if (!events) { 1111 fprintf(fp, "# event desc: not available or unable to read\n"); 1112 return; 1113 } 1114 1115 for (evsel = events; evsel->attr.size; evsel++) { 1116 fprintf(fp, "# event : name = %s, ", evsel->name); 1117 1118 if (evsel->ids) { 1119 fprintf(fp, ", id = {"); 1120 for (j = 0, id = evsel->id; j < evsel->ids; j++, id++) { 1121 if (j) 1122 fputc(',', fp); 1123 fprintf(fp, " %"PRIu64, *id); 1124 } 1125 fprintf(fp, " }"); 1126 } 1127 1128 perf_event_attr__fprintf(fp, &evsel->attr, __desc_attr__fprintf, NULL); 1129 1130 fputc('\n', fp); 1131 } 1132 1133 free_event_desc(events); 1134 } 1135 1136 static void print_total_mem(struct perf_header *ph, int fd __maybe_unused, 1137 FILE *fp) 1138 { 1139 fprintf(fp, "# total memory : %Lu kB\n", ph->env.total_mem); 1140 } 1141 1142 static void print_numa_topology(struct perf_header *ph, int fd __maybe_unused, 1143 FILE *fp) 1144 { 1145 u32 nr, c, i; 1146 char *str, *tmp; 1147 uint64_t mem_total, mem_free; 1148 1149 /* nr nodes */ 1150 nr = ph->env.nr_numa_nodes; 1151 str = ph->env.numa_nodes; 1152 1153 for (i = 0; i < nr; i++) { 1154 /* node number */ 1155 c = strtoul(str, &tmp, 0); 1156 if (*tmp != ':') 1157 goto error; 1158 1159 str = tmp + 1; 1160 mem_total = strtoull(str, &tmp, 0); 1161 if (*tmp != ':') 1162 goto error; 1163 1164 str = tmp + 1; 1165 mem_free = strtoull(str, &tmp, 0); 1166 if (*tmp != ':') 1167 goto error; 1168 1169 fprintf(fp, "# node%u meminfo : total = %"PRIu64" kB," 1170 " free = %"PRIu64" kB\n", 1171 c, mem_total, mem_free); 1172 1173 str = tmp + 1; 1174 fprintf(fp, "# node%u cpu list : %s\n", c, str); 1175 1176 str += strlen(str) + 1; 1177 } 1178 return; 1179 error: 1180 fprintf(fp, "# numa topology : not available\n"); 1181 } 1182 1183 static void print_cpuid(struct perf_header *ph, int fd __maybe_unused, FILE *fp) 1184 { 1185 fprintf(fp, "# cpuid : %s\n", ph->env.cpuid); 1186 } 1187 1188 static void print_branch_stack(struct perf_header *ph __maybe_unused, 1189 int fd __maybe_unused, FILE *fp) 1190 { 1191 fprintf(fp, "# contains samples with branch stack\n"); 1192 } 1193 1194 static void print_auxtrace(struct perf_header *ph __maybe_unused, 1195 int fd __maybe_unused, FILE *fp) 1196 { 1197 fprintf(fp, "# contains AUX area data (e.g. instruction trace)\n"); 1198 } 1199 1200 static void print_pmu_mappings(struct perf_header *ph, int fd __maybe_unused, 1201 FILE *fp) 1202 { 1203 const char *delimiter = "# pmu mappings: "; 1204 char *str, *tmp; 1205 u32 pmu_num; 1206 u32 type; 1207 1208 pmu_num = ph->env.nr_pmu_mappings; 1209 if (!pmu_num) { 1210 fprintf(fp, "# pmu mappings: not available\n"); 1211 return; 1212 } 1213 1214 str = ph->env.pmu_mappings; 1215 1216 while (pmu_num) { 1217 type = strtoul(str, &tmp, 0); 1218 if (*tmp != ':') 1219 goto error; 1220 1221 str = tmp + 1; 1222 fprintf(fp, "%s%s = %" PRIu32, delimiter, str, type); 1223 1224 delimiter = ", "; 1225 str += strlen(str) + 1; 1226 pmu_num--; 1227 } 1228 1229 fprintf(fp, "\n"); 1230 1231 if (!pmu_num) 1232 return; 1233 error: 1234 fprintf(fp, "# pmu mappings: unable to read\n"); 1235 } 1236 1237 static void print_group_desc(struct perf_header *ph, int fd __maybe_unused, 1238 FILE *fp) 1239 { 1240 struct perf_session *session; 1241 struct perf_evsel *evsel; 1242 u32 nr = 0; 1243 1244 session = container_of(ph, struct perf_session, header); 1245 1246 evlist__for_each(session->evlist, evsel) { 1247 if (perf_evsel__is_group_leader(evsel) && 1248 evsel->nr_members > 1) { 1249 fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", 1250 perf_evsel__name(evsel)); 1251 1252 nr = evsel->nr_members - 1; 1253 } else if (nr) { 1254 fprintf(fp, ",%s", perf_evsel__name(evsel)); 1255 1256 if (--nr == 0) 1257 fprintf(fp, "}\n"); 1258 } 1259 } 1260 } 1261 1262 static int __event_process_build_id(struct build_id_event *bev, 1263 char *filename, 1264 struct perf_session *session) 1265 { 1266 int err = -1; 1267 struct machine *machine; 1268 u16 cpumode; 1269 struct dso *dso; 1270 enum dso_kernel_type dso_type; 1271 1272 machine = perf_session__findnew_machine(session, bev->pid); 1273 if (!machine) 1274 goto out; 1275 1276 cpumode = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; 1277 1278 switch (cpumode) { 1279 case PERF_RECORD_MISC_KERNEL: 1280 dso_type = DSO_TYPE_KERNEL; 1281 break; 1282 case PERF_RECORD_MISC_GUEST_KERNEL: 1283 dso_type = DSO_TYPE_GUEST_KERNEL; 1284 break; 1285 case PERF_RECORD_MISC_USER: 1286 case PERF_RECORD_MISC_GUEST_USER: 1287 dso_type = DSO_TYPE_USER; 1288 break; 1289 default: 1290 goto out; 1291 } 1292 1293 dso = machine__findnew_dso(machine, filename); 1294 if (dso != NULL) { 1295 char sbuild_id[BUILD_ID_SIZE * 2 + 1]; 1296 1297 dso__set_build_id(dso, &bev->build_id); 1298 1299 if (!is_kernel_module(filename, cpumode)) 1300 dso->kernel = dso_type; 1301 1302 build_id__sprintf(dso->build_id, sizeof(dso->build_id), 1303 sbuild_id); 1304 pr_debug("build id event received for %s: %s\n", 1305 dso->long_name, sbuild_id); 1306 dso__put(dso); 1307 } 1308 1309 err = 0; 1310 out: 1311 return err; 1312 } 1313 1314 static int perf_header__read_build_ids_abi_quirk(struct perf_header *header, 1315 int input, u64 offset, u64 size) 1316 { 1317 struct perf_session *session = container_of(header, struct perf_session, header); 1318 struct { 1319 struct perf_event_header header; 1320 u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))]; 1321 char filename[0]; 1322 } old_bev; 1323 struct build_id_event bev; 1324 char filename[PATH_MAX]; 1325 u64 limit = offset + size; 1326 1327 while (offset < limit) { 1328 ssize_t len; 1329 1330 if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev)) 1331 return -1; 1332 1333 if (header->needs_swap) 1334 perf_event_header__bswap(&old_bev.header); 1335 1336 len = old_bev.header.size - sizeof(old_bev); 1337 if (readn(input, filename, len) != len) 1338 return -1; 1339 1340 bev.header = old_bev.header; 1341 1342 /* 1343 * As the pid is the missing value, we need to fill 1344 * it properly. The header.misc value give us nice hint. 1345 */ 1346 bev.pid = HOST_KERNEL_ID; 1347 if (bev.header.misc == PERF_RECORD_MISC_GUEST_USER || 1348 bev.header.misc == PERF_RECORD_MISC_GUEST_KERNEL) 1349 bev.pid = DEFAULT_GUEST_KERNEL_ID; 1350 1351 memcpy(bev.build_id, old_bev.build_id, sizeof(bev.build_id)); 1352 __event_process_build_id(&bev, filename, session); 1353 1354 offset += bev.header.size; 1355 } 1356 1357 return 0; 1358 } 1359 1360 static int perf_header__read_build_ids(struct perf_header *header, 1361 int input, u64 offset, u64 size) 1362 { 1363 struct perf_session *session = container_of(header, struct perf_session, header); 1364 struct build_id_event bev; 1365 char filename[PATH_MAX]; 1366 u64 limit = offset + size, orig_offset = offset; 1367 int err = -1; 1368 1369 while (offset < limit) { 1370 ssize_t len; 1371 1372 if (readn(input, &bev, sizeof(bev)) != sizeof(bev)) 1373 goto out; 1374 1375 if (header->needs_swap) 1376 perf_event_header__bswap(&bev.header); 1377 1378 len = bev.header.size - sizeof(bev); 1379 if (readn(input, filename, len) != len) 1380 goto out; 1381 /* 1382 * The a1645ce1 changeset: 1383 * 1384 * "perf: 'perf kvm' tool for monitoring guest performance from host" 1385 * 1386 * Added a field to struct build_id_event that broke the file 1387 * format. 1388 * 1389 * Since the kernel build-id is the first entry, process the 1390 * table using the old format if the well known 1391 * '[kernel.kallsyms]' string for the kernel build-id has the 1392 * first 4 characters chopped off (where the pid_t sits). 1393 */ 1394 if (memcmp(filename, "nel.kallsyms]", 13) == 0) { 1395 if (lseek(input, orig_offset, SEEK_SET) == (off_t)-1) 1396 return -1; 1397 return perf_header__read_build_ids_abi_quirk(header, input, offset, size); 1398 } 1399 1400 __event_process_build_id(&bev, filename, session); 1401 1402 offset += bev.header.size; 1403 } 1404 err = 0; 1405 out: 1406 return err; 1407 } 1408 1409 static int process_tracing_data(struct perf_file_section *section __maybe_unused, 1410 struct perf_header *ph __maybe_unused, 1411 int fd, void *data) 1412 { 1413 ssize_t ret = trace_report(fd, data, false); 1414 return ret < 0 ? -1 : 0; 1415 } 1416 1417 static int process_build_id(struct perf_file_section *section, 1418 struct perf_header *ph, int fd, 1419 void *data __maybe_unused) 1420 { 1421 if (perf_header__read_build_ids(ph, fd, section->offset, section->size)) 1422 pr_debug("Failed to read buildids, continuing...\n"); 1423 return 0; 1424 } 1425 1426 static int process_hostname(struct perf_file_section *section __maybe_unused, 1427 struct perf_header *ph, int fd, 1428 void *data __maybe_unused) 1429 { 1430 ph->env.hostname = do_read_string(fd, ph); 1431 return ph->env.hostname ? 0 : -ENOMEM; 1432 } 1433 1434 static int process_osrelease(struct perf_file_section *section __maybe_unused, 1435 struct perf_header *ph, int fd, 1436 void *data __maybe_unused) 1437 { 1438 ph->env.os_release = do_read_string(fd, ph); 1439 return ph->env.os_release ? 0 : -ENOMEM; 1440 } 1441 1442 static int process_version(struct perf_file_section *section __maybe_unused, 1443 struct perf_header *ph, int fd, 1444 void *data __maybe_unused) 1445 { 1446 ph->env.version = do_read_string(fd, ph); 1447 return ph->env.version ? 0 : -ENOMEM; 1448 } 1449 1450 static int process_arch(struct perf_file_section *section __maybe_unused, 1451 struct perf_header *ph, int fd, 1452 void *data __maybe_unused) 1453 { 1454 ph->env.arch = do_read_string(fd, ph); 1455 return ph->env.arch ? 0 : -ENOMEM; 1456 } 1457 1458 static int process_nrcpus(struct perf_file_section *section __maybe_unused, 1459 struct perf_header *ph, int fd, 1460 void *data __maybe_unused) 1461 { 1462 ssize_t ret; 1463 u32 nr; 1464 1465 ret = readn(fd, &nr, sizeof(nr)); 1466 if (ret != sizeof(nr)) 1467 return -1; 1468 1469 if (ph->needs_swap) 1470 nr = bswap_32(nr); 1471 1472 ph->env.nr_cpus_online = nr; 1473 1474 ret = readn(fd, &nr, sizeof(nr)); 1475 if (ret != sizeof(nr)) 1476 return -1; 1477 1478 if (ph->needs_swap) 1479 nr = bswap_32(nr); 1480 1481 ph->env.nr_cpus_avail = nr; 1482 return 0; 1483 } 1484 1485 static int process_cpudesc(struct perf_file_section *section __maybe_unused, 1486 struct perf_header *ph, int fd, 1487 void *data __maybe_unused) 1488 { 1489 ph->env.cpu_desc = do_read_string(fd, ph); 1490 return ph->env.cpu_desc ? 0 : -ENOMEM; 1491 } 1492 1493 static int process_cpuid(struct perf_file_section *section __maybe_unused, 1494 struct perf_header *ph, int fd, 1495 void *data __maybe_unused) 1496 { 1497 ph->env.cpuid = do_read_string(fd, ph); 1498 return ph->env.cpuid ? 0 : -ENOMEM; 1499 } 1500 1501 static int process_total_mem(struct perf_file_section *section __maybe_unused, 1502 struct perf_header *ph, int fd, 1503 void *data __maybe_unused) 1504 { 1505 uint64_t mem; 1506 ssize_t ret; 1507 1508 ret = readn(fd, &mem, sizeof(mem)); 1509 if (ret != sizeof(mem)) 1510 return -1; 1511 1512 if (ph->needs_swap) 1513 mem = bswap_64(mem); 1514 1515 ph->env.total_mem = mem; 1516 return 0; 1517 } 1518 1519 static struct perf_evsel * 1520 perf_evlist__find_by_index(struct perf_evlist *evlist, int idx) 1521 { 1522 struct perf_evsel *evsel; 1523 1524 evlist__for_each(evlist, evsel) { 1525 if (evsel->idx == idx) 1526 return evsel; 1527 } 1528 1529 return NULL; 1530 } 1531 1532 static void 1533 perf_evlist__set_event_name(struct perf_evlist *evlist, 1534 struct perf_evsel *event) 1535 { 1536 struct perf_evsel *evsel; 1537 1538 if (!event->name) 1539 return; 1540 1541 evsel = perf_evlist__find_by_index(evlist, event->idx); 1542 if (!evsel) 1543 return; 1544 1545 if (evsel->name) 1546 return; 1547 1548 evsel->name = strdup(event->name); 1549 } 1550 1551 static int 1552 process_event_desc(struct perf_file_section *section __maybe_unused, 1553 struct perf_header *header, int fd, 1554 void *data __maybe_unused) 1555 { 1556 struct perf_session *session; 1557 struct perf_evsel *evsel, *events = read_event_desc(header, fd); 1558 1559 if (!events) 1560 return 0; 1561 1562 session = container_of(header, struct perf_session, header); 1563 for (evsel = events; evsel->attr.size; evsel++) 1564 perf_evlist__set_event_name(session->evlist, evsel); 1565 1566 free_event_desc(events); 1567 1568 return 0; 1569 } 1570 1571 static int process_cmdline(struct perf_file_section *section, 1572 struct perf_header *ph, int fd, 1573 void *data __maybe_unused) 1574 { 1575 ssize_t ret; 1576 char *str, *cmdline = NULL, **argv = NULL; 1577 u32 nr, i, len = 0; 1578 1579 ret = readn(fd, &nr, sizeof(nr)); 1580 if (ret != sizeof(nr)) 1581 return -1; 1582 1583 if (ph->needs_swap) 1584 nr = bswap_32(nr); 1585 1586 ph->env.nr_cmdline = nr; 1587 1588 cmdline = zalloc(section->size + nr + 1); 1589 if (!cmdline) 1590 return -1; 1591 1592 argv = zalloc(sizeof(char *) * (nr + 1)); 1593 if (!argv) 1594 goto error; 1595 1596 for (i = 0; i < nr; i++) { 1597 str = do_read_string(fd, ph); 1598 if (!str) 1599 goto error; 1600 1601 argv[i] = cmdline + len; 1602 memcpy(argv[i], str, strlen(str) + 1); 1603 len += strlen(str) + 1; 1604 free(str); 1605 } 1606 ph->env.cmdline = cmdline; 1607 ph->env.cmdline_argv = (const char **) argv; 1608 return 0; 1609 1610 error: 1611 free(argv); 1612 free(cmdline); 1613 return -1; 1614 } 1615 1616 static int process_cpu_topology(struct perf_file_section *section, 1617 struct perf_header *ph, int fd, 1618 void *data __maybe_unused) 1619 { 1620 ssize_t ret; 1621 u32 nr, i; 1622 char *str; 1623 struct strbuf sb; 1624 int cpu_nr = ph->env.nr_cpus_online; 1625 u64 size = 0; 1626 1627 ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu)); 1628 if (!ph->env.cpu) 1629 return -1; 1630 1631 ret = readn(fd, &nr, sizeof(nr)); 1632 if (ret != sizeof(nr)) 1633 goto free_cpu; 1634 1635 if (ph->needs_swap) 1636 nr = bswap_32(nr); 1637 1638 ph->env.nr_sibling_cores = nr; 1639 size += sizeof(u32); 1640 strbuf_init(&sb, 128); 1641 1642 for (i = 0; i < nr; i++) { 1643 str = do_read_string(fd, ph); 1644 if (!str) 1645 goto error; 1646 1647 /* include a NULL character at the end */ 1648 strbuf_add(&sb, str, strlen(str) + 1); 1649 size += string_size(str); 1650 free(str); 1651 } 1652 ph->env.sibling_cores = strbuf_detach(&sb, NULL); 1653 1654 ret = readn(fd, &nr, sizeof(nr)); 1655 if (ret != sizeof(nr)) 1656 return -1; 1657 1658 if (ph->needs_swap) 1659 nr = bswap_32(nr); 1660 1661 ph->env.nr_sibling_threads = nr; 1662 size += sizeof(u32); 1663 1664 for (i = 0; i < nr; i++) { 1665 str = do_read_string(fd, ph); 1666 if (!str) 1667 goto error; 1668 1669 /* include a NULL character at the end */ 1670 strbuf_add(&sb, str, strlen(str) + 1); 1671 size += string_size(str); 1672 free(str); 1673 } 1674 ph->env.sibling_threads = strbuf_detach(&sb, NULL); 1675 1676 /* 1677 * The header may be from old perf, 1678 * which doesn't include core id and socket id information. 1679 */ 1680 if (section->size <= size) { 1681 zfree(&ph->env.cpu); 1682 return 0; 1683 } 1684 1685 for (i = 0; i < (u32)cpu_nr; i++) { 1686 ret = readn(fd, &nr, sizeof(nr)); 1687 if (ret != sizeof(nr)) 1688 goto free_cpu; 1689 1690 if (ph->needs_swap) 1691 nr = bswap_32(nr); 1692 1693 if (nr > (u32)cpu_nr) { 1694 pr_debug("core_id number is too big." 1695 "You may need to upgrade the perf tool.\n"); 1696 goto free_cpu; 1697 } 1698 ph->env.cpu[i].core_id = nr; 1699 1700 ret = readn(fd, &nr, sizeof(nr)); 1701 if (ret != sizeof(nr)) 1702 goto free_cpu; 1703 1704 if (ph->needs_swap) 1705 nr = bswap_32(nr); 1706 1707 if (nr > (u32)cpu_nr) { 1708 pr_debug("socket_id number is too big." 1709 "You may need to upgrade the perf tool.\n"); 1710 goto free_cpu; 1711 } 1712 1713 ph->env.cpu[i].socket_id = nr; 1714 } 1715 1716 return 0; 1717 1718 error: 1719 strbuf_release(&sb); 1720 free_cpu: 1721 zfree(&ph->env.cpu); 1722 return -1; 1723 } 1724 1725 static int process_numa_topology(struct perf_file_section *section __maybe_unused, 1726 struct perf_header *ph, int fd, 1727 void *data __maybe_unused) 1728 { 1729 ssize_t ret; 1730 u32 nr, node, i; 1731 char *str; 1732 uint64_t mem_total, mem_free; 1733 struct strbuf sb; 1734 1735 /* nr nodes */ 1736 ret = readn(fd, &nr, sizeof(nr)); 1737 if (ret != sizeof(nr)) 1738 goto error; 1739 1740 if (ph->needs_swap) 1741 nr = bswap_32(nr); 1742 1743 ph->env.nr_numa_nodes = nr; 1744 strbuf_init(&sb, 256); 1745 1746 for (i = 0; i < nr; i++) { 1747 /* node number */ 1748 ret = readn(fd, &node, sizeof(node)); 1749 if (ret != sizeof(node)) 1750 goto error; 1751 1752 ret = readn(fd, &mem_total, sizeof(u64)); 1753 if (ret != sizeof(u64)) 1754 goto error; 1755 1756 ret = readn(fd, &mem_free, sizeof(u64)); 1757 if (ret != sizeof(u64)) 1758 goto error; 1759 1760 if (ph->needs_swap) { 1761 node = bswap_32(node); 1762 mem_total = bswap_64(mem_total); 1763 mem_free = bswap_64(mem_free); 1764 } 1765 1766 strbuf_addf(&sb, "%u:%"PRIu64":%"PRIu64":", 1767 node, mem_total, mem_free); 1768 1769 str = do_read_string(fd, ph); 1770 if (!str) 1771 goto error; 1772 1773 /* include a NULL character at the end */ 1774 strbuf_add(&sb, str, strlen(str) + 1); 1775 free(str); 1776 } 1777 ph->env.numa_nodes = strbuf_detach(&sb, NULL); 1778 return 0; 1779 1780 error: 1781 strbuf_release(&sb); 1782 return -1; 1783 } 1784 1785 static int process_pmu_mappings(struct perf_file_section *section __maybe_unused, 1786 struct perf_header *ph, int fd, 1787 void *data __maybe_unused) 1788 { 1789 ssize_t ret; 1790 char *name; 1791 u32 pmu_num; 1792 u32 type; 1793 struct strbuf sb; 1794 1795 ret = readn(fd, &pmu_num, sizeof(pmu_num)); 1796 if (ret != sizeof(pmu_num)) 1797 return -1; 1798 1799 if (ph->needs_swap) 1800 pmu_num = bswap_32(pmu_num); 1801 1802 if (!pmu_num) { 1803 pr_debug("pmu mappings not available\n"); 1804 return 0; 1805 } 1806 1807 ph->env.nr_pmu_mappings = pmu_num; 1808 strbuf_init(&sb, 128); 1809 1810 while (pmu_num) { 1811 if (readn(fd, &type, sizeof(type)) != sizeof(type)) 1812 goto error; 1813 if (ph->needs_swap) 1814 type = bswap_32(type); 1815 1816 name = do_read_string(fd, ph); 1817 if (!name) 1818 goto error; 1819 1820 strbuf_addf(&sb, "%u:%s", type, name); 1821 /* include a NULL character at the end */ 1822 strbuf_add(&sb, "", 1); 1823 1824 free(name); 1825 pmu_num--; 1826 } 1827 ph->env.pmu_mappings = strbuf_detach(&sb, NULL); 1828 return 0; 1829 1830 error: 1831 strbuf_release(&sb); 1832 return -1; 1833 } 1834 1835 static int process_group_desc(struct perf_file_section *section __maybe_unused, 1836 struct perf_header *ph, int fd, 1837 void *data __maybe_unused) 1838 { 1839 size_t ret = -1; 1840 u32 i, nr, nr_groups; 1841 struct perf_session *session; 1842 struct perf_evsel *evsel, *leader = NULL; 1843 struct group_desc { 1844 char *name; 1845 u32 leader_idx; 1846 u32 nr_members; 1847 } *desc; 1848 1849 if (readn(fd, &nr_groups, sizeof(nr_groups)) != sizeof(nr_groups)) 1850 return -1; 1851 1852 if (ph->needs_swap) 1853 nr_groups = bswap_32(nr_groups); 1854 1855 ph->env.nr_groups = nr_groups; 1856 if (!nr_groups) { 1857 pr_debug("group desc not available\n"); 1858 return 0; 1859 } 1860 1861 desc = calloc(nr_groups, sizeof(*desc)); 1862 if (!desc) 1863 return -1; 1864 1865 for (i = 0; i < nr_groups; i++) { 1866 desc[i].name = do_read_string(fd, ph); 1867 if (!desc[i].name) 1868 goto out_free; 1869 1870 if (readn(fd, &desc[i].leader_idx, sizeof(u32)) != sizeof(u32)) 1871 goto out_free; 1872 1873 if (readn(fd, &desc[i].nr_members, sizeof(u32)) != sizeof(u32)) 1874 goto out_free; 1875 1876 if (ph->needs_swap) { 1877 desc[i].leader_idx = bswap_32(desc[i].leader_idx); 1878 desc[i].nr_members = bswap_32(desc[i].nr_members); 1879 } 1880 } 1881 1882 /* 1883 * Rebuild group relationship based on the group_desc 1884 */ 1885 session = container_of(ph, struct perf_session, header); 1886 session->evlist->nr_groups = nr_groups; 1887 1888 i = nr = 0; 1889 evlist__for_each(session->evlist, evsel) { 1890 if (evsel->idx == (int) desc[i].leader_idx) { 1891 evsel->leader = evsel; 1892 /* {anon_group} is a dummy name */ 1893 if (strcmp(desc[i].name, "{anon_group}")) { 1894 evsel->group_name = desc[i].name; 1895 desc[i].name = NULL; 1896 } 1897 evsel->nr_members = desc[i].nr_members; 1898 1899 if (i >= nr_groups || nr > 0) { 1900 pr_debug("invalid group desc\n"); 1901 goto out_free; 1902 } 1903 1904 leader = evsel; 1905 nr = evsel->nr_members - 1; 1906 i++; 1907 } else if (nr) { 1908 /* This is a group member */ 1909 evsel->leader = leader; 1910 1911 nr--; 1912 } 1913 } 1914 1915 if (i != nr_groups || nr != 0) { 1916 pr_debug("invalid group desc\n"); 1917 goto out_free; 1918 } 1919 1920 ret = 0; 1921 out_free: 1922 for (i = 0; i < nr_groups; i++) 1923 zfree(&desc[i].name); 1924 free(desc); 1925 1926 return ret; 1927 } 1928 1929 static int process_auxtrace(struct perf_file_section *section, 1930 struct perf_header *ph, int fd, 1931 void *data __maybe_unused) 1932 { 1933 struct perf_session *session; 1934 int err; 1935 1936 session = container_of(ph, struct perf_session, header); 1937 1938 err = auxtrace_index__process(fd, section->size, session, 1939 ph->needs_swap); 1940 if (err < 0) 1941 pr_err("Failed to process auxtrace index\n"); 1942 return err; 1943 } 1944 1945 struct feature_ops { 1946 int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist); 1947 void (*print)(struct perf_header *h, int fd, FILE *fp); 1948 int (*process)(struct perf_file_section *section, 1949 struct perf_header *h, int fd, void *data); 1950 const char *name; 1951 bool full_only; 1952 }; 1953 1954 #define FEAT_OPA(n, func) \ 1955 [n] = { .name = #n, .write = write_##func, .print = print_##func } 1956 #define FEAT_OPP(n, func) \ 1957 [n] = { .name = #n, .write = write_##func, .print = print_##func, \ 1958 .process = process_##func } 1959 #define FEAT_OPF(n, func) \ 1960 [n] = { .name = #n, .write = write_##func, .print = print_##func, \ 1961 .process = process_##func, .full_only = true } 1962 1963 /* feature_ops not implemented: */ 1964 #define print_tracing_data NULL 1965 #define print_build_id NULL 1966 1967 static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = { 1968 FEAT_OPP(HEADER_TRACING_DATA, tracing_data), 1969 FEAT_OPP(HEADER_BUILD_ID, build_id), 1970 FEAT_OPP(HEADER_HOSTNAME, hostname), 1971 FEAT_OPP(HEADER_OSRELEASE, osrelease), 1972 FEAT_OPP(HEADER_VERSION, version), 1973 FEAT_OPP(HEADER_ARCH, arch), 1974 FEAT_OPP(HEADER_NRCPUS, nrcpus), 1975 FEAT_OPP(HEADER_CPUDESC, cpudesc), 1976 FEAT_OPP(HEADER_CPUID, cpuid), 1977 FEAT_OPP(HEADER_TOTAL_MEM, total_mem), 1978 FEAT_OPP(HEADER_EVENT_DESC, event_desc), 1979 FEAT_OPP(HEADER_CMDLINE, cmdline), 1980 FEAT_OPF(HEADER_CPU_TOPOLOGY, cpu_topology), 1981 FEAT_OPF(HEADER_NUMA_TOPOLOGY, numa_topology), 1982 FEAT_OPA(HEADER_BRANCH_STACK, branch_stack), 1983 FEAT_OPP(HEADER_PMU_MAPPINGS, pmu_mappings), 1984 FEAT_OPP(HEADER_GROUP_DESC, group_desc), 1985 FEAT_OPP(HEADER_AUXTRACE, auxtrace), 1986 }; 1987 1988 struct header_print_data { 1989 FILE *fp; 1990 bool full; /* extended list of headers */ 1991 }; 1992 1993 static int perf_file_section__fprintf_info(struct perf_file_section *section, 1994 struct perf_header *ph, 1995 int feat, int fd, void *data) 1996 { 1997 struct header_print_data *hd = data; 1998 1999 if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { 2000 pr_debug("Failed to lseek to %" PRIu64 " offset for feature " 2001 "%d, continuing...\n", section->offset, feat); 2002 return 0; 2003 } 2004 if (feat >= HEADER_LAST_FEATURE) { 2005 pr_warning("unknown feature %d\n", feat); 2006 return 0; 2007 } 2008 if (!feat_ops[feat].print) 2009 return 0; 2010 2011 if (!feat_ops[feat].full_only || hd->full) 2012 feat_ops[feat].print(ph, fd, hd->fp); 2013 else 2014 fprintf(hd->fp, "# %s info available, use -I to display\n", 2015 feat_ops[feat].name); 2016 2017 return 0; 2018 } 2019 2020 int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full) 2021 { 2022 struct header_print_data hd; 2023 struct perf_header *header = &session->header; 2024 int fd = perf_data_file__fd(session->file); 2025 hd.fp = fp; 2026 hd.full = full; 2027 2028 perf_header__process_sections(header, fd, &hd, 2029 perf_file_section__fprintf_info); 2030 return 0; 2031 } 2032 2033 static int do_write_feat(int fd, struct perf_header *h, int type, 2034 struct perf_file_section **p, 2035 struct perf_evlist *evlist) 2036 { 2037 int err; 2038 int ret = 0; 2039 2040 if (perf_header__has_feat(h, type)) { 2041 if (!feat_ops[type].write) 2042 return -1; 2043 2044 (*p)->offset = lseek(fd, 0, SEEK_CUR); 2045 2046 err = feat_ops[type].write(fd, h, evlist); 2047 if (err < 0) { 2048 pr_debug("failed to write feature %d\n", type); 2049 2050 /* undo anything written */ 2051 lseek(fd, (*p)->offset, SEEK_SET); 2052 2053 return -1; 2054 } 2055 (*p)->size = lseek(fd, 0, SEEK_CUR) - (*p)->offset; 2056 (*p)++; 2057 } 2058 return ret; 2059 } 2060 2061 static int perf_header__adds_write(struct perf_header *header, 2062 struct perf_evlist *evlist, int fd) 2063 { 2064 int nr_sections; 2065 struct perf_file_section *feat_sec, *p; 2066 int sec_size; 2067 u64 sec_start; 2068 int feat; 2069 int err; 2070 2071 nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS); 2072 if (!nr_sections) 2073 return 0; 2074 2075 feat_sec = p = calloc(nr_sections, sizeof(*feat_sec)); 2076 if (feat_sec == NULL) 2077 return -ENOMEM; 2078 2079 sec_size = sizeof(*feat_sec) * nr_sections; 2080 2081 sec_start = header->feat_offset; 2082 lseek(fd, sec_start + sec_size, SEEK_SET); 2083 2084 for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) { 2085 if (do_write_feat(fd, header, feat, &p, evlist)) 2086 perf_header__clear_feat(header, feat); 2087 } 2088 2089 lseek(fd, sec_start, SEEK_SET); 2090 /* 2091 * may write more than needed due to dropped feature, but 2092 * this is okay, reader will skip the mising entries 2093 */ 2094 err = do_write(fd, feat_sec, sec_size); 2095 if (err < 0) 2096 pr_debug("failed to write feature section\n"); 2097 free(feat_sec); 2098 return err; 2099 } 2100 2101 int perf_header__write_pipe(int fd) 2102 { 2103 struct perf_pipe_file_header f_header; 2104 int err; 2105 2106 f_header = (struct perf_pipe_file_header){ 2107 .magic = PERF_MAGIC, 2108 .size = sizeof(f_header), 2109 }; 2110 2111 err = do_write(fd, &f_header, sizeof(f_header)); 2112 if (err < 0) { 2113 pr_debug("failed to write perf pipe header\n"); 2114 return err; 2115 } 2116 2117 return 0; 2118 } 2119 2120 int perf_session__write_header(struct perf_session *session, 2121 struct perf_evlist *evlist, 2122 int fd, bool at_exit) 2123 { 2124 struct perf_file_header f_header; 2125 struct perf_file_attr f_attr; 2126 struct perf_header *header = &session->header; 2127 struct perf_evsel *evsel; 2128 u64 attr_offset; 2129 int err; 2130 2131 lseek(fd, sizeof(f_header), SEEK_SET); 2132 2133 evlist__for_each(session->evlist, evsel) { 2134 evsel->id_offset = lseek(fd, 0, SEEK_CUR); 2135 err = do_write(fd, evsel->id, evsel->ids * sizeof(u64)); 2136 if (err < 0) { 2137 pr_debug("failed to write perf header\n"); 2138 return err; 2139 } 2140 } 2141 2142 attr_offset = lseek(fd, 0, SEEK_CUR); 2143 2144 evlist__for_each(evlist, evsel) { 2145 f_attr = (struct perf_file_attr){ 2146 .attr = evsel->attr, 2147 .ids = { 2148 .offset = evsel->id_offset, 2149 .size = evsel->ids * sizeof(u64), 2150 } 2151 }; 2152 err = do_write(fd, &f_attr, sizeof(f_attr)); 2153 if (err < 0) { 2154 pr_debug("failed to write perf header attribute\n"); 2155 return err; 2156 } 2157 } 2158 2159 if (!header->data_offset) 2160 header->data_offset = lseek(fd, 0, SEEK_CUR); 2161 header->feat_offset = header->data_offset + header->data_size; 2162 2163 if (at_exit) { 2164 err = perf_header__adds_write(header, evlist, fd); 2165 if (err < 0) 2166 return err; 2167 } 2168 2169 f_header = (struct perf_file_header){ 2170 .magic = PERF_MAGIC, 2171 .size = sizeof(f_header), 2172 .attr_size = sizeof(f_attr), 2173 .attrs = { 2174 .offset = attr_offset, 2175 .size = evlist->nr_entries * sizeof(f_attr), 2176 }, 2177 .data = { 2178 .offset = header->data_offset, 2179 .size = header->data_size, 2180 }, 2181 /* event_types is ignored, store zeros */ 2182 }; 2183 2184 memcpy(&f_header.adds_features, &header->adds_features, sizeof(header->adds_features)); 2185 2186 lseek(fd, 0, SEEK_SET); 2187 err = do_write(fd, &f_header, sizeof(f_header)); 2188 if (err < 0) { 2189 pr_debug("failed to write perf header\n"); 2190 return err; 2191 } 2192 lseek(fd, header->data_offset + header->data_size, SEEK_SET); 2193 2194 return 0; 2195 } 2196 2197 static int perf_header__getbuffer64(struct perf_header *header, 2198 int fd, void *buf, size_t size) 2199 { 2200 if (readn(fd, buf, size) <= 0) 2201 return -1; 2202 2203 if (header->needs_swap) 2204 mem_bswap_64(buf, size); 2205 2206 return 0; 2207 } 2208 2209 int perf_header__process_sections(struct perf_header *header, int fd, 2210 void *data, 2211 int (*process)(struct perf_file_section *section, 2212 struct perf_header *ph, 2213 int feat, int fd, void *data)) 2214 { 2215 struct perf_file_section *feat_sec, *sec; 2216 int nr_sections; 2217 int sec_size; 2218 int feat; 2219 int err; 2220 2221 nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS); 2222 if (!nr_sections) 2223 return 0; 2224 2225 feat_sec = sec = calloc(nr_sections, sizeof(*feat_sec)); 2226 if (!feat_sec) 2227 return -1; 2228 2229 sec_size = sizeof(*feat_sec) * nr_sections; 2230 2231 lseek(fd, header->feat_offset, SEEK_SET); 2232 2233 err = perf_header__getbuffer64(header, fd, feat_sec, sec_size); 2234 if (err < 0) 2235 goto out_free; 2236 2237 for_each_set_bit(feat, header->adds_features, HEADER_LAST_FEATURE) { 2238 err = process(sec++, header, feat, fd, data); 2239 if (err < 0) 2240 goto out_free; 2241 } 2242 err = 0; 2243 out_free: 2244 free(feat_sec); 2245 return err; 2246 } 2247 2248 static const int attr_file_abi_sizes[] = { 2249 [0] = PERF_ATTR_SIZE_VER0, 2250 [1] = PERF_ATTR_SIZE_VER1, 2251 [2] = PERF_ATTR_SIZE_VER2, 2252 [3] = PERF_ATTR_SIZE_VER3, 2253 [4] = PERF_ATTR_SIZE_VER4, 2254 0, 2255 }; 2256 2257 /* 2258 * In the legacy file format, the magic number is not used to encode endianness. 2259 * hdr_sz was used to encode endianness. But given that hdr_sz can vary based 2260 * on ABI revisions, we need to try all combinations for all endianness to 2261 * detect the endianness. 2262 */ 2263 static int try_all_file_abis(uint64_t hdr_sz, struct perf_header *ph) 2264 { 2265 uint64_t ref_size, attr_size; 2266 int i; 2267 2268 for (i = 0 ; attr_file_abi_sizes[i]; i++) { 2269 ref_size = attr_file_abi_sizes[i] 2270 + sizeof(struct perf_file_section); 2271 if (hdr_sz != ref_size) { 2272 attr_size = bswap_64(hdr_sz); 2273 if (attr_size != ref_size) 2274 continue; 2275 2276 ph->needs_swap = true; 2277 } 2278 pr_debug("ABI%d perf.data file detected, need_swap=%d\n", 2279 i, 2280 ph->needs_swap); 2281 return 0; 2282 } 2283 /* could not determine endianness */ 2284 return -1; 2285 } 2286 2287 #define PERF_PIPE_HDR_VER0 16 2288 2289 static const size_t attr_pipe_abi_sizes[] = { 2290 [0] = PERF_PIPE_HDR_VER0, 2291 0, 2292 }; 2293 2294 /* 2295 * In the legacy pipe format, there is an implicit assumption that endiannesss 2296 * between host recording the samples, and host parsing the samples is the 2297 * same. This is not always the case given that the pipe output may always be 2298 * redirected into a file and analyzed on a different machine with possibly a 2299 * different endianness and perf_event ABI revsions in the perf tool itself. 2300 */ 2301 static int try_all_pipe_abis(uint64_t hdr_sz, struct perf_header *ph) 2302 { 2303 u64 attr_size; 2304 int i; 2305 2306 for (i = 0 ; attr_pipe_abi_sizes[i]; i++) { 2307 if (hdr_sz != attr_pipe_abi_sizes[i]) { 2308 attr_size = bswap_64(hdr_sz); 2309 if (attr_size != hdr_sz) 2310 continue; 2311 2312 ph->needs_swap = true; 2313 } 2314 pr_debug("Pipe ABI%d perf.data file detected\n", i); 2315 return 0; 2316 } 2317 return -1; 2318 } 2319 2320 bool is_perf_magic(u64 magic) 2321 { 2322 if (!memcmp(&magic, __perf_magic1, sizeof(magic)) 2323 || magic == __perf_magic2 2324 || magic == __perf_magic2_sw) 2325 return true; 2326 2327 return false; 2328 } 2329 2330 static int check_magic_endian(u64 magic, uint64_t hdr_sz, 2331 bool is_pipe, struct perf_header *ph) 2332 { 2333 int ret; 2334 2335 /* check for legacy format */ 2336 ret = memcmp(&magic, __perf_magic1, sizeof(magic)); 2337 if (ret == 0) { 2338 ph->version = PERF_HEADER_VERSION_1; 2339 pr_debug("legacy perf.data format\n"); 2340 if (is_pipe) 2341 return try_all_pipe_abis(hdr_sz, ph); 2342 2343 return try_all_file_abis(hdr_sz, ph); 2344 } 2345 /* 2346 * the new magic number serves two purposes: 2347 * - unique number to identify actual perf.data files 2348 * - encode endianness of file 2349 */ 2350 ph->version = PERF_HEADER_VERSION_2; 2351 2352 /* check magic number with one endianness */ 2353 if (magic == __perf_magic2) 2354 return 0; 2355 2356 /* check magic number with opposite endianness */ 2357 if (magic != __perf_magic2_sw) 2358 return -1; 2359 2360 ph->needs_swap = true; 2361 2362 return 0; 2363 } 2364 2365 int perf_file_header__read(struct perf_file_header *header, 2366 struct perf_header *ph, int fd) 2367 { 2368 ssize_t ret; 2369 2370 lseek(fd, 0, SEEK_SET); 2371 2372 ret = readn(fd, header, sizeof(*header)); 2373 if (ret <= 0) 2374 return -1; 2375 2376 if (check_magic_endian(header->magic, 2377 header->attr_size, false, ph) < 0) { 2378 pr_debug("magic/endian check failed\n"); 2379 return -1; 2380 } 2381 2382 if (ph->needs_swap) { 2383 mem_bswap_64(header, offsetof(struct perf_file_header, 2384 adds_features)); 2385 } 2386 2387 if (header->size != sizeof(*header)) { 2388 /* Support the previous format */ 2389 if (header->size == offsetof(typeof(*header), adds_features)) 2390 bitmap_zero(header->adds_features, HEADER_FEAT_BITS); 2391 else 2392 return -1; 2393 } else if (ph->needs_swap) { 2394 /* 2395 * feature bitmap is declared as an array of unsigned longs -- 2396 * not good since its size can differ between the host that 2397 * generated the data file and the host analyzing the file. 2398 * 2399 * We need to handle endianness, but we don't know the size of 2400 * the unsigned long where the file was generated. Take a best 2401 * guess at determining it: try 64-bit swap first (ie., file 2402 * created on a 64-bit host), and check if the hostname feature 2403 * bit is set (this feature bit is forced on as of fbe96f2). 2404 * If the bit is not, undo the 64-bit swap and try a 32-bit 2405 * swap. If the hostname bit is still not set (e.g., older data 2406 * file), punt and fallback to the original behavior -- 2407 * clearing all feature bits and setting buildid. 2408 */ 2409 mem_bswap_64(&header->adds_features, 2410 BITS_TO_U64(HEADER_FEAT_BITS)); 2411 2412 if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { 2413 /* unswap as u64 */ 2414 mem_bswap_64(&header->adds_features, 2415 BITS_TO_U64(HEADER_FEAT_BITS)); 2416 2417 /* unswap as u32 */ 2418 mem_bswap_32(&header->adds_features, 2419 BITS_TO_U32(HEADER_FEAT_BITS)); 2420 } 2421 2422 if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { 2423 bitmap_zero(header->adds_features, HEADER_FEAT_BITS); 2424 set_bit(HEADER_BUILD_ID, header->adds_features); 2425 } 2426 } 2427 2428 memcpy(&ph->adds_features, &header->adds_features, 2429 sizeof(ph->adds_features)); 2430 2431 ph->data_offset = header->data.offset; 2432 ph->data_size = header->data.size; 2433 ph->feat_offset = header->data.offset + header->data.size; 2434 return 0; 2435 } 2436 2437 static int perf_file_section__process(struct perf_file_section *section, 2438 struct perf_header *ph, 2439 int feat, int fd, void *data) 2440 { 2441 if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { 2442 pr_debug("Failed to lseek to %" PRIu64 " offset for feature " 2443 "%d, continuing...\n", section->offset, feat); 2444 return 0; 2445 } 2446 2447 if (feat >= HEADER_LAST_FEATURE) { 2448 pr_debug("unknown feature %d, continuing...\n", feat); 2449 return 0; 2450 } 2451 2452 if (!feat_ops[feat].process) 2453 return 0; 2454 2455 return feat_ops[feat].process(section, ph, fd, data); 2456 } 2457 2458 static int perf_file_header__read_pipe(struct perf_pipe_file_header *header, 2459 struct perf_header *ph, int fd, 2460 bool repipe) 2461 { 2462 ssize_t ret; 2463 2464 ret = readn(fd, header, sizeof(*header)); 2465 if (ret <= 0) 2466 return -1; 2467 2468 if (check_magic_endian(header->magic, header->size, true, ph) < 0) { 2469 pr_debug("endian/magic failed\n"); 2470 return -1; 2471 } 2472 2473 if (ph->needs_swap) 2474 header->size = bswap_64(header->size); 2475 2476 if (repipe && do_write(STDOUT_FILENO, header, sizeof(*header)) < 0) 2477 return -1; 2478 2479 return 0; 2480 } 2481 2482 static int perf_header__read_pipe(struct perf_session *session) 2483 { 2484 struct perf_header *header = &session->header; 2485 struct perf_pipe_file_header f_header; 2486 2487 if (perf_file_header__read_pipe(&f_header, header, 2488 perf_data_file__fd(session->file), 2489 session->repipe) < 0) { 2490 pr_debug("incompatible file format\n"); 2491 return -EINVAL; 2492 } 2493 2494 return 0; 2495 } 2496 2497 static int read_attr(int fd, struct perf_header *ph, 2498 struct perf_file_attr *f_attr) 2499 { 2500 struct perf_event_attr *attr = &f_attr->attr; 2501 size_t sz, left; 2502 size_t our_sz = sizeof(f_attr->attr); 2503 ssize_t ret; 2504 2505 memset(f_attr, 0, sizeof(*f_attr)); 2506 2507 /* read minimal guaranteed structure */ 2508 ret = readn(fd, attr, PERF_ATTR_SIZE_VER0); 2509 if (ret <= 0) { 2510 pr_debug("cannot read %d bytes of header attr\n", 2511 PERF_ATTR_SIZE_VER0); 2512 return -1; 2513 } 2514 2515 /* on file perf_event_attr size */ 2516 sz = attr->size; 2517 2518 if (ph->needs_swap) 2519 sz = bswap_32(sz); 2520 2521 if (sz == 0) { 2522 /* assume ABI0 */ 2523 sz = PERF_ATTR_SIZE_VER0; 2524 } else if (sz > our_sz) { 2525 pr_debug("file uses a more recent and unsupported ABI" 2526 " (%zu bytes extra)\n", sz - our_sz); 2527 return -1; 2528 } 2529 /* what we have not yet read and that we know about */ 2530 left = sz - PERF_ATTR_SIZE_VER0; 2531 if (left) { 2532 void *ptr = attr; 2533 ptr += PERF_ATTR_SIZE_VER0; 2534 2535 ret = readn(fd, ptr, left); 2536 } 2537 /* read perf_file_section, ids are read in caller */ 2538 ret = readn(fd, &f_attr->ids, sizeof(f_attr->ids)); 2539 2540 return ret <= 0 ? -1 : 0; 2541 } 2542 2543 static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel, 2544 struct pevent *pevent) 2545 { 2546 struct event_format *event; 2547 char bf[128]; 2548 2549 /* already prepared */ 2550 if (evsel->tp_format) 2551 return 0; 2552 2553 if (pevent == NULL) { 2554 pr_debug("broken or missing trace data\n"); 2555 return -1; 2556 } 2557 2558 event = pevent_find_event(pevent, evsel->attr.config); 2559 if (event == NULL) 2560 return -1; 2561 2562 if (!evsel->name) { 2563 snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); 2564 evsel->name = strdup(bf); 2565 if (evsel->name == NULL) 2566 return -1; 2567 } 2568 2569 evsel->tp_format = event; 2570 return 0; 2571 } 2572 2573 static int perf_evlist__prepare_tracepoint_events(struct perf_evlist *evlist, 2574 struct pevent *pevent) 2575 { 2576 struct perf_evsel *pos; 2577 2578 evlist__for_each(evlist, pos) { 2579 if (pos->attr.type == PERF_TYPE_TRACEPOINT && 2580 perf_evsel__prepare_tracepoint_event(pos, pevent)) 2581 return -1; 2582 } 2583 2584 return 0; 2585 } 2586 2587 int perf_session__read_header(struct perf_session *session) 2588 { 2589 struct perf_data_file *file = session->file; 2590 struct perf_header *header = &session->header; 2591 struct perf_file_header f_header; 2592 struct perf_file_attr f_attr; 2593 u64 f_id; 2594 int nr_attrs, nr_ids, i, j; 2595 int fd = perf_data_file__fd(file); 2596 2597 session->evlist = perf_evlist__new(); 2598 if (session->evlist == NULL) 2599 return -ENOMEM; 2600 2601 session->evlist->env = &header->env; 2602 if (perf_data_file__is_pipe(file)) 2603 return perf_header__read_pipe(session); 2604 2605 if (perf_file_header__read(&f_header, header, fd) < 0) 2606 return -EINVAL; 2607 2608 /* 2609 * Sanity check that perf.data was written cleanly; data size is 2610 * initialized to 0 and updated only if the on_exit function is run. 2611 * If data size is still 0 then the file contains only partial 2612 * information. Just warn user and process it as much as it can. 2613 */ 2614 if (f_header.data.size == 0) { 2615 pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n" 2616 "Was the 'perf record' command properly terminated?\n", 2617 file->path); 2618 } 2619 2620 nr_attrs = f_header.attrs.size / f_header.attr_size; 2621 lseek(fd, f_header.attrs.offset, SEEK_SET); 2622 2623 for (i = 0; i < nr_attrs; i++) { 2624 struct perf_evsel *evsel; 2625 off_t tmp; 2626 2627 if (read_attr(fd, header, &f_attr) < 0) 2628 goto out_errno; 2629 2630 if (header->needs_swap) { 2631 f_attr.ids.size = bswap_64(f_attr.ids.size); 2632 f_attr.ids.offset = bswap_64(f_attr.ids.offset); 2633 perf_event__attr_swap(&f_attr.attr); 2634 } 2635 2636 tmp = lseek(fd, 0, SEEK_CUR); 2637 evsel = perf_evsel__new(&f_attr.attr); 2638 2639 if (evsel == NULL) 2640 goto out_delete_evlist; 2641 2642 evsel->needs_swap = header->needs_swap; 2643 /* 2644 * Do it before so that if perf_evsel__alloc_id fails, this 2645 * entry gets purged too at perf_evlist__delete(). 2646 */ 2647 perf_evlist__add(session->evlist, evsel); 2648 2649 nr_ids = f_attr.ids.size / sizeof(u64); 2650 /* 2651 * We don't have the cpu and thread maps on the header, so 2652 * for allocating the perf_sample_id table we fake 1 cpu and 2653 * hattr->ids threads. 2654 */ 2655 if (perf_evsel__alloc_id(evsel, 1, nr_ids)) 2656 goto out_delete_evlist; 2657 2658 lseek(fd, f_attr.ids.offset, SEEK_SET); 2659 2660 for (j = 0; j < nr_ids; j++) { 2661 if (perf_header__getbuffer64(header, fd, &f_id, sizeof(f_id))) 2662 goto out_errno; 2663 2664 perf_evlist__id_add(session->evlist, evsel, 0, j, f_id); 2665 } 2666 2667 lseek(fd, tmp, SEEK_SET); 2668 } 2669 2670 symbol_conf.nr_events = nr_attrs; 2671 2672 perf_header__process_sections(header, fd, &session->tevent, 2673 perf_file_section__process); 2674 2675 if (perf_evlist__prepare_tracepoint_events(session->evlist, 2676 session->tevent.pevent)) 2677 goto out_delete_evlist; 2678 2679 return 0; 2680 out_errno: 2681 return -errno; 2682 2683 out_delete_evlist: 2684 perf_evlist__delete(session->evlist); 2685 session->evlist = NULL; 2686 return -ENOMEM; 2687 } 2688 2689 int perf_event__synthesize_attr(struct perf_tool *tool, 2690 struct perf_event_attr *attr, u32 ids, u64 *id, 2691 perf_event__handler_t process) 2692 { 2693 union perf_event *ev; 2694 size_t size; 2695 int err; 2696 2697 size = sizeof(struct perf_event_attr); 2698 size = PERF_ALIGN(size, sizeof(u64)); 2699 size += sizeof(struct perf_event_header); 2700 size += ids * sizeof(u64); 2701 2702 ev = malloc(size); 2703 2704 if (ev == NULL) 2705 return -ENOMEM; 2706 2707 ev->attr.attr = *attr; 2708 memcpy(ev->attr.id, id, ids * sizeof(u64)); 2709 2710 ev->attr.header.type = PERF_RECORD_HEADER_ATTR; 2711 ev->attr.header.size = (u16)size; 2712 2713 if (ev->attr.header.size == size) 2714 err = process(tool, ev, NULL, NULL); 2715 else 2716 err = -E2BIG; 2717 2718 free(ev); 2719 2720 return err; 2721 } 2722 2723 int perf_event__synthesize_attrs(struct perf_tool *tool, 2724 struct perf_session *session, 2725 perf_event__handler_t process) 2726 { 2727 struct perf_evsel *evsel; 2728 int err = 0; 2729 2730 evlist__for_each(session->evlist, evsel) { 2731 err = perf_event__synthesize_attr(tool, &evsel->attr, evsel->ids, 2732 evsel->id, process); 2733 if (err) { 2734 pr_debug("failed to create perf header attribute\n"); 2735 return err; 2736 } 2737 } 2738 2739 return err; 2740 } 2741 2742 int perf_event__process_attr(struct perf_tool *tool __maybe_unused, 2743 union perf_event *event, 2744 struct perf_evlist **pevlist) 2745 { 2746 u32 i, ids, n_ids; 2747 struct perf_evsel *evsel; 2748 struct perf_evlist *evlist = *pevlist; 2749 2750 if (evlist == NULL) { 2751 *pevlist = evlist = perf_evlist__new(); 2752 if (evlist == NULL) 2753 return -ENOMEM; 2754 } 2755 2756 evsel = perf_evsel__new(&event->attr.attr); 2757 if (evsel == NULL) 2758 return -ENOMEM; 2759 2760 perf_evlist__add(evlist, evsel); 2761 2762 ids = event->header.size; 2763 ids -= (void *)&event->attr.id - (void *)event; 2764 n_ids = ids / sizeof(u64); 2765 /* 2766 * We don't have the cpu and thread maps on the header, so 2767 * for allocating the perf_sample_id table we fake 1 cpu and 2768 * hattr->ids threads. 2769 */ 2770 if (perf_evsel__alloc_id(evsel, 1, n_ids)) 2771 return -ENOMEM; 2772 2773 for (i = 0; i < n_ids; i++) { 2774 perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]); 2775 } 2776 2777 symbol_conf.nr_events = evlist->nr_entries; 2778 2779 return 0; 2780 } 2781 2782 int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, 2783 struct perf_evlist *evlist, 2784 perf_event__handler_t process) 2785 { 2786 union perf_event ev; 2787 struct tracing_data *tdata; 2788 ssize_t size = 0, aligned_size = 0, padding; 2789 int err __maybe_unused = 0; 2790 2791 /* 2792 * We are going to store the size of the data followed 2793 * by the data contents. Since the fd descriptor is a pipe, 2794 * we cannot seek back to store the size of the data once 2795 * we know it. Instead we: 2796 * 2797 * - write the tracing data to the temp file 2798 * - get/write the data size to pipe 2799 * - write the tracing data from the temp file 2800 * to the pipe 2801 */ 2802 tdata = tracing_data_get(&evlist->entries, fd, true); 2803 if (!tdata) 2804 return -1; 2805 2806 memset(&ev, 0, sizeof(ev)); 2807 2808 ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA; 2809 size = tdata->size; 2810 aligned_size = PERF_ALIGN(size, sizeof(u64)); 2811 padding = aligned_size - size; 2812 ev.tracing_data.header.size = sizeof(ev.tracing_data); 2813 ev.tracing_data.size = aligned_size; 2814 2815 process(tool, &ev, NULL, NULL); 2816 2817 /* 2818 * The put function will copy all the tracing data 2819 * stored in temp file to the pipe. 2820 */ 2821 tracing_data_put(tdata); 2822 2823 write_padded(fd, NULL, 0, padding); 2824 2825 return aligned_size; 2826 } 2827 2828 int perf_event__process_tracing_data(struct perf_tool *tool __maybe_unused, 2829 union perf_event *event, 2830 struct perf_session *session) 2831 { 2832 ssize_t size_read, padding, size = event->tracing_data.size; 2833 int fd = perf_data_file__fd(session->file); 2834 off_t offset = lseek(fd, 0, SEEK_CUR); 2835 char buf[BUFSIZ]; 2836 2837 /* setup for reading amidst mmap */ 2838 lseek(fd, offset + sizeof(struct tracing_data_event), 2839 SEEK_SET); 2840 2841 size_read = trace_report(fd, &session->tevent, 2842 session->repipe); 2843 padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read; 2844 2845 if (readn(fd, buf, padding) < 0) { 2846 pr_err("%s: reading input file", __func__); 2847 return -1; 2848 } 2849 if (session->repipe) { 2850 int retw = write(STDOUT_FILENO, buf, padding); 2851 if (retw <= 0 || retw != padding) { 2852 pr_err("%s: repiping tracing data padding", __func__); 2853 return -1; 2854 } 2855 } 2856 2857 if (size_read + padding != size) { 2858 pr_err("%s: tracing data size mismatch", __func__); 2859 return -1; 2860 } 2861 2862 perf_evlist__prepare_tracepoint_events(session->evlist, 2863 session->tevent.pevent); 2864 2865 return size_read + padding; 2866 } 2867 2868 int perf_event__synthesize_build_id(struct perf_tool *tool, 2869 struct dso *pos, u16 misc, 2870 perf_event__handler_t process, 2871 struct machine *machine) 2872 { 2873 union perf_event ev; 2874 size_t len; 2875 int err = 0; 2876 2877 if (!pos->hit) 2878 return err; 2879 2880 memset(&ev, 0, sizeof(ev)); 2881 2882 len = pos->long_name_len + 1; 2883 len = PERF_ALIGN(len, NAME_ALIGN); 2884 memcpy(&ev.build_id.build_id, pos->build_id, sizeof(pos->build_id)); 2885 ev.build_id.header.type = PERF_RECORD_HEADER_BUILD_ID; 2886 ev.build_id.header.misc = misc; 2887 ev.build_id.pid = machine->pid; 2888 ev.build_id.header.size = sizeof(ev.build_id) + len; 2889 memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); 2890 2891 err = process(tool, &ev, NULL, machine); 2892 2893 return err; 2894 } 2895 2896 int perf_event__process_build_id(struct perf_tool *tool __maybe_unused, 2897 union perf_event *event, 2898 struct perf_session *session) 2899 { 2900 __event_process_build_id(&event->build_id, 2901 event->build_id.filename, 2902 session); 2903 return 0; 2904 } 2905