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