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