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