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