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