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