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