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