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