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