~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/util/header.c

Version: ~ [ linux-5.0-rc6 ] ~ [ linux-4.20.10 ] ~ [ linux-4.19.23 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.101 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.158 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.174 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.134 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.63 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp