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