xref: /openbmc/linux/tools/perf/util/session.c (revision 34d6f206a88c2651d216bd3487ac956a40b2ba8e)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2a43783aeSArnaldo Carvalho de Melo #include <errno.h>
3057929f9SIan Rogers #include <signal.h>
4fd20e811SArnaldo Carvalho de Melo #include <inttypes.h>
557fc032aSArnaldo Carvalho de Melo #include <linux/err.h>
694c744b6SArnaldo Carvalho de Melo #include <linux/kernel.h>
77f7c536fSArnaldo Carvalho de Melo #include <linux/zalloc.h>
805a1f47eSAlexander Shishkin #include <api/fs/fs.h>
994c744b6SArnaldo Carvalho de Melo 
10ba21594cSArnaldo Carvalho de Melo #include <byteswap.h>
1194c744b6SArnaldo Carvalho de Melo #include <unistd.h>
1294c744b6SArnaldo Carvalho de Melo #include <sys/types.h>
13a41794cdSArnaldo Carvalho de Melo #include <sys/mman.h>
149c3516d1SJiri Olsa #include <perf/cpumap.h>
1594c744b6SArnaldo Carvalho de Melo 
16d3300a3cSArnaldo Carvalho de Melo #include "map_symbol.h"
17d3300a3cSArnaldo Carvalho de Melo #include "branch.h"
18b4209025SArnaldo Carvalho de Melo #include "debug.h"
1983869019SGerman Gomez #include "env.h"
20e248de33SArnaldo Carvalho de Melo #include "evlist.h"
21e248de33SArnaldo Carvalho de Melo #include "evsel.h"
2298521b38SArnaldo Carvalho de Melo #include "memswap.h"
231101f69aSArnaldo Carvalho de Melo #include "map.h"
24daecf9e0SArnaldo Carvalho de Melo #include "symbol.h"
2594c744b6SArnaldo Carvalho de Melo #include "session.h"
2645694aa7SArnaldo Carvalho de Melo #include "tool.h"
270f6a3015SJiri Olsa #include "perf_regs.h"
28b0a45203SJiri Olsa #include "asm/bug.h"
29c446870dSAdrian Hunter #include "auxtrace.h"
30e7ff8920SArnaldo Carvalho de Melo #include "thread.h"
31a5499b37SAdrian Hunter #include "thread-stack.h"
3293115d32SThomas Richter #include "sample-raw.h"
332d2aea6aSJiri Olsa #include "stat.h"
3481e70d7eSLeo Yan #include "tsc.h"
35171f7474SArnaldo Carvalho de Melo #include "ui/progress.h"
36ea0c5239SIan Rogers #include "util.h"
37ec1891afSAdrian Hunter #include "arch/common.h"
386b9bae63SKan Liang #include "units.h"
39fb71c86cSArnaldo Carvalho de Melo #include <internal/lib.h>
4094c744b6SArnaldo Carvalho de Melo 
41cb62c6f1SAlexey Budankov #ifdef HAVE_ZSTD_SUPPORT
perf_session__process_compressed_event(struct perf_session * session,union perf_event * event,u64 file_offset,const char * file_path)42cb62c6f1SAlexey Budankov static int perf_session__process_compressed_event(struct perf_session *session,
432292083fSAlexey Bayduraev 						  union perf_event *event, u64 file_offset,
442292083fSAlexey Bayduraev 						  const char *file_path)
45cb62c6f1SAlexey Budankov {
46cb62c6f1SAlexey Budankov 	void *src;
47cb62c6f1SAlexey Budankov 	size_t decomp_size, src_size;
48cb62c6f1SAlexey Budankov 	u64 decomp_last_rem = 0;
49872c8ee8SAlexey Budankov 	size_t mmap_len, decomp_len = session->header.env.comp_mmap_len;
503a3535e6SAlexey Bayduraev 	struct decomp *decomp, *decomp_last = session->active_decomp->decomp_last;
51cb62c6f1SAlexey Budankov 
52872c8ee8SAlexey Budankov 	if (decomp_last) {
53872c8ee8SAlexey Budankov 		decomp_last_rem = decomp_last->size - decomp_last->head;
54872c8ee8SAlexey Budankov 		decomp_len += decomp_last_rem;
55872c8ee8SAlexey Budankov 	}
56872c8ee8SAlexey Budankov 
57872c8ee8SAlexey Budankov 	mmap_len = sizeof(struct decomp) + decomp_len;
58872c8ee8SAlexey Budankov 	decomp = mmap(NULL, mmap_len, PROT_READ|PROT_WRITE,
59cb62c6f1SAlexey Budankov 		      MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
60cb62c6f1SAlexey Budankov 	if (decomp == MAP_FAILED) {
61cb62c6f1SAlexey Budankov 		pr_err("Couldn't allocate memory for decompression\n");
62cb62c6f1SAlexey Budankov 		return -1;
63cb62c6f1SAlexey Budankov 	}
64cb62c6f1SAlexey Budankov 
65cb62c6f1SAlexey Budankov 	decomp->file_pos = file_offset;
662292083fSAlexey Bayduraev 	decomp->file_path = file_path;
67872c8ee8SAlexey Budankov 	decomp->mmap_len = mmap_len;
68cb62c6f1SAlexey Budankov 	decomp->head = 0;
69cb62c6f1SAlexey Budankov 
70872c8ee8SAlexey Budankov 	if (decomp_last_rem) {
71cb62c6f1SAlexey Budankov 		memcpy(decomp->data, &(decomp_last->data[decomp_last->head]), decomp_last_rem);
72cb62c6f1SAlexey Budankov 		decomp->size = decomp_last_rem;
73cb62c6f1SAlexey Budankov 	}
74cb62c6f1SAlexey Budankov 
7572932371SJiri Olsa 	src = (void *)event + sizeof(struct perf_record_compressed);
7672932371SJiri Olsa 	src_size = event->pack.header.size - sizeof(struct perf_record_compressed);
77cb62c6f1SAlexey Budankov 
783a3535e6SAlexey Bayduraev 	decomp_size = zstd_decompress_stream(session->active_decomp->zstd_decomp, src, src_size,
79cb62c6f1SAlexey Budankov 				&(decomp->data[decomp_last_rem]), decomp_len - decomp_last_rem);
80cb62c6f1SAlexey Budankov 	if (!decomp_size) {
81872c8ee8SAlexey Budankov 		munmap(decomp, mmap_len);
82cb62c6f1SAlexey Budankov 		pr_err("Couldn't decompress data\n");
83cb62c6f1SAlexey Budankov 		return -1;
84cb62c6f1SAlexey Budankov 	}
85cb62c6f1SAlexey Budankov 
86cb62c6f1SAlexey Budankov 	decomp->size += decomp_size;
87cb62c6f1SAlexey Budankov 
883a3535e6SAlexey Bayduraev 	if (session->active_decomp->decomp == NULL)
893a3535e6SAlexey Bayduraev 		session->active_decomp->decomp = decomp;
903a3535e6SAlexey Bayduraev 	else
913a3535e6SAlexey Bayduraev 		session->active_decomp->decomp_last->next = decomp;
923a3535e6SAlexey Bayduraev 
933a3535e6SAlexey Bayduraev 	session->active_decomp->decomp_last = decomp;
94cb62c6f1SAlexey Budankov 
9520befbb1SChris Wilson 	pr_debug("decomp (B): %zd to %zd\n", src_size, decomp_size);
96cb62c6f1SAlexey Budankov 
97cb62c6f1SAlexey Budankov 	return 0;
98cb62c6f1SAlexey Budankov }
99cb62c6f1SAlexey Budankov #else /* !HAVE_ZSTD_SUPPORT */
100cb62c6f1SAlexey Budankov #define perf_session__process_compressed_event perf_session__process_compressed_event_stub
101cb62c6f1SAlexey Budankov #endif
102cb62c6f1SAlexey Budankov 
103c446870dSAdrian Hunter static int perf_session__deliver_event(struct perf_session *session,
104d10eb1ebSArnaldo Carvalho de Melo 				       union perf_event *event,
105c446870dSAdrian Hunter 				       struct perf_tool *tool,
1062292083fSAlexey Bayduraev 				       u64 file_offset,
1072292083fSAlexey Bayduraev 				       const char *file_path);
108d10eb1ebSArnaldo Carvalho de Melo 
perf_session__open(struct perf_session * session,int repipe_fd)1090ae03893SNamhyung Kim static int perf_session__open(struct perf_session *session, int repipe_fd)
11094c744b6SArnaldo Carvalho de Melo {
1118ceb41d7SJiri Olsa 	struct perf_data *data = session->data;
1128dc58101STom Zanussi 
1130ae03893SNamhyung Kim 	if (perf_session__read_header(session, repipe_fd) < 0) {
114e87b4911SArnaldo Carvalho de Melo 		pr_err("incompatible file format (rerun with -v to learn more)\n");
1156a4d98d7SJiri Olsa 		return -1;
11694c744b6SArnaldo Carvalho de Melo 	}
11794c744b6SArnaldo Carvalho de Melo 
1184ddf437cSIan Rogers 	if (perf_header__has_feat(&session->header, HEADER_AUXTRACE)) {
1194ddf437cSIan Rogers 		/* Auxiliary events may reference exited threads, hold onto dead ones. */
1204ddf437cSIan Rogers 		symbol_conf.keep_exited_threads = true;
1214ddf437cSIan Rogers 	}
1224ddf437cSIan Rogers 
1238ceb41d7SJiri Olsa 	if (perf_data__is_pipe(data))
124cc9784bdSJiri Olsa 		return 0;
125cc9784bdSJiri Olsa 
1263ba78bd0SJiri Olsa 	if (perf_header__has_feat(&session->header, HEADER_STAT))
1273ba78bd0SJiri Olsa 		return 0;
1283ba78bd0SJiri Olsa 
129b3c2cc2bSArnaldo Carvalho de Melo 	if (!evlist__valid_sample_type(session->evlist)) {
130e87b4911SArnaldo Carvalho de Melo 		pr_err("non matching sample_type\n");
1316a4d98d7SJiri Olsa 		return -1;
132c2a70653SArnaldo Carvalho de Melo 	}
133c2a70653SArnaldo Carvalho de Melo 
1348cedf3a5SArnaldo Carvalho de Melo 	if (!evlist__valid_sample_id_all(session->evlist)) {
135e87b4911SArnaldo Carvalho de Melo 		pr_err("non matching sample_id_all\n");
1366a4d98d7SJiri Olsa 		return -1;
137c2a70653SArnaldo Carvalho de Melo 	}
138c2a70653SArnaldo Carvalho de Melo 
13978e1bc25SArnaldo Carvalho de Melo 	if (!evlist__valid_read_format(session->evlist)) {
140e87b4911SArnaldo Carvalho de Melo 		pr_err("non matching read_format\n");
1416a4d98d7SJiri Olsa 		return -1;
1429ede473cSJiri Olsa 	}
1439ede473cSJiri Olsa 
14494c744b6SArnaldo Carvalho de Melo 	return 0;
14594c744b6SArnaldo Carvalho de Melo }
14694c744b6SArnaldo Carvalho de Melo 
perf_session__set_id_hdr_size(struct perf_session * session)1477b56cce2SArnaldo Carvalho de Melo void perf_session__set_id_hdr_size(struct perf_session *session)
1489c90a61cSArnaldo Carvalho de Melo {
1491420ba2fSArnaldo Carvalho de Melo 	u16 id_hdr_size = evlist__id_hdr_size(session->evlist);
1507b56cce2SArnaldo Carvalho de Melo 
1517b56cce2SArnaldo Carvalho de Melo 	machines__set_id_hdr_size(&session->machines, id_hdr_size);
1529c90a61cSArnaldo Carvalho de Melo }
1539c90a61cSArnaldo Carvalho de Melo 
perf_session__create_kernel_maps(struct perf_session * session)154316c7136SArnaldo Carvalho de Melo int perf_session__create_kernel_maps(struct perf_session *session)
155a1645ce1SZhang, Yanmin {
156316c7136SArnaldo Carvalho de Melo 	int ret = machine__create_kernel_maps(&session->machines.host);
157a1645ce1SZhang, Yanmin 
158a1645ce1SZhang, Yanmin 	if (ret >= 0)
159316c7136SArnaldo Carvalho de Melo 		ret = machines__create_guest_kernel_maps(&session->machines);
160a1645ce1SZhang, Yanmin 	return ret;
161a1645ce1SZhang, Yanmin }
162a1645ce1SZhang, Yanmin 
perf_session__destroy_kernel_maps(struct perf_session * session)163316c7136SArnaldo Carvalho de Melo static void perf_session__destroy_kernel_maps(struct perf_session *session)
164076c6e45SArnaldo Carvalho de Melo {
165316c7136SArnaldo Carvalho de Melo 	machines__destroy_kernel_maps(&session->machines);
166076c6e45SArnaldo Carvalho de Melo }
167076c6e45SArnaldo Carvalho de Melo 
perf_session__has_comm_exec(struct perf_session * session)168cfe1c414SAdrian Hunter static bool perf_session__has_comm_exec(struct perf_session *session)
169cfe1c414SAdrian Hunter {
17032dcd021SJiri Olsa 	struct evsel *evsel;
171cfe1c414SAdrian Hunter 
172e5cadb93SArnaldo Carvalho de Melo 	evlist__for_each_entry(session->evlist, evsel) {
1731fc632ceSJiri Olsa 		if (evsel->core.attr.comm_exec)
174cfe1c414SAdrian Hunter 			return true;
175cfe1c414SAdrian Hunter 	}
176cfe1c414SAdrian Hunter 
177cfe1c414SAdrian Hunter 	return false;
178cfe1c414SAdrian Hunter }
179cfe1c414SAdrian Hunter 
perf_session__set_comm_exec(struct perf_session * session)180cfe1c414SAdrian Hunter static void perf_session__set_comm_exec(struct perf_session *session)
181cfe1c414SAdrian Hunter {
182cfe1c414SAdrian Hunter 	bool comm_exec = perf_session__has_comm_exec(session);
183cfe1c414SAdrian Hunter 
184cfe1c414SAdrian Hunter 	machines__set_comm_exec(&session->machines, comm_exec);
185cfe1c414SAdrian Hunter }
186cfe1c414SAdrian Hunter 
ordered_events__deliver_event(struct ordered_events * oe,struct ordered_event * event)187d10eb1ebSArnaldo Carvalho de Melo static int ordered_events__deliver_event(struct ordered_events *oe,
1889870d780SArnaldo Carvalho de Melo 					 struct ordered_event *event)
189d10eb1ebSArnaldo Carvalho de Melo {
1909870d780SArnaldo Carvalho de Melo 	struct perf_session *session = container_of(oe, struct perf_session,
1919870d780SArnaldo Carvalho de Melo 						    ordered_events);
1929870d780SArnaldo Carvalho de Melo 
19393d10af2SJiri Olsa 	return perf_session__deliver_event(session, event->event,
1942292083fSAlexey Bayduraev 					   session->tool, event->file_offset,
1952292083fSAlexey Bayduraev 					   event->file_path);
196d10eb1ebSArnaldo Carvalho de Melo }
197d10eb1ebSArnaldo Carvalho de Melo 
__perf_session__new(struct perf_data * data,bool repipe,int repipe_fd,struct perf_tool * tool)1982681bd85SNamhyung Kim struct perf_session *__perf_session__new(struct perf_data *data,
1990ae03893SNamhyung Kim 					 bool repipe, int repipe_fd,
2002681bd85SNamhyung Kim 					 struct perf_tool *tool)
20194c744b6SArnaldo Carvalho de Melo {
2026ef81c55SMamatha Inamdar 	int ret = -ENOMEM;
203316c7136SArnaldo Carvalho de Melo 	struct perf_session *session = zalloc(sizeof(*session));
204efad1415SRobert Richter 
205316c7136SArnaldo Carvalho de Melo 	if (!session)
20694c744b6SArnaldo Carvalho de Melo 		goto out;
20794c744b6SArnaldo Carvalho de Melo 
208316c7136SArnaldo Carvalho de Melo 	session->repipe = repipe;
2099870d780SArnaldo Carvalho de Melo 	session->tool   = tool;
2103a3535e6SAlexey Bayduraev 	session->decomp_data.zstd_decomp = &session->zstd_data;
2113a3535e6SAlexey Bayduraev 	session->active_decomp = &session->decomp_data;
21299fa2984SAdrian Hunter 	INIT_LIST_HEAD(&session->auxtrace_index);
213316c7136SArnaldo Carvalho de Melo 	machines__init(&session->machines);
214a4a6668aSJiri Olsa 	ordered_events__init(&session->ordered_events,
215a4a6668aSJiri Olsa 			     ordered_events__deliver_event, NULL);
21694c744b6SArnaldo Carvalho de Melo 
217e4378f0cSSong Liu 	perf_env__init(&session->header.env);
2188ceb41d7SJiri Olsa 	if (data) {
2196ef81c55SMamatha Inamdar 		ret = perf_data__open(data);
2206ef81c55SMamatha Inamdar 		if (ret < 0)
2214aa65636SArnaldo Carvalho de Melo 			goto out_delete;
2226a4d98d7SJiri Olsa 
2238ceb41d7SJiri Olsa 		session->data = data;
2246a4d98d7SJiri Olsa 
2258ceb41d7SJiri Olsa 		if (perf_data__is_read(data)) {
2260ae03893SNamhyung Kim 			ret = perf_session__open(session, repipe_fd);
2276ef81c55SMamatha Inamdar 			if (ret < 0)
228befa09b6SJiri Olsa 				goto out_delete;
2296a4d98d7SJiri Olsa 
2300973ad97SDavid Carrillo-Cisneros 			/*
2310973ad97SDavid Carrillo-Cisneros 			 * set session attributes that are present in perf.data
2320973ad97SDavid Carrillo-Cisneros 			 * but not in pipe-mode.
2330973ad97SDavid Carrillo-Cisneros 			 */
2348ceb41d7SJiri Olsa 			if (!data->is_pipe) {
235316c7136SArnaldo Carvalho de Melo 				perf_session__set_id_hdr_size(session);
236cfe1c414SAdrian Hunter 				perf_session__set_comm_exec(session);
2376a4d98d7SJiri Olsa 			}
23893115d32SThomas Richter 
23944d2a557SArnaldo Carvalho de Melo 			evlist__init_trace_event_sample_raw(session->evlist);
240ec65def1SJiri Olsa 
241ec65def1SJiri Olsa 			/* Open the directory data. */
2426ef81c55SMamatha Inamdar 			if (data->is_dir) {
2436ef81c55SMamatha Inamdar 				ret = perf_data__open_dir(data);
2446ef81c55SMamatha Inamdar 				if (ret)
245ec65def1SJiri Olsa 					goto out_delete;
2460973ad97SDavid Carrillo-Cisneros 			}
247eeb399b5SAdrian Hunter 
248eeb399b5SAdrian Hunter 			if (!symbol_conf.kallsyms_name &&
249eeb399b5SAdrian Hunter 			    !symbol_conf.vmlinux_name)
250eeb399b5SAdrian Hunter 				symbol_conf.kallsyms_name = perf_data__kallsyms_name(data);
2516ef81c55SMamatha Inamdar 		}
2524cde998dSArnaldo Carvalho de Melo 	} else  {
2534cde998dSArnaldo Carvalho de Melo 		session->machines.host.env = &perf_env;
2546a4d98d7SJiri Olsa 	}
2556a4d98d7SJiri Olsa 
256ec1891afSAdrian Hunter 	session->machines.host.single_address_space =
257ec1891afSAdrian Hunter 		perf_env__single_address_space(session->machines.host.env);
258ec1891afSAdrian Hunter 
2598ceb41d7SJiri Olsa 	if (!data || perf_data__is_write(data)) {
26064abebf7SArnaldo Carvalho de Melo 		/*
26164abebf7SArnaldo Carvalho de Melo 		 * In O_RDONLY mode this will be performed when reading the
2628115d60cSArnaldo Carvalho de Melo 		 * kernel MMAP event, in perf_event__process_mmap().
26364abebf7SArnaldo Carvalho de Melo 		 */
264316c7136SArnaldo Carvalho de Melo 		if (perf_session__create_kernel_maps(session) < 0)
265a5c2a4c9SAndi Kleen 			pr_warning("Cannot read kernel map\n");
26664abebf7SArnaldo Carvalho de Melo 	}
267d549c769SArnaldo Carvalho de Melo 
2680973ad97SDavid Carrillo-Cisneros 	/*
2690973ad97SDavid Carrillo-Cisneros 	 * In pipe-mode, evlist is empty until PERF_RECORD_HEADER_ATTR is
2708cedf3a5SArnaldo Carvalho de Melo 	 * processed, so evlist__sample_id_all is not meaningful here.
2710973ad97SDavid Carrillo-Cisneros 	 */
2728ceb41d7SJiri Olsa 	if ((!data || !data->is_pipe) && tool && tool->ordering_requires_timestamps &&
2738cedf3a5SArnaldo Carvalho de Melo 	    tool->ordered_events && !evlist__sample_id_all(session->evlist)) {
27421ef97f0SIan Munsie 		dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
2750a8cb85cSJiri Olsa 		tool->ordered_events = false;
276d10eb1ebSArnaldo Carvalho de Melo 	}
27721ef97f0SIan Munsie 
278316c7136SArnaldo Carvalho de Melo 	return session;
2796a4d98d7SJiri Olsa 
2804aa65636SArnaldo Carvalho de Melo  out_delete:
281316c7136SArnaldo Carvalho de Melo 	perf_session__delete(session);
2826a4d98d7SJiri Olsa  out:
2836ef81c55SMamatha Inamdar 	return ERR_PTR(ret);
28494c744b6SArnaldo Carvalho de Melo }
28594c744b6SArnaldo Carvalho de Melo 
perf_decomp__release_events(struct decomp * next)2863a3535e6SAlexey Bayduraev static void perf_decomp__release_events(struct decomp *next)
287cb62c6f1SAlexey Budankov {
2883a3535e6SAlexey Bayduraev 	struct decomp *decomp;
289872c8ee8SAlexey Budankov 	size_t mmap_len;
2903a3535e6SAlexey Bayduraev 
291cb62c6f1SAlexey Budankov 	do {
292cb62c6f1SAlexey Budankov 		decomp = next;
293cb62c6f1SAlexey Budankov 		if (decomp == NULL)
294cb62c6f1SAlexey Budankov 			break;
295cb62c6f1SAlexey Budankov 		next = decomp->next;
296872c8ee8SAlexey Budankov 		mmap_len = decomp->mmap_len;
297872c8ee8SAlexey Budankov 		munmap(decomp, mmap_len);
298cb62c6f1SAlexey Budankov 	} while (1);
299cb62c6f1SAlexey Budankov }
300cb62c6f1SAlexey Budankov 
perf_session__delete(struct perf_session * session)301316c7136SArnaldo Carvalho de Melo void perf_session__delete(struct perf_session *session)
30294c744b6SArnaldo Carvalho de Melo {
303e1446551SArnaldo Carvalho de Melo 	if (session == NULL)
304e1446551SArnaldo Carvalho de Melo 		return;
305c446870dSAdrian Hunter 	auxtrace__free(session);
30699fa2984SAdrian Hunter 	auxtrace_index__free(&session->auxtrace_index);
307316c7136SArnaldo Carvalho de Melo 	perf_session__destroy_kernel_maps(session);
3083a3535e6SAlexey Bayduraev 	perf_decomp__release_events(session->decomp_data.decomp);
309f0ce888cSArnaldo Carvalho de Melo 	perf_env__exit(&session->header.env);
310316c7136SArnaldo Carvalho de Melo 	machines__exit(&session->machines);
311cf96b8e4SRiccardo Mancini 	if (session->data) {
312cf96b8e4SRiccardo Mancini 		if (perf_data__is_read(session->data))
313cf96b8e4SRiccardo Mancini 			evlist__delete(session->evlist);
3148ceb41d7SJiri Olsa 		perf_data__close(session->data);
315cf96b8e4SRiccardo Mancini 	}
316378ef0f5SIan Rogers #ifdef HAVE_LIBTRACEEVENT
317423b9174SRiccardo Mancini 	trace_event__cleanup(&session->tevent);
318378ef0f5SIan Rogers #endif
319316c7136SArnaldo Carvalho de Melo 	free(session);
32094c744b6SArnaldo Carvalho de Melo }
321a328626bSArnaldo Carvalho de Melo 
process_event_synth_tracing_data_stub(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)32289f1688aSJiri Olsa static int process_event_synth_tracing_data_stub(struct perf_session *session
32347c3d109SAdrian Hunter 						 __maybe_unused,
32447c3d109SAdrian Hunter 						 union perf_event *event
3251d037ca1SIrina Tirdea 						 __maybe_unused)
326640c03ceSArnaldo Carvalho de Melo {
327640c03ceSArnaldo Carvalho de Melo 	dump_printf(": unhandled!\n");
328640c03ceSArnaldo Carvalho de Melo 	return 0;
329640c03ceSArnaldo Carvalho de Melo }
330640c03ceSArnaldo Carvalho de Melo 
process_event_synth_attr_stub(struct perf_tool * tool __maybe_unused,union perf_event * event __maybe_unused,struct evlist ** pevlist __maybe_unused)33147c3d109SAdrian Hunter static int process_event_synth_attr_stub(struct perf_tool *tool __maybe_unused,
33247c3d109SAdrian Hunter 					 union perf_event *event __maybe_unused,
33363503dbaSJiri Olsa 					 struct evlist **pevlist
3341d037ca1SIrina Tirdea 					 __maybe_unused)
33510d0f086SArnaldo Carvalho de Melo {
33610d0f086SArnaldo Carvalho de Melo 	dump_printf(": unhandled!\n");
33710d0f086SArnaldo Carvalho de Melo 	return 0;
33810d0f086SArnaldo Carvalho de Melo }
33910d0f086SArnaldo Carvalho de Melo 
process_event_synth_event_update_stub(struct perf_tool * tool __maybe_unused,union perf_event * event __maybe_unused,struct evlist ** pevlist __maybe_unused)340ffe77725SJiri Olsa static int process_event_synth_event_update_stub(struct perf_tool *tool __maybe_unused,
341ffe77725SJiri Olsa 						 union perf_event *event __maybe_unused,
34263503dbaSJiri Olsa 						 struct evlist **pevlist
343ffe77725SJiri Olsa 						 __maybe_unused)
344ffe77725SJiri Olsa {
3452d2aea6aSJiri Olsa 	if (dump_trace)
3462d2aea6aSJiri Olsa 		perf_event__fprintf_event_update(event, stdout);
3472d2aea6aSJiri Olsa 
348ffe77725SJiri Olsa 	dump_printf(": unhandled!\n");
349ffe77725SJiri Olsa 	return 0;
350ffe77725SJiri Olsa }
351ffe77725SJiri Olsa 
process_event_sample_stub(struct perf_tool * tool __maybe_unused,union perf_event * event __maybe_unused,struct perf_sample * sample __maybe_unused,struct evsel * evsel __maybe_unused,struct machine * machine __maybe_unused)3521d037ca1SIrina Tirdea static int process_event_sample_stub(struct perf_tool *tool __maybe_unused,
3531d037ca1SIrina Tirdea 				     union perf_event *event __maybe_unused,
3541d037ca1SIrina Tirdea 				     struct perf_sample *sample __maybe_unused,
35532dcd021SJiri Olsa 				     struct evsel *evsel __maybe_unused,
3561d037ca1SIrina Tirdea 				     struct machine *machine __maybe_unused)
3579e69c210SArnaldo Carvalho de Melo {
3589e69c210SArnaldo Carvalho de Melo 	dump_printf(": unhandled!\n");
3599e69c210SArnaldo Carvalho de Melo 	return 0;
3609e69c210SArnaldo Carvalho de Melo }
3619e69c210SArnaldo Carvalho de Melo 
process_event_stub(struct perf_tool * tool __maybe_unused,union perf_event * event __maybe_unused,struct perf_sample * sample __maybe_unused,struct machine * machine __maybe_unused)3621d037ca1SIrina Tirdea static int process_event_stub(struct perf_tool *tool __maybe_unused,
3631d037ca1SIrina Tirdea 			      union perf_event *event __maybe_unused,
3641d037ca1SIrina Tirdea 			      struct perf_sample *sample __maybe_unused,
3651d037ca1SIrina Tirdea 			      struct machine *machine __maybe_unused)
36606aae590SArnaldo Carvalho de Melo {
36706aae590SArnaldo Carvalho de Melo 	dump_printf(": unhandled!\n");
36806aae590SArnaldo Carvalho de Melo 	return 0;
36906aae590SArnaldo Carvalho de Melo }
37006aae590SArnaldo Carvalho de Melo 
process_finished_round_stub(struct perf_tool * tool __maybe_unused,union perf_event * event __maybe_unused,struct ordered_events * oe __maybe_unused)3711d037ca1SIrina Tirdea static int process_finished_round_stub(struct perf_tool *tool __maybe_unused,
3721d037ca1SIrina Tirdea 				       union perf_event *event __maybe_unused,
373d704ebdaSArnaldo Carvalho de Melo 				       struct ordered_events *oe __maybe_unused)
374743eb868SArnaldo Carvalho de Melo {
375743eb868SArnaldo Carvalho de Melo 	dump_printf(": unhandled!\n");
376743eb868SArnaldo Carvalho de Melo 	return 0;
377743eb868SArnaldo Carvalho de Melo }
378743eb868SArnaldo Carvalho de Melo 
skipn(int fd,off_t n)379a16ac023SAdrian Hunter static int skipn(int fd, off_t n)
380a16ac023SAdrian Hunter {
381a16ac023SAdrian Hunter 	char buf[4096];
382a16ac023SAdrian Hunter 	ssize_t ret;
383a16ac023SAdrian Hunter 
384a16ac023SAdrian Hunter 	while (n > 0) {
385a16ac023SAdrian Hunter 		ret = read(fd, buf, min(n, (off_t)sizeof(buf)));
386a16ac023SAdrian Hunter 		if (ret <= 0)
387a16ac023SAdrian Hunter 			return ret;
388a16ac023SAdrian Hunter 		n -= ret;
389a16ac023SAdrian Hunter 	}
390a16ac023SAdrian Hunter 
391a16ac023SAdrian Hunter 	return 0;
392a16ac023SAdrian Hunter }
393a16ac023SAdrian Hunter 
process_event_auxtrace_stub(struct perf_session * session __maybe_unused,union perf_event * event)3947336555aSJiri Olsa static s64 process_event_auxtrace_stub(struct perf_session *session __maybe_unused,
3957336555aSJiri Olsa 				       union perf_event *event)
396a16ac023SAdrian Hunter {
397a16ac023SAdrian Hunter 	dump_printf(": unhandled!\n");
3988ceb41d7SJiri Olsa 	if (perf_data__is_pipe(session->data))
3998ceb41d7SJiri Olsa 		skipn(perf_data__fd(session->data), event->auxtrace.size);
400a16ac023SAdrian Hunter 	return event->auxtrace.size;
401a16ac023SAdrian Hunter }
402a16ac023SAdrian Hunter 
process_event_op2_stub(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)40389f1688aSJiri Olsa static int process_event_op2_stub(struct perf_session *session __maybe_unused,
40489f1688aSJiri Olsa 				  union perf_event *event __maybe_unused)
405e9bf54d2SAdrian Hunter {
406e9bf54d2SAdrian Hunter 	dump_printf(": unhandled!\n");
407e9bf54d2SAdrian Hunter 	return 0;
408e9bf54d2SAdrian Hunter }
409e9bf54d2SAdrian Hunter 
4105f3339d2SJiri Olsa 
4115f3339d2SJiri Olsa static
process_event_thread_map_stub(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)41289f1688aSJiri Olsa int process_event_thread_map_stub(struct perf_session *session __maybe_unused,
41389f1688aSJiri Olsa 				  union perf_event *event __maybe_unused)
4145f3339d2SJiri Olsa {
4152d2aea6aSJiri Olsa 	if (dump_trace)
4162d2aea6aSJiri Olsa 		perf_event__fprintf_thread_map(event, stdout);
4172d2aea6aSJiri Olsa 
4185f3339d2SJiri Olsa 	dump_printf(": unhandled!\n");
4195f3339d2SJiri Olsa 	return 0;
4205f3339d2SJiri Olsa }
4215f3339d2SJiri Olsa 
4226640b6c2SJiri Olsa static
process_event_cpu_map_stub(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)42389f1688aSJiri Olsa int process_event_cpu_map_stub(struct perf_session *session __maybe_unused,
42489f1688aSJiri Olsa 			       union perf_event *event __maybe_unused)
4256640b6c2SJiri Olsa {
4262d2aea6aSJiri Olsa 	if (dump_trace)
4272d2aea6aSJiri Olsa 		perf_event__fprintf_cpu_map(event, stdout);
4282d2aea6aSJiri Olsa 
4296640b6c2SJiri Olsa 	dump_printf(": unhandled!\n");
4306640b6c2SJiri Olsa 	return 0;
4316640b6c2SJiri Olsa }
4326640b6c2SJiri Olsa 
433374fb9e3SJiri Olsa static
process_event_stat_config_stub(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)43489f1688aSJiri Olsa int process_event_stat_config_stub(struct perf_session *session __maybe_unused,
43589f1688aSJiri Olsa 				   union perf_event *event __maybe_unused)
436374fb9e3SJiri Olsa {
4372d2aea6aSJiri Olsa 	if (dump_trace)
4382d2aea6aSJiri Olsa 		perf_event__fprintf_stat_config(event, stdout);
4392d2aea6aSJiri Olsa 
440374fb9e3SJiri Olsa 	dump_printf(": unhandled!\n");
441374fb9e3SJiri Olsa 	return 0;
442374fb9e3SJiri Olsa }
443374fb9e3SJiri Olsa 
process_stat_stub(struct perf_session * perf_session __maybe_unused,union perf_event * event)44489f1688aSJiri Olsa static int process_stat_stub(struct perf_session *perf_session __maybe_unused,
44589f1688aSJiri Olsa 			     union perf_event *event)
446d80518c9SJiri Olsa {
4472d2aea6aSJiri Olsa 	if (dump_trace)
4482d2aea6aSJiri Olsa 		perf_event__fprintf_stat(event, stdout);
4492d2aea6aSJiri Olsa 
450d80518c9SJiri Olsa 	dump_printf(": unhandled!\n");
451d80518c9SJiri Olsa 	return 0;
452d80518c9SJiri Olsa }
453d80518c9SJiri Olsa 
process_stat_round_stub(struct perf_session * perf_session __maybe_unused,union perf_event * event)45489f1688aSJiri Olsa static int process_stat_round_stub(struct perf_session *perf_session __maybe_unused,
45589f1688aSJiri Olsa 				   union perf_event *event)
4562d8f0f18SJiri Olsa {
4572d2aea6aSJiri Olsa 	if (dump_trace)
4582d2aea6aSJiri Olsa 		perf_event__fprintf_stat_round(event, stdout);
4592d2aea6aSJiri Olsa 
4602d8f0f18SJiri Olsa 	dump_printf(": unhandled!\n");
4612d8f0f18SJiri Olsa 	return 0;
4622d8f0f18SJiri Olsa }
4632d8f0f18SJiri Olsa 
process_event_time_conv_stub(struct perf_session * perf_session __maybe_unused,union perf_event * event)46481e70d7eSLeo Yan static int process_event_time_conv_stub(struct perf_session *perf_session __maybe_unused,
46581e70d7eSLeo Yan 					union perf_event *event)
46681e70d7eSLeo Yan {
46781e70d7eSLeo Yan 	if (dump_trace)
46881e70d7eSLeo Yan 		perf_event__fprintf_time_conv(event, stdout);
46981e70d7eSLeo Yan 
47081e70d7eSLeo Yan 	dump_printf(": unhandled!\n");
47181e70d7eSLeo Yan 	return 0;
47281e70d7eSLeo Yan }
47381e70d7eSLeo Yan 
perf_session__process_compressed_event_stub(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused,u64 file_offset __maybe_unused,const char * file_path __maybe_unused)47461a7773cSAlexey Budankov static int perf_session__process_compressed_event_stub(struct perf_session *session __maybe_unused,
47561a7773cSAlexey Budankov 						       union perf_event *event __maybe_unused,
4762292083fSAlexey Bayduraev 						       u64 file_offset __maybe_unused,
4772292083fSAlexey Bayduraev 						       const char *file_path __maybe_unused)
47861a7773cSAlexey Budankov {
47961a7773cSAlexey Budankov        dump_printf(": unhandled!\n");
48061a7773cSAlexey Budankov        return 0;
48161a7773cSAlexey Budankov }
48261a7773cSAlexey Budankov 
perf_tool__fill_defaults(struct perf_tool * tool)4839c501402SDavid Ahern void perf_tool__fill_defaults(struct perf_tool *tool)
48406aae590SArnaldo Carvalho de Melo {
48545694aa7SArnaldo Carvalho de Melo 	if (tool->sample == NULL)
48645694aa7SArnaldo Carvalho de Melo 		tool->sample = process_event_sample_stub;
48745694aa7SArnaldo Carvalho de Melo 	if (tool->mmap == NULL)
48845694aa7SArnaldo Carvalho de Melo 		tool->mmap = process_event_stub;
4896adb0b0aSDavid Ahern 	if (tool->mmap2 == NULL)
4906adb0b0aSDavid Ahern 		tool->mmap2 = process_event_stub;
49145694aa7SArnaldo Carvalho de Melo 	if (tool->comm == NULL)
49245694aa7SArnaldo Carvalho de Melo 		tool->comm = process_event_stub;
4937f0cd236SNamhyung Kim 	if (tool->namespaces == NULL)
4947f0cd236SNamhyung Kim 		tool->namespaces = process_event_stub;
495ba78c1c5SNamhyung Kim 	if (tool->cgroup == NULL)
496ba78c1c5SNamhyung Kim 		tool->cgroup = process_event_stub;
49745694aa7SArnaldo Carvalho de Melo 	if (tool->fork == NULL)
49845694aa7SArnaldo Carvalho de Melo 		tool->fork = process_event_stub;
49945694aa7SArnaldo Carvalho de Melo 	if (tool->exit == NULL)
50045694aa7SArnaldo Carvalho de Melo 		tool->exit = process_event_stub;
50145694aa7SArnaldo Carvalho de Melo 	if (tool->lost == NULL)
50245694aa7SArnaldo Carvalho de Melo 		tool->lost = perf_event__process_lost;
503c4937a91SKan Liang 	if (tool->lost_samples == NULL)
504c4937a91SKan Liang 		tool->lost_samples = perf_event__process_lost_samples;
5054a96f7a0SAdrian Hunter 	if (tool->aux == NULL)
5064a96f7a0SAdrian Hunter 		tool->aux = perf_event__process_aux;
5070ad21f68SAdrian Hunter 	if (tool->itrace_start == NULL)
5080ad21f68SAdrian Hunter 		tool->itrace_start = perf_event__process_itrace_start;
5090286039fSAdrian Hunter 	if (tool->context_switch == NULL)
5100286039fSAdrian Hunter 		tool->context_switch = perf_event__process_switch;
5119aa0bfa3SSong Liu 	if (tool->ksymbol == NULL)
5129aa0bfa3SSong Liu 		tool->ksymbol = perf_event__process_ksymbol;
5133f604b5fSArnaldo Carvalho de Melo 	if (tool->bpf == NULL)
5143f604b5fSArnaldo Carvalho de Melo 		tool->bpf = perf_event__process_bpf;
515246eba8eSAdrian Hunter 	if (tool->text_poke == NULL)
516246eba8eSAdrian Hunter 		tool->text_poke = perf_event__process_text_poke;
51761750473SAdrian Hunter 	if (tool->aux_output_hw_id == NULL)
51861750473SAdrian Hunter 		tool->aux_output_hw_id = perf_event__process_aux_output_hw_id;
51945694aa7SArnaldo Carvalho de Melo 	if (tool->read == NULL)
52045694aa7SArnaldo Carvalho de Melo 		tool->read = process_event_sample_stub;
52145694aa7SArnaldo Carvalho de Melo 	if (tool->throttle == NULL)
52245694aa7SArnaldo Carvalho de Melo 		tool->throttle = process_event_stub;
52345694aa7SArnaldo Carvalho de Melo 	if (tool->unthrottle == NULL)
52445694aa7SArnaldo Carvalho de Melo 		tool->unthrottle = process_event_stub;
52545694aa7SArnaldo Carvalho de Melo 	if (tool->attr == NULL)
52645694aa7SArnaldo Carvalho de Melo 		tool->attr = process_event_synth_attr_stub;
527ffe77725SJiri Olsa 	if (tool->event_update == NULL)
528ffe77725SJiri Olsa 		tool->event_update = process_event_synth_event_update_stub;
52945694aa7SArnaldo Carvalho de Melo 	if (tool->tracing_data == NULL)
53045694aa7SArnaldo Carvalho de Melo 		tool->tracing_data = process_event_synth_tracing_data_stub;
53145694aa7SArnaldo Carvalho de Melo 	if (tool->build_id == NULL)
5325fb0ac16SAdrian Hunter 		tool->build_id = process_event_op2_stub;
53345694aa7SArnaldo Carvalho de Melo 	if (tool->finished_round == NULL) {
5340a8cb85cSJiri Olsa 		if (tool->ordered_events)
535eddc6e3fSAdrian Hunter 			tool->finished_round = perf_event__process_finished_round;
536d6b17bebSFrederic Weisbecker 		else
53745694aa7SArnaldo Carvalho de Melo 			tool->finished_round = process_finished_round_stub;
538d6b17bebSFrederic Weisbecker 	}
5393c659eedSAdrian Hunter 	if (tool->id_index == NULL)
5405fb0ac16SAdrian Hunter 		tool->id_index = process_event_op2_stub;
541a16ac023SAdrian Hunter 	if (tool->auxtrace_info == NULL)
5425fb0ac16SAdrian Hunter 		tool->auxtrace_info = process_event_op2_stub;
543a16ac023SAdrian Hunter 	if (tool->auxtrace == NULL)
544a16ac023SAdrian Hunter 		tool->auxtrace = process_event_auxtrace_stub;
545e9bf54d2SAdrian Hunter 	if (tool->auxtrace_error == NULL)
5465fb0ac16SAdrian Hunter 		tool->auxtrace_error = process_event_op2_stub;
5475f3339d2SJiri Olsa 	if (tool->thread_map == NULL)
5485f3339d2SJiri Olsa 		tool->thread_map = process_event_thread_map_stub;
5496640b6c2SJiri Olsa 	if (tool->cpu_map == NULL)
5506640b6c2SJiri Olsa 		tool->cpu_map = process_event_cpu_map_stub;
551374fb9e3SJiri Olsa 	if (tool->stat_config == NULL)
552374fb9e3SJiri Olsa 		tool->stat_config = process_event_stat_config_stub;
553d80518c9SJiri Olsa 	if (tool->stat == NULL)
554d80518c9SJiri Olsa 		tool->stat = process_stat_stub;
5552d8f0f18SJiri Olsa 	if (tool->stat_round == NULL)
5562d8f0f18SJiri Olsa 		tool->stat_round = process_stat_round_stub;
55746bc29b9SAdrian Hunter 	if (tool->time_conv == NULL)
55881e70d7eSLeo Yan 		tool->time_conv = process_event_time_conv_stub;
559e9def1b2SDavid Carrillo-Cisneros 	if (tool->feature == NULL)
560e9def1b2SDavid Carrillo-Cisneros 		tool->feature = process_event_op2_stub;
56161a7773cSAlexey Budankov 	if (tool->compressed == NULL)
562cb62c6f1SAlexey Budankov 		tool->compressed = perf_session__process_compressed_event;
5633812d298SAdrian Hunter 	if (tool->finished_init == NULL)
5643812d298SAdrian Hunter 		tool->finished_init = process_event_op2_stub;
56506aae590SArnaldo Carvalho de Melo }
56680c0120aSDavid Ahern 
swap_sample_id_all(union perf_event * event,void * data)567268fb20fSJiri Olsa static void swap_sample_id_all(union perf_event *event, void *data)
568268fb20fSJiri Olsa {
569268fb20fSJiri Olsa 	void *end = (void *) event + event->header.size;
570268fb20fSJiri Olsa 	int size = end - data;
571268fb20fSJiri Olsa 
572268fb20fSJiri Olsa 	BUG_ON(size % sizeof(u64));
573268fb20fSJiri Olsa 	mem_bswap_64(data, size);
574268fb20fSJiri Olsa }
575268fb20fSJiri Olsa 
perf_event__all64_swap(union perf_event * event,bool sample_id_all __maybe_unused)576268fb20fSJiri Olsa static void perf_event__all64_swap(union perf_event *event,
5771d037ca1SIrina Tirdea 				   bool sample_id_all __maybe_unused)
578ba21594cSArnaldo Carvalho de Melo {
5798115d60cSArnaldo Carvalho de Melo 	struct perf_event_header *hdr = &event->header;
5808115d60cSArnaldo Carvalho de Melo 	mem_bswap_64(hdr + 1, event->header.size - sizeof(*hdr));
581ba21594cSArnaldo Carvalho de Melo }
582ba21594cSArnaldo Carvalho de Melo 
perf_event__comm_swap(union perf_event * event,bool sample_id_all)583268fb20fSJiri Olsa static void perf_event__comm_swap(union perf_event *event, bool sample_id_all)
584ba21594cSArnaldo Carvalho de Melo {
5858115d60cSArnaldo Carvalho de Melo 	event->comm.pid = bswap_32(event->comm.pid);
5868115d60cSArnaldo Carvalho de Melo 	event->comm.tid = bswap_32(event->comm.tid);
587268fb20fSJiri Olsa 
588268fb20fSJiri Olsa 	if (sample_id_all) {
589268fb20fSJiri Olsa 		void *data = &event->comm.comm;
590268fb20fSJiri Olsa 
5919ac3e487SIrina Tirdea 		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
592268fb20fSJiri Olsa 		swap_sample_id_all(event, data);
593268fb20fSJiri Olsa 	}
594ba21594cSArnaldo Carvalho de Melo }
595ba21594cSArnaldo Carvalho de Melo 
perf_event__mmap_swap(union perf_event * event,bool sample_id_all)596268fb20fSJiri Olsa static void perf_event__mmap_swap(union perf_event *event,
597268fb20fSJiri Olsa 				  bool sample_id_all)
598ba21594cSArnaldo Carvalho de Melo {
5998115d60cSArnaldo Carvalho de Melo 	event->mmap.pid	  = bswap_32(event->mmap.pid);
6008115d60cSArnaldo Carvalho de Melo 	event->mmap.tid	  = bswap_32(event->mmap.tid);
6018115d60cSArnaldo Carvalho de Melo 	event->mmap.start = bswap_64(event->mmap.start);
6028115d60cSArnaldo Carvalho de Melo 	event->mmap.len	  = bswap_64(event->mmap.len);
6038115d60cSArnaldo Carvalho de Melo 	event->mmap.pgoff = bswap_64(event->mmap.pgoff);
604268fb20fSJiri Olsa 
605268fb20fSJiri Olsa 	if (sample_id_all) {
606268fb20fSJiri Olsa 		void *data = &event->mmap.filename;
607268fb20fSJiri Olsa 
6089ac3e487SIrina Tirdea 		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
609268fb20fSJiri Olsa 		swap_sample_id_all(event, data);
610268fb20fSJiri Olsa 	}
611ba21594cSArnaldo Carvalho de Melo }
612ba21594cSArnaldo Carvalho de Melo 
perf_event__mmap2_swap(union perf_event * event,bool sample_id_all)6135c5e854bSStephane Eranian static void perf_event__mmap2_swap(union perf_event *event,
6145c5e854bSStephane Eranian 				  bool sample_id_all)
6155c5e854bSStephane Eranian {
6165c5e854bSStephane Eranian 	event->mmap2.pid   = bswap_32(event->mmap2.pid);
6175c5e854bSStephane Eranian 	event->mmap2.tid   = bswap_32(event->mmap2.tid);
6185c5e854bSStephane Eranian 	event->mmap2.start = bswap_64(event->mmap2.start);
6195c5e854bSStephane Eranian 	event->mmap2.len   = bswap_64(event->mmap2.len);
6205c5e854bSStephane Eranian 	event->mmap2.pgoff = bswap_64(event->mmap2.pgoff);
62129245ae8SJiri Olsa 
62229245ae8SJiri Olsa 	if (!(event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID)) {
6235c5e854bSStephane Eranian 		event->mmap2.maj   = bswap_32(event->mmap2.maj);
6245c5e854bSStephane Eranian 		event->mmap2.min   = bswap_32(event->mmap2.min);
6255c5e854bSStephane Eranian 		event->mmap2.ino   = bswap_64(event->mmap2.ino);
626fe01adb7SJiri Olsa 		event->mmap2.ino_generation = bswap_64(event->mmap2.ino_generation);
62729245ae8SJiri Olsa 	}
6285c5e854bSStephane Eranian 
6295c5e854bSStephane Eranian 	if (sample_id_all) {
6305c5e854bSStephane Eranian 		void *data = &event->mmap2.filename;
6315c5e854bSStephane Eranian 
6325c5e854bSStephane Eranian 		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
6335c5e854bSStephane Eranian 		swap_sample_id_all(event, data);
6345c5e854bSStephane Eranian 	}
6355c5e854bSStephane Eranian }
perf_event__task_swap(union perf_event * event,bool sample_id_all)636268fb20fSJiri Olsa static void perf_event__task_swap(union perf_event *event, bool sample_id_all)
637ba21594cSArnaldo Carvalho de Melo {
6388115d60cSArnaldo Carvalho de Melo 	event->fork.pid	 = bswap_32(event->fork.pid);
6398115d60cSArnaldo Carvalho de Melo 	event->fork.tid	 = bswap_32(event->fork.tid);
6408115d60cSArnaldo Carvalho de Melo 	event->fork.ppid = bswap_32(event->fork.ppid);
6418115d60cSArnaldo Carvalho de Melo 	event->fork.ptid = bswap_32(event->fork.ptid);
6428115d60cSArnaldo Carvalho de Melo 	event->fork.time = bswap_64(event->fork.time);
643268fb20fSJiri Olsa 
644268fb20fSJiri Olsa 	if (sample_id_all)
645268fb20fSJiri Olsa 		swap_sample_id_all(event, &event->fork + 1);
646ba21594cSArnaldo Carvalho de Melo }
647ba21594cSArnaldo Carvalho de Melo 
perf_event__read_swap(union perf_event * event,bool sample_id_all)648268fb20fSJiri Olsa static void perf_event__read_swap(union perf_event *event, bool sample_id_all)
649ba21594cSArnaldo Carvalho de Melo {
6508115d60cSArnaldo Carvalho de Melo 	event->read.pid		 = bswap_32(event->read.pid);
6518115d60cSArnaldo Carvalho de Melo 	event->read.tid		 = bswap_32(event->read.tid);
6528115d60cSArnaldo Carvalho de Melo 	event->read.value	 = bswap_64(event->read.value);
6538115d60cSArnaldo Carvalho de Melo 	event->read.time_enabled = bswap_64(event->read.time_enabled);
6548115d60cSArnaldo Carvalho de Melo 	event->read.time_running = bswap_64(event->read.time_running);
6558115d60cSArnaldo Carvalho de Melo 	event->read.id		 = bswap_64(event->read.id);
656268fb20fSJiri Olsa 
657268fb20fSJiri Olsa 	if (sample_id_all)
658268fb20fSJiri Olsa 		swap_sample_id_all(event, &event->read + 1);
659ba21594cSArnaldo Carvalho de Melo }
660ba21594cSArnaldo Carvalho de Melo 
perf_event__aux_swap(union perf_event * event,bool sample_id_all)6614a96f7a0SAdrian Hunter static void perf_event__aux_swap(union perf_event *event, bool sample_id_all)
6624a96f7a0SAdrian Hunter {
6634a96f7a0SAdrian Hunter 	event->aux.aux_offset = bswap_64(event->aux.aux_offset);
6644a96f7a0SAdrian Hunter 	event->aux.aux_size   = bswap_64(event->aux.aux_size);
6654a96f7a0SAdrian Hunter 	event->aux.flags      = bswap_64(event->aux.flags);
6664a96f7a0SAdrian Hunter 
6674a96f7a0SAdrian Hunter 	if (sample_id_all)
6684a96f7a0SAdrian Hunter 		swap_sample_id_all(event, &event->aux + 1);
6694a96f7a0SAdrian Hunter }
6704a96f7a0SAdrian Hunter 
perf_event__itrace_start_swap(union perf_event * event,bool sample_id_all)6710ad21f68SAdrian Hunter static void perf_event__itrace_start_swap(union perf_event *event,
6720ad21f68SAdrian Hunter 					  bool sample_id_all)
6730ad21f68SAdrian Hunter {
6740ad21f68SAdrian Hunter 	event->itrace_start.pid	 = bswap_32(event->itrace_start.pid);
6750ad21f68SAdrian Hunter 	event->itrace_start.tid	 = bswap_32(event->itrace_start.tid);
6760ad21f68SAdrian Hunter 
6770ad21f68SAdrian Hunter 	if (sample_id_all)
6780ad21f68SAdrian Hunter 		swap_sample_id_all(event, &event->itrace_start + 1);
6790ad21f68SAdrian Hunter }
6800ad21f68SAdrian Hunter 
perf_event__switch_swap(union perf_event * event,bool sample_id_all)6810286039fSAdrian Hunter static void perf_event__switch_swap(union perf_event *event, bool sample_id_all)
6820286039fSAdrian Hunter {
6830286039fSAdrian Hunter 	if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE) {
6840286039fSAdrian Hunter 		event->context_switch.next_prev_pid =
6850286039fSAdrian Hunter 				bswap_32(event->context_switch.next_prev_pid);
6860286039fSAdrian Hunter 		event->context_switch.next_prev_tid =
6870286039fSAdrian Hunter 				bswap_32(event->context_switch.next_prev_tid);
6880286039fSAdrian Hunter 	}
6890286039fSAdrian Hunter 
6900286039fSAdrian Hunter 	if (sample_id_all)
6910286039fSAdrian Hunter 		swap_sample_id_all(event, &event->context_switch + 1);
6920286039fSAdrian Hunter }
6930286039fSAdrian Hunter 
perf_event__text_poke_swap(union perf_event * event,bool sample_id_all)694246eba8eSAdrian Hunter static void perf_event__text_poke_swap(union perf_event *event, bool sample_id_all)
695246eba8eSAdrian Hunter {
696246eba8eSAdrian Hunter 	event->text_poke.addr    = bswap_64(event->text_poke.addr);
697246eba8eSAdrian Hunter 	event->text_poke.old_len = bswap_16(event->text_poke.old_len);
698246eba8eSAdrian Hunter 	event->text_poke.new_len = bswap_16(event->text_poke.new_len);
699246eba8eSAdrian Hunter 
700246eba8eSAdrian Hunter 	if (sample_id_all) {
701246eba8eSAdrian Hunter 		size_t len = sizeof(event->text_poke.old_len) +
702246eba8eSAdrian Hunter 			     sizeof(event->text_poke.new_len) +
703246eba8eSAdrian Hunter 			     event->text_poke.old_len +
704246eba8eSAdrian Hunter 			     event->text_poke.new_len;
705246eba8eSAdrian Hunter 		void *data = &event->text_poke.old_len;
706246eba8eSAdrian Hunter 
707246eba8eSAdrian Hunter 		data += PERF_ALIGN(len, sizeof(u64));
708246eba8eSAdrian Hunter 		swap_sample_id_all(event, data);
709246eba8eSAdrian Hunter 	}
710246eba8eSAdrian Hunter }
711246eba8eSAdrian Hunter 
perf_event__throttle_swap(union perf_event * event,bool sample_id_all)712dd96c46bSJiri Olsa static void perf_event__throttle_swap(union perf_event *event,
713dd96c46bSJiri Olsa 				      bool sample_id_all)
714dd96c46bSJiri Olsa {
715dd96c46bSJiri Olsa 	event->throttle.time	  = bswap_64(event->throttle.time);
716dd96c46bSJiri Olsa 	event->throttle.id	  = bswap_64(event->throttle.id);
717dd96c46bSJiri Olsa 	event->throttle.stream_id = bswap_64(event->throttle.stream_id);
718dd96c46bSJiri Olsa 
719dd96c46bSJiri Olsa 	if (sample_id_all)
720dd96c46bSJiri Olsa 		swap_sample_id_all(event, &event->throttle + 1);
721dd96c46bSJiri Olsa }
722dd96c46bSJiri Olsa 
perf_event__namespaces_swap(union perf_event * event,bool sample_id_all)723acd244b8SNamhyung Kim static void perf_event__namespaces_swap(union perf_event *event,
724acd244b8SNamhyung Kim 					bool sample_id_all)
725acd244b8SNamhyung Kim {
726acd244b8SNamhyung Kim 	u64 i;
727acd244b8SNamhyung Kim 
728acd244b8SNamhyung Kim 	event->namespaces.pid		= bswap_32(event->namespaces.pid);
729acd244b8SNamhyung Kim 	event->namespaces.tid		= bswap_32(event->namespaces.tid);
730acd244b8SNamhyung Kim 	event->namespaces.nr_namespaces	= bswap_64(event->namespaces.nr_namespaces);
731acd244b8SNamhyung Kim 
732acd244b8SNamhyung Kim 	for (i = 0; i < event->namespaces.nr_namespaces; i++) {
733acd244b8SNamhyung Kim 		struct perf_ns_link_info *ns = &event->namespaces.link_info[i];
734acd244b8SNamhyung Kim 
735acd244b8SNamhyung Kim 		ns->dev = bswap_64(ns->dev);
736acd244b8SNamhyung Kim 		ns->ino = bswap_64(ns->ino);
737acd244b8SNamhyung Kim 	}
738acd244b8SNamhyung Kim 
739acd244b8SNamhyung Kim 	if (sample_id_all)
740acd244b8SNamhyung Kim 		swap_sample_id_all(event, &event->namespaces.link_info[i]);
741acd244b8SNamhyung Kim }
742acd244b8SNamhyung Kim 
perf_event__cgroup_swap(union perf_event * event,bool sample_id_all)7432c589d93SNamhyung Kim static void perf_event__cgroup_swap(union perf_event *event, bool sample_id_all)
7442c589d93SNamhyung Kim {
7452c589d93SNamhyung Kim 	event->cgroup.id = bswap_64(event->cgroup.id);
7462c589d93SNamhyung Kim 
7472c589d93SNamhyung Kim 	if (sample_id_all) {
7482c589d93SNamhyung Kim 		void *data = &event->cgroup.path;
7492c589d93SNamhyung Kim 
7502c589d93SNamhyung Kim 		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
7512c589d93SNamhyung Kim 		swap_sample_id_all(event, data);
7522c589d93SNamhyung Kim 	}
7532c589d93SNamhyung Kim }
7542c589d93SNamhyung Kim 
revbyte(u8 b)755e108c66eSJiri Olsa static u8 revbyte(u8 b)
756e108c66eSJiri Olsa {
757e108c66eSJiri Olsa 	int rev = (b >> 4) | ((b & 0xf) << 4);
758e108c66eSJiri Olsa 	rev = ((rev & 0xcc) >> 2) | ((rev & 0x33) << 2);
759e108c66eSJiri Olsa 	rev = ((rev & 0xaa) >> 1) | ((rev & 0x55) << 1);
760e108c66eSJiri Olsa 	return (u8) rev;
761e108c66eSJiri Olsa }
762e108c66eSJiri Olsa 
763e108c66eSJiri Olsa /*
764e108c66eSJiri Olsa  * XXX this is hack in attempt to carry flags bitfield
765bd1a0be5SAdam Buchbinder  * through endian village. ABI says:
766e108c66eSJiri Olsa  *
767e108c66eSJiri Olsa  * Bit-fields are allocated from right to left (least to most significant)
768e108c66eSJiri Olsa  * on little-endian implementations and from left to right (most to least
769e108c66eSJiri Olsa  * significant) on big-endian implementations.
770e108c66eSJiri Olsa  *
771e108c66eSJiri Olsa  * The above seems to be byte specific, so we need to reverse each
772e108c66eSJiri Olsa  * byte of the bitfield. 'Internet' also says this might be implementation
773e108c66eSJiri Olsa  * specific and we probably need proper fix and carry perf_event_attr
774e108c66eSJiri Olsa  * bitfield flags in separate data file FEAT_ section. Thought this seems
775e108c66eSJiri Olsa  * to work for now.
776e108c66eSJiri Olsa  */
swap_bitfield(u8 * p,unsigned len)777e108c66eSJiri Olsa static void swap_bitfield(u8 *p, unsigned len)
778e108c66eSJiri Olsa {
779e108c66eSJiri Olsa 	unsigned i;
780e108c66eSJiri Olsa 
781e108c66eSJiri Olsa 	for (i = 0; i < len; i++) {
782e108c66eSJiri Olsa 		*p = revbyte(*p);
783e108c66eSJiri Olsa 		p++;
784e108c66eSJiri Olsa 	}
785e108c66eSJiri Olsa }
786e108c66eSJiri Olsa 
787eda3913bSDavid Ahern /* exported for swapping attributes in file header */
perf_event__attr_swap(struct perf_event_attr * attr)788eda3913bSDavid Ahern void perf_event__attr_swap(struct perf_event_attr *attr)
789eda3913bSDavid Ahern {
790eda3913bSDavid Ahern 	attr->type		= bswap_32(attr->type);
791eda3913bSDavid Ahern 	attr->size		= bswap_32(attr->size);
792e108c66eSJiri Olsa 
793b30b6172SWang Nan #define bswap_safe(f, n) 					\
794b30b6172SWang Nan 	(attr->size > (offsetof(struct perf_event_attr, f) + 	\
795b30b6172SWang Nan 		       sizeof(attr->f) * (n)))
796b30b6172SWang Nan #define bswap_field(f, sz) 			\
797b30b6172SWang Nan do { 						\
798b30b6172SWang Nan 	if (bswap_safe(f, 0))			\
799b30b6172SWang Nan 		attr->f = bswap_##sz(attr->f);	\
800b30b6172SWang Nan } while(0)
801792d48b4SArnaldo Carvalho de Melo #define bswap_field_16(f) bswap_field(f, 16)
802b30b6172SWang Nan #define bswap_field_32(f) bswap_field(f, 32)
803b30b6172SWang Nan #define bswap_field_64(f) bswap_field(f, 64)
804b30b6172SWang Nan 
805b30b6172SWang Nan 	bswap_field_64(config);
806b30b6172SWang Nan 	bswap_field_64(sample_period);
807b30b6172SWang Nan 	bswap_field_64(sample_type);
808b30b6172SWang Nan 	bswap_field_64(read_format);
809b30b6172SWang Nan 	bswap_field_32(wakeup_events);
810b30b6172SWang Nan 	bswap_field_32(bp_type);
811b30b6172SWang Nan 	bswap_field_64(bp_addr);
812b30b6172SWang Nan 	bswap_field_64(bp_len);
813b30b6172SWang Nan 	bswap_field_64(branch_sample_type);
814b30b6172SWang Nan 	bswap_field_64(sample_regs_user);
815b30b6172SWang Nan 	bswap_field_32(sample_stack_user);
816b30b6172SWang Nan 	bswap_field_32(aux_watermark);
817792d48b4SArnaldo Carvalho de Melo 	bswap_field_16(sample_max_stack);
81898dcf14dSAdrian Hunter 	bswap_field_32(aux_sample_size);
819b30b6172SWang Nan 
820b30b6172SWang Nan 	/*
821b30b6172SWang Nan 	 * After read_format are bitfields. Check read_format because
822b30b6172SWang Nan 	 * we are unable to use offsetof on bitfield.
823b30b6172SWang Nan 	 */
824b30b6172SWang Nan 	if (bswap_safe(read_format, 1))
825b30b6172SWang Nan 		swap_bitfield((u8 *) (&attr->read_format + 1),
826b30b6172SWang Nan 			      sizeof(u64));
827b30b6172SWang Nan #undef bswap_field_64
828b30b6172SWang Nan #undef bswap_field_32
829b30b6172SWang Nan #undef bswap_field
830b30b6172SWang Nan #undef bswap_safe
831eda3913bSDavid Ahern }
832eda3913bSDavid Ahern 
perf_event__hdr_attr_swap(union perf_event * event,bool sample_id_all __maybe_unused)833268fb20fSJiri Olsa static void perf_event__hdr_attr_swap(union perf_event *event,
8341d037ca1SIrina Tirdea 				      bool sample_id_all __maybe_unused)
8352c46dbb5STom Zanussi {
8362c46dbb5STom Zanussi 	size_t size;
8372c46dbb5STom Zanussi 
838eda3913bSDavid Ahern 	perf_event__attr_swap(&event->attr.attr);
8392c46dbb5STom Zanussi 
8408115d60cSArnaldo Carvalho de Melo 	size = event->header.size;
841f174341dSNamhyung Kim 	size -= perf_record_header_attr_id(event) - (void *)event;
842f174341dSNamhyung Kim 	mem_bswap_64(perf_record_header_attr_id(event), size);
8432c46dbb5STom Zanussi }
8442c46dbb5STom Zanussi 
perf_event__event_update_swap(union perf_event * event,bool sample_id_all __maybe_unused)845ffe77725SJiri Olsa static void perf_event__event_update_swap(union perf_event *event,
846ffe77725SJiri Olsa 					  bool sample_id_all __maybe_unused)
847ffe77725SJiri Olsa {
848ffe77725SJiri Olsa 	event->event_update.type = bswap_64(event->event_update.type);
849ffe77725SJiri Olsa 	event->event_update.id   = bswap_64(event->event_update.id);
850ffe77725SJiri Olsa }
851ffe77725SJiri Olsa 
perf_event__event_type_swap(union perf_event * event,bool sample_id_all __maybe_unused)852268fb20fSJiri Olsa static void perf_event__event_type_swap(union perf_event *event,
8531d037ca1SIrina Tirdea 					bool sample_id_all __maybe_unused)
854cd19a035STom Zanussi {
8558115d60cSArnaldo Carvalho de Melo 	event->event_type.event_type.event_id =
8568115d60cSArnaldo Carvalho de Melo 		bswap_64(event->event_type.event_type.event_id);
857cd19a035STom Zanussi }
858cd19a035STom Zanussi 
perf_event__tracing_data_swap(union perf_event * event,bool sample_id_all __maybe_unused)859268fb20fSJiri Olsa static void perf_event__tracing_data_swap(union perf_event *event,
8601d037ca1SIrina Tirdea 					  bool sample_id_all __maybe_unused)
8619215545eSTom Zanussi {
8628115d60cSArnaldo Carvalho de Melo 	event->tracing_data.size = bswap_32(event->tracing_data.size);
8639215545eSTom Zanussi }
8649215545eSTom Zanussi 
perf_event__auxtrace_info_swap(union perf_event * event,bool sample_id_all __maybe_unused)865a16ac023SAdrian Hunter static void perf_event__auxtrace_info_swap(union perf_event *event,
866a16ac023SAdrian Hunter 					   bool sample_id_all __maybe_unused)
867a16ac023SAdrian Hunter {
868a16ac023SAdrian Hunter 	size_t size;
869a16ac023SAdrian Hunter 
870a16ac023SAdrian Hunter 	event->auxtrace_info.type = bswap_32(event->auxtrace_info.type);
871a16ac023SAdrian Hunter 
872a16ac023SAdrian Hunter 	size = event->header.size;
873a16ac023SAdrian Hunter 	size -= (void *)&event->auxtrace_info.priv - (void *)event;
874a16ac023SAdrian Hunter 	mem_bswap_64(event->auxtrace_info.priv, size);
875a16ac023SAdrian Hunter }
876a16ac023SAdrian Hunter 
perf_event__auxtrace_swap(union perf_event * event,bool sample_id_all __maybe_unused)877a16ac023SAdrian Hunter static void perf_event__auxtrace_swap(union perf_event *event,
878a16ac023SAdrian Hunter 				      bool sample_id_all __maybe_unused)
879a16ac023SAdrian Hunter {
880a16ac023SAdrian Hunter 	event->auxtrace.size      = bswap_64(event->auxtrace.size);
881a16ac023SAdrian Hunter 	event->auxtrace.offset    = bswap_64(event->auxtrace.offset);
882a16ac023SAdrian Hunter 	event->auxtrace.reference = bswap_64(event->auxtrace.reference);
883a16ac023SAdrian Hunter 	event->auxtrace.idx       = bswap_32(event->auxtrace.idx);
884a16ac023SAdrian Hunter 	event->auxtrace.tid       = bswap_32(event->auxtrace.tid);
885a16ac023SAdrian Hunter 	event->auxtrace.cpu       = bswap_32(event->auxtrace.cpu);
886a16ac023SAdrian Hunter }
887a16ac023SAdrian Hunter 
perf_event__auxtrace_error_swap(union perf_event * event,bool sample_id_all __maybe_unused)888e9bf54d2SAdrian Hunter static void perf_event__auxtrace_error_swap(union perf_event *event,
889e9bf54d2SAdrian Hunter 					    bool sample_id_all __maybe_unused)
890e9bf54d2SAdrian Hunter {
891e9bf54d2SAdrian Hunter 	event->auxtrace_error.type = bswap_32(event->auxtrace_error.type);
892e9bf54d2SAdrian Hunter 	event->auxtrace_error.code = bswap_32(event->auxtrace_error.code);
893e9bf54d2SAdrian Hunter 	event->auxtrace_error.cpu  = bswap_32(event->auxtrace_error.cpu);
894e9bf54d2SAdrian Hunter 	event->auxtrace_error.pid  = bswap_32(event->auxtrace_error.pid);
895e9bf54d2SAdrian Hunter 	event->auxtrace_error.tid  = bswap_32(event->auxtrace_error.tid);
89616bd4321SAdrian Hunter 	event->auxtrace_error.fmt  = bswap_32(event->auxtrace_error.fmt);
897e9bf54d2SAdrian Hunter 	event->auxtrace_error.ip   = bswap_64(event->auxtrace_error.ip);
89816bd4321SAdrian Hunter 	if (event->auxtrace_error.fmt)
89916bd4321SAdrian Hunter 		event->auxtrace_error.time = bswap_64(event->auxtrace_error.time);
9007151c1d1SAdrian Hunter 	if (event->auxtrace_error.fmt >= 2) {
9017151c1d1SAdrian Hunter 		event->auxtrace_error.machine_pid = bswap_32(event->auxtrace_error.machine_pid);
9027151c1d1SAdrian Hunter 		event->auxtrace_error.vcpu = bswap_32(event->auxtrace_error.vcpu);
9037151c1d1SAdrian Hunter 	}
904e9bf54d2SAdrian Hunter }
905e9bf54d2SAdrian Hunter 
perf_event__thread_map_swap(union perf_event * event,bool sample_id_all __maybe_unused)9065f3339d2SJiri Olsa static void perf_event__thread_map_swap(union perf_event *event,
9075f3339d2SJiri Olsa 					bool sample_id_all __maybe_unused)
9085f3339d2SJiri Olsa {
9095f3339d2SJiri Olsa 	unsigned i;
9105f3339d2SJiri Olsa 
9115f3339d2SJiri Olsa 	event->thread_map.nr = bswap_64(event->thread_map.nr);
9125f3339d2SJiri Olsa 
9135f3339d2SJiri Olsa 	for (i = 0; i < event->thread_map.nr; i++)
9145f3339d2SJiri Olsa 		event->thread_map.entries[i].pid = bswap_64(event->thread_map.entries[i].pid);
9155f3339d2SJiri Olsa }
9165f3339d2SJiri Olsa 
perf_event__cpu_map_swap(union perf_event * event,bool sample_id_all __maybe_unused)9176640b6c2SJiri Olsa static void perf_event__cpu_map_swap(union perf_event *event,
9186640b6c2SJiri Olsa 				     bool sample_id_all __maybe_unused)
9196640b6c2SJiri Olsa {
92072932371SJiri Olsa 	struct perf_record_cpu_map_data *data = &event->cpu_map.data;
9216640b6c2SJiri Olsa 
922a11c9a6eSDmitry Koshelev 	data->type = bswap_16(data->type);
9236640b6c2SJiri Olsa 
9246640b6c2SJiri Olsa 	switch (data->type) {
9256640b6c2SJiri Olsa 	case PERF_CPU_MAP__CPUS:
926b2f10cd4SIan Rogers 		data->cpus_data.nr = bswap_16(data->cpus_data.nr);
9276640b6c2SJiri Olsa 
928b2f10cd4SIan Rogers 		for (unsigned i = 0; i < data->cpus_data.nr; i++)
929b2f10cd4SIan Rogers 			data->cpus_data.cpu[i] = bswap_16(data->cpus_data.cpu[i]);
9306640b6c2SJiri Olsa 		break;
9316640b6c2SJiri Olsa 	case PERF_CPU_MAP__MASK:
932b2f10cd4SIan Rogers 		data->mask32_data.long_size = bswap_16(data->mask32_data.long_size);
9336640b6c2SJiri Olsa 
934b2f10cd4SIan Rogers 		switch (data->mask32_data.long_size) {
935b2f10cd4SIan Rogers 		case 4:
936b2f10cd4SIan Rogers 			data->mask32_data.nr = bswap_16(data->mask32_data.nr);
937b2f10cd4SIan Rogers 			for (unsigned i = 0; i < data->mask32_data.nr; i++)
938b2f10cd4SIan Rogers 				data->mask32_data.mask[i] = bswap_32(data->mask32_data.mask[i]);
939b2f10cd4SIan Rogers 			break;
940b2f10cd4SIan Rogers 		case 8:
941b2f10cd4SIan Rogers 			data->mask64_data.nr = bswap_16(data->mask64_data.nr);
942b2f10cd4SIan Rogers 			for (unsigned i = 0; i < data->mask64_data.nr; i++)
943b2f10cd4SIan Rogers 				data->mask64_data.mask[i] = bswap_64(data->mask64_data.mask[i]);
944b2f10cd4SIan Rogers 			break;
9456640b6c2SJiri Olsa 		default:
9466640b6c2SJiri Olsa 			pr_err("cpu_map swap: unsupported long size\n");
9476640b6c2SJiri Olsa 		}
948c7202d20SIan Rogers 		break;
949c7202d20SIan Rogers 	case PERF_CPU_MAP__RANGE_CPUS:
950c7202d20SIan Rogers 		data->range_cpu_data.start_cpu = bswap_16(data->range_cpu_data.start_cpu);
951c7202d20SIan Rogers 		data->range_cpu_data.end_cpu = bswap_16(data->range_cpu_data.end_cpu);
952c7202d20SIan Rogers 		break;
9536640b6c2SJiri Olsa 	default:
9546640b6c2SJiri Olsa 		break;
9556640b6c2SJiri Olsa 	}
9566640b6c2SJiri Olsa }
9576640b6c2SJiri Olsa 
perf_event__stat_config_swap(union perf_event * event,bool sample_id_all __maybe_unused)958374fb9e3SJiri Olsa static void perf_event__stat_config_swap(union perf_event *event,
959374fb9e3SJiri Olsa 					 bool sample_id_all __maybe_unused)
960374fb9e3SJiri Olsa {
961374fb9e3SJiri Olsa 	u64 size;
962374fb9e3SJiri Olsa 
963a11c9a6eSDmitry Koshelev 	size  = bswap_64(event->stat_config.nr) * sizeof(event->stat_config.data[0]);
964374fb9e3SJiri Olsa 	size += 1; /* nr item itself */
965374fb9e3SJiri Olsa 	mem_bswap_64(&event->stat_config.nr, size);
966374fb9e3SJiri Olsa }
967374fb9e3SJiri Olsa 
perf_event__stat_swap(union perf_event * event,bool sample_id_all __maybe_unused)968d80518c9SJiri Olsa static void perf_event__stat_swap(union perf_event *event,
969d80518c9SJiri Olsa 				  bool sample_id_all __maybe_unused)
970d80518c9SJiri Olsa {
971d80518c9SJiri Olsa 	event->stat.id     = bswap_64(event->stat.id);
972d80518c9SJiri Olsa 	event->stat.thread = bswap_32(event->stat.thread);
973d80518c9SJiri Olsa 	event->stat.cpu    = bswap_32(event->stat.cpu);
974d80518c9SJiri Olsa 	event->stat.val    = bswap_64(event->stat.val);
975d80518c9SJiri Olsa 	event->stat.ena    = bswap_64(event->stat.ena);
976d80518c9SJiri Olsa 	event->stat.run    = bswap_64(event->stat.run);
977d80518c9SJiri Olsa }
978d80518c9SJiri Olsa 
perf_event__stat_round_swap(union perf_event * event,bool sample_id_all __maybe_unused)9792d8f0f18SJiri Olsa static void perf_event__stat_round_swap(union perf_event *event,
9802d8f0f18SJiri Olsa 					bool sample_id_all __maybe_unused)
9812d8f0f18SJiri Olsa {
9822d8f0f18SJiri Olsa 	event->stat_round.type = bswap_64(event->stat_round.type);
9832d8f0f18SJiri Olsa 	event->stat_round.time = bswap_64(event->stat_round.time);
9842d8f0f18SJiri Olsa }
9852d8f0f18SJiri Olsa 
perf_event__time_conv_swap(union perf_event * event,bool sample_id_all __maybe_unused)986050ffc44SLeo Yan static void perf_event__time_conv_swap(union perf_event *event,
987050ffc44SLeo Yan 				       bool sample_id_all __maybe_unused)
988050ffc44SLeo Yan {
989050ffc44SLeo Yan 	event->time_conv.time_shift = bswap_64(event->time_conv.time_shift);
990050ffc44SLeo Yan 	event->time_conv.time_mult  = bswap_64(event->time_conv.time_mult);
991050ffc44SLeo Yan 	event->time_conv.time_zero  = bswap_64(event->time_conv.time_zero);
992050ffc44SLeo Yan 
993050ffc44SLeo Yan 	if (event_contains(event->time_conv, time_cycles)) {
994050ffc44SLeo Yan 		event->time_conv.time_cycles = bswap_64(event->time_conv.time_cycles);
995050ffc44SLeo Yan 		event->time_conv.time_mask = bswap_64(event->time_conv.time_mask);
996050ffc44SLeo Yan 	}
997050ffc44SLeo Yan }
998050ffc44SLeo Yan 
999268fb20fSJiri Olsa typedef void (*perf_event__swap_op)(union perf_event *event,
1000268fb20fSJiri Olsa 				    bool sample_id_all);
1001ba21594cSArnaldo Carvalho de Melo 
10028115d60cSArnaldo Carvalho de Melo static perf_event__swap_op perf_event__swap_ops[] = {
10038115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_MMAP]		  = perf_event__mmap_swap,
10045c5e854bSStephane Eranian 	[PERF_RECORD_MMAP2]		  = perf_event__mmap2_swap,
10058115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_COMM]		  = perf_event__comm_swap,
10068115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_FORK]		  = perf_event__task_swap,
10078115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_EXIT]		  = perf_event__task_swap,
10088115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_LOST]		  = perf_event__all64_swap,
10098115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_READ]		  = perf_event__read_swap,
1010dd96c46bSJiri Olsa 	[PERF_RECORD_THROTTLE]		  = perf_event__throttle_swap,
1011dd96c46bSJiri Olsa 	[PERF_RECORD_UNTHROTTLE]	  = perf_event__throttle_swap,
10128115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_SAMPLE]		  = perf_event__all64_swap,
10134a96f7a0SAdrian Hunter 	[PERF_RECORD_AUX]		  = perf_event__aux_swap,
10140ad21f68SAdrian Hunter 	[PERF_RECORD_ITRACE_START]	  = perf_event__itrace_start_swap,
1015c4937a91SKan Liang 	[PERF_RECORD_LOST_SAMPLES]	  = perf_event__all64_swap,
10160286039fSAdrian Hunter 	[PERF_RECORD_SWITCH]		  = perf_event__switch_swap,
10170286039fSAdrian Hunter 	[PERF_RECORD_SWITCH_CPU_WIDE]	  = perf_event__switch_swap,
1018acd244b8SNamhyung Kim 	[PERF_RECORD_NAMESPACES]	  = perf_event__namespaces_swap,
10192c589d93SNamhyung Kim 	[PERF_RECORD_CGROUP]		  = perf_event__cgroup_swap,
1020246eba8eSAdrian Hunter 	[PERF_RECORD_TEXT_POKE]		  = perf_event__text_poke_swap,
102161750473SAdrian Hunter 	[PERF_RECORD_AUX_OUTPUT_HW_ID]	  = perf_event__all64_swap,
1022eda3913bSDavid Ahern 	[PERF_RECORD_HEADER_ATTR]	  = perf_event__hdr_attr_swap,
10238115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_HEADER_EVENT_TYPE]	  = perf_event__event_type_swap,
10248115d60cSArnaldo Carvalho de Melo 	[PERF_RECORD_HEADER_TRACING_DATA] = perf_event__tracing_data_swap,
1025c7929e47STom Zanussi 	[PERF_RECORD_HEADER_BUILD_ID]	  = NULL,
10263c659eedSAdrian Hunter 	[PERF_RECORD_ID_INDEX]		  = perf_event__all64_swap,
1027a16ac023SAdrian Hunter 	[PERF_RECORD_AUXTRACE_INFO]	  = perf_event__auxtrace_info_swap,
1028a16ac023SAdrian Hunter 	[PERF_RECORD_AUXTRACE]		  = perf_event__auxtrace_swap,
1029e9bf54d2SAdrian Hunter 	[PERF_RECORD_AUXTRACE_ERROR]	  = perf_event__auxtrace_error_swap,
10305f3339d2SJiri Olsa 	[PERF_RECORD_THREAD_MAP]	  = perf_event__thread_map_swap,
10316640b6c2SJiri Olsa 	[PERF_RECORD_CPU_MAP]		  = perf_event__cpu_map_swap,
1032374fb9e3SJiri Olsa 	[PERF_RECORD_STAT_CONFIG]	  = perf_event__stat_config_swap,
1033d80518c9SJiri Olsa 	[PERF_RECORD_STAT]		  = perf_event__stat_swap,
10342d8f0f18SJiri Olsa 	[PERF_RECORD_STAT_ROUND]	  = perf_event__stat_round_swap,
1035ffe77725SJiri Olsa 	[PERF_RECORD_EVENT_UPDATE]	  = perf_event__event_update_swap,
1036050ffc44SLeo Yan 	[PERF_RECORD_TIME_CONV]		  = perf_event__time_conv_swap,
10378dc58101STom Zanussi 	[PERF_RECORD_HEADER_MAX]	  = NULL,
1038ba21594cSArnaldo Carvalho de Melo };
1039ba21594cSArnaldo Carvalho de Melo 
1040d6b17bebSFrederic Weisbecker /*
1041d6b17bebSFrederic Weisbecker  * When perf record finishes a pass on every buffers, it records this pseudo
1042d6b17bebSFrederic Weisbecker  * event.
1043d6b17bebSFrederic Weisbecker  * We record the max timestamp t found in the pass n.
1044d6b17bebSFrederic Weisbecker  * Assuming these timestamps are monotonic across cpus, we know that if
1045d6b17bebSFrederic Weisbecker  * a buffer still has events with timestamps below t, they will be all
1046d6b17bebSFrederic Weisbecker  * available and then read in the pass n + 1.
1047d6b17bebSFrederic Weisbecker  * Hence when we start to read the pass n + 2, we can safely flush every
1048d6b17bebSFrederic Weisbecker  * events with timestamps below t.
1049d6b17bebSFrederic Weisbecker  *
1050d6b17bebSFrederic Weisbecker  *    ============ PASS n =================
1051d6b17bebSFrederic Weisbecker  *       CPU 0         |   CPU 1
1052d6b17bebSFrederic Weisbecker  *                     |
1053d6b17bebSFrederic Weisbecker  *    cnt1 timestamps  |   cnt2 timestamps
1054d6b17bebSFrederic Weisbecker  *          1          |         2
1055d6b17bebSFrederic Weisbecker  *          2          |         3
1056d6b17bebSFrederic Weisbecker  *          -          |         4  <--- max recorded
1057d6b17bebSFrederic Weisbecker  *
1058d6b17bebSFrederic Weisbecker  *    ============ PASS n + 1 ==============
1059d6b17bebSFrederic Weisbecker  *       CPU 0         |   CPU 1
1060d6b17bebSFrederic Weisbecker  *                     |
1061d6b17bebSFrederic Weisbecker  *    cnt1 timestamps  |   cnt2 timestamps
1062d6b17bebSFrederic Weisbecker  *          3          |         5
1063d6b17bebSFrederic Weisbecker  *          4          |         6
1064d6b17bebSFrederic Weisbecker  *          5          |         7 <---- max recorded
1065d6b17bebSFrederic Weisbecker  *
1066d6b17bebSFrederic Weisbecker  *      Flush every events below timestamp 4
1067d6b17bebSFrederic Weisbecker  *
1068d6b17bebSFrederic Weisbecker  *    ============ PASS n + 2 ==============
1069d6b17bebSFrederic Weisbecker  *       CPU 0         |   CPU 1
1070d6b17bebSFrederic Weisbecker  *                     |
1071d6b17bebSFrederic Weisbecker  *    cnt1 timestamps  |   cnt2 timestamps
1072d6b17bebSFrederic Weisbecker  *          6          |         8
1073d6b17bebSFrederic Weisbecker  *          7          |         9
1074d6b17bebSFrederic Weisbecker  *          -          |         10
1075d6b17bebSFrederic Weisbecker  *
1076d6b17bebSFrederic Weisbecker  *      Flush every events below timestamp 7
1077d6b17bebSFrederic Weisbecker  *      etc...
1078d6b17bebSFrederic Weisbecker  */
perf_event__process_finished_round(struct perf_tool * tool __maybe_unused,union perf_event * event __maybe_unused,struct ordered_events * oe)1079eddc6e3fSAdrian Hunter int perf_event__process_finished_round(struct perf_tool *tool __maybe_unused,
10801d037ca1SIrina Tirdea 				       union perf_event *event __maybe_unused,
1081d704ebdaSArnaldo Carvalho de Melo 				       struct ordered_events *oe)
1082d6b17bebSFrederic Weisbecker {
10835531e162SAdrian Hunter 	if (dump_trace)
10845531e162SAdrian Hunter 		fprintf(stdout, "\n");
1085b7b61cbeSArnaldo Carvalho de Melo 	return ordered_events__flush(oe, OE_FLUSH__ROUND);
1086d6b17bebSFrederic Weisbecker }
1087d6b17bebSFrederic Weisbecker 
perf_session__queue_event(struct perf_session * s,union perf_event * event,u64 timestamp,u64 file_offset,const char * file_path)1088b7b61cbeSArnaldo Carvalho de Melo int perf_session__queue_event(struct perf_session *s, union perf_event *event,
10892292083fSAlexey Bayduraev 			      u64 timestamp, u64 file_offset, const char *file_path)
1090c61e52eeSFrederic Weisbecker {
10912292083fSAlexey Bayduraev 	return ordered_events__queue(&s->ordered_events, event, timestamp, file_offset, file_path);
1092c61e52eeSFrederic Weisbecker }
1093c61e52eeSFrederic Weisbecker 
callchain__lbr_callstack_printf(struct perf_sample * sample)1094384b6055SKan Liang static void callchain__lbr_callstack_printf(struct perf_sample *sample)
1095640c03ceSArnaldo Carvalho de Melo {
1096384b6055SKan Liang 	struct ip_callchain *callchain = sample->callchain;
1097384b6055SKan Liang 	struct branch_stack *lbr_stack = sample->branch_stack;
109842bbabedSKan Liang 	struct branch_entry *entries = perf_sample__branch_entries(sample);
1099384b6055SKan Liang 	u64 kernel_callchain_nr = callchain->nr;
1100640c03ceSArnaldo Carvalho de Melo 	unsigned int i;
1101640c03ceSArnaldo Carvalho de Melo 
1102384b6055SKan Liang 	for (i = 0; i < kernel_callchain_nr; i++) {
1103384b6055SKan Liang 		if (callchain->ips[i] == PERF_CONTEXT_USER)
1104384b6055SKan Liang 			break;
1105384b6055SKan Liang 	}
1106640c03ceSArnaldo Carvalho de Melo 
1107384b6055SKan Liang 	if ((i != kernel_callchain_nr) && lbr_stack->nr) {
1108384b6055SKan Liang 		u64 total_nr;
1109384b6055SKan Liang 		/*
1110384b6055SKan Liang 		 * LBR callstack can only get user call chain,
1111384b6055SKan Liang 		 * i is kernel call chain number,
1112384b6055SKan Liang 		 * 1 is PERF_CONTEXT_USER.
1113384b6055SKan Liang 		 *
1114384b6055SKan Liang 		 * The user call chain is stored in LBR registers.
1115384b6055SKan Liang 		 * LBR are pair registers. The caller is stored
1116384b6055SKan Liang 		 * in "from" register, while the callee is stored
1117384b6055SKan Liang 		 * in "to" register.
1118384b6055SKan Liang 		 * For example, there is a call stack
1119384b6055SKan Liang 		 * "A"->"B"->"C"->"D".
11204d39c89fSIngo Molnar 		 * The LBR registers will be recorded like
1121384b6055SKan Liang 		 * "C"->"D", "B"->"C", "A"->"B".
1122384b6055SKan Liang 		 * So only the first "to" register and all "from"
1123384b6055SKan Liang 		 * registers are needed to construct the whole stack.
1124384b6055SKan Liang 		 */
1125384b6055SKan Liang 		total_nr = i + 1 + lbr_stack->nr + 1;
1126384b6055SKan Liang 		kernel_callchain_nr = i + 1;
1127384b6055SKan Liang 
1128384b6055SKan Liang 		printf("... LBR call chain: nr:%" PRIu64 "\n", total_nr);
1129384b6055SKan Liang 
1130384b6055SKan Liang 		for (i = 0; i < kernel_callchain_nr; i++)
11319486aa38SArnaldo Carvalho de Melo 			printf("..... %2d: %016" PRIx64 "\n",
1132384b6055SKan Liang 			       i, callchain->ips[i]);
1133384b6055SKan Liang 
1134384b6055SKan Liang 		printf("..... %2d: %016" PRIx64 "\n",
113542bbabedSKan Liang 		       (int)(kernel_callchain_nr), entries[0].to);
1136384b6055SKan Liang 		for (i = 0; i < lbr_stack->nr; i++)
1137384b6055SKan Liang 			printf("..... %2d: %016" PRIx64 "\n",
113842bbabedSKan Liang 			       (int)(i + kernel_callchain_nr + 1), entries[i].from);
1139384b6055SKan Liang 	}
1140384b6055SKan Liang }
1141384b6055SKan Liang 
callchain__printf(struct evsel * evsel,struct perf_sample * sample)114232dcd021SJiri Olsa static void callchain__printf(struct evsel *evsel,
1143384b6055SKan Liang 			      struct perf_sample *sample)
1144384b6055SKan Liang {
1145384b6055SKan Liang 	unsigned int i;
1146384b6055SKan Liang 	struct ip_callchain *callchain = sample->callchain;
1147384b6055SKan Liang 
11484f138a9eSArnaldo Carvalho de Melo 	if (evsel__has_branch_callstack(evsel))
1149384b6055SKan Liang 		callchain__lbr_callstack_printf(sample);
1150384b6055SKan Liang 
1151384b6055SKan Liang 	printf("... FP chain: nr:%" PRIu64 "\n", callchain->nr);
1152384b6055SKan Liang 
1153384b6055SKan Liang 	for (i = 0; i < callchain->nr; i++)
1154384b6055SKan Liang 		printf("..... %2d: %016" PRIx64 "\n",
1155384b6055SKan Liang 		       i, callchain->ips[i]);
1156640c03ceSArnaldo Carvalho de Melo }
1157640c03ceSArnaldo Carvalho de Melo 
branch_stack__printf(struct perf_sample * sample,bool callstack)1158d2720c3dSAlexey Budankov static void branch_stack__printf(struct perf_sample *sample, bool callstack)
1159b5387528SRoberto Agostino Vitillo {
116042bbabedSKan Liang 	struct branch_entry *entries = perf_sample__branch_entries(sample);
1161b5387528SRoberto Agostino Vitillo 	uint64_t i;
1162b5387528SRoberto Agostino Vitillo 
116351d0bf99SChengdong Li 	if (!callstack) {
116451d0bf99SChengdong Li 		printf("%s: nr:%" PRIu64 "\n", "... branch stack", sample->branch_stack->nr);
116551d0bf99SChengdong Li 	} else {
116651d0bf99SChengdong Li 		/* the reason of adding 1 to nr is because after expanding
116751d0bf99SChengdong Li 		 * branch stack it generates nr + 1 callstack records. e.g.,
116851d0bf99SChengdong Li 		 *         B()->C()
116951d0bf99SChengdong Li 		 *         A()->B()
117051d0bf99SChengdong Li 		 * the final callstack should be:
117151d0bf99SChengdong Li 		 *         C()
117251d0bf99SChengdong Li 		 *         B()
117351d0bf99SChengdong Li 		 *         A()
117451d0bf99SChengdong Li 		 */
117551d0bf99SChengdong Li 		printf("%s: nr:%" PRIu64 "\n", "... branch callstack", sample->branch_stack->nr+1);
117651d0bf99SChengdong Li 	}
1177b5387528SRoberto Agostino Vitillo 
11780e332f03SAndi Kleen 	for (i = 0; i < sample->branch_stack->nr; i++) {
117942bbabedSKan Liang 		struct branch_entry *e = &entries[i];
11800e332f03SAndi Kleen 
1181d2720c3dSAlexey Budankov 		if (!callstack) {
11828eaf8ec3SSandipan Das 			printf("..... %2"PRIu64": %016" PRIx64 " -> %016" PRIx64 " %hu cycles %s%s%s%s %x %s %s\n",
11830e332f03SAndi Kleen 				i, e->from, e->to,
11848074bf51SArnaldo Carvalho de Melo 				(unsigned short)e->flags.cycles,
11850e332f03SAndi Kleen 				e->flags.mispred ? "M" : " ",
11860e332f03SAndi Kleen 				e->flags.predicted ? "P" : " ",
11870e332f03SAndi Kleen 				e->flags.abort ? "A" : " ",
11880e332f03SAndi Kleen 				e->flags.in_tx ? "T" : " ",
118966fd6c9dSJames Clark 				(unsigned)e->flags.reserved,
11908eaf8ec3SSandipan Das 				get_branch_type(e),
11918eaf8ec3SSandipan Das 				e->flags.spec ? branch_spec_desc(e->flags.spec) : "");
1192d2720c3dSAlexey Budankov 		} else {
119351d0bf99SChengdong Li 			if (i == 0) {
119451d0bf99SChengdong Li 				printf("..... %2"PRIu64": %016" PRIx64 "\n"
119551d0bf99SChengdong Li 				       "..... %2"PRIu64": %016" PRIx64 "\n",
119651d0bf99SChengdong Li 						i, e->to, i+1, e->from);
119751d0bf99SChengdong Li 			} else {
119851d0bf99SChengdong Li 				printf("..... %2"PRIu64": %016" PRIx64 "\n", i+1, e->from);
119951d0bf99SChengdong Li 			}
1200d2720c3dSAlexey Budankov 		}
12010e332f03SAndi Kleen 	}
1202b5387528SRoberto Agostino Vitillo }
1203b5387528SRoberto Agostino Vitillo 
regs_dump__printf(u64 mask,u64 * regs,const char * arch)120483869019SGerman Gomez static void regs_dump__printf(u64 mask, u64 *regs, const char *arch)
12050f6a3015SJiri Olsa {
12060f6a3015SJiri Olsa 	unsigned rid, i = 0;
12070f6a3015SJiri Olsa 
12080f6a3015SJiri Olsa 	for_each_set_bit(rid, (unsigned long *) &mask, sizeof(mask) * 8) {
12090f6a3015SJiri Olsa 		u64 val = regs[i++];
12100f6a3015SJiri Olsa 
1211498ef715SPaul A. Clarke 		printf(".... %-5s 0x%016" PRIx64 "\n",
121283869019SGerman Gomez 		       perf_reg_name(rid, arch), val);
12130f6a3015SJiri Olsa 	}
12140f6a3015SJiri Olsa }
12150f6a3015SJiri Olsa 
12166a21c0b5SStephane Eranian static const char *regs_abi[] = {
12176a21c0b5SStephane Eranian 	[PERF_SAMPLE_REGS_ABI_NONE] = "none",
12186a21c0b5SStephane Eranian 	[PERF_SAMPLE_REGS_ABI_32] = "32-bit",
12196a21c0b5SStephane Eranian 	[PERF_SAMPLE_REGS_ABI_64] = "64-bit",
12206a21c0b5SStephane Eranian };
12216a21c0b5SStephane Eranian 
regs_dump_abi(struct regs_dump * d)12226a21c0b5SStephane Eranian static inline const char *regs_dump_abi(struct regs_dump *d)
12236a21c0b5SStephane Eranian {
12246a21c0b5SStephane Eranian 	if (d->abi > PERF_SAMPLE_REGS_ABI_64)
12256a21c0b5SStephane Eranian 		return "unknown";
12266a21c0b5SStephane Eranian 
12276a21c0b5SStephane Eranian 	return regs_abi[d->abi];
12286a21c0b5SStephane Eranian }
12296a21c0b5SStephane Eranian 
regs__printf(const char * type,struct regs_dump * regs,const char * arch)123083869019SGerman Gomez static void regs__printf(const char *type, struct regs_dump *regs, const char *arch)
12316a21c0b5SStephane Eranian {
12326a21c0b5SStephane Eranian 	u64 mask = regs->mask;
12336a21c0b5SStephane Eranian 
12346a21c0b5SStephane Eranian 	printf("... %s regs: mask 0x%" PRIx64 " ABI %s\n",
12356a21c0b5SStephane Eranian 	       type,
12366a21c0b5SStephane Eranian 	       mask,
12376a21c0b5SStephane Eranian 	       regs_dump_abi(regs));
12386a21c0b5SStephane Eranian 
123983869019SGerman Gomez 	regs_dump__printf(mask, regs->regs, arch);
12406a21c0b5SStephane Eranian }
12416a21c0b5SStephane Eranian 
regs_user__printf(struct perf_sample * sample,const char * arch)124283869019SGerman Gomez static void regs_user__printf(struct perf_sample *sample, const char *arch)
12430f6a3015SJiri Olsa {
12440f6a3015SJiri Olsa 	struct regs_dump *user_regs = &sample->user_regs;
12450f6a3015SJiri Olsa 
12466a21c0b5SStephane Eranian 	if (user_regs->regs)
124783869019SGerman Gomez 		regs__printf("user", user_regs, arch);
12480f6a3015SJiri Olsa }
12496a21c0b5SStephane Eranian 
regs_intr__printf(struct perf_sample * sample,const char * arch)125083869019SGerman Gomez static void regs_intr__printf(struct perf_sample *sample, const char *arch)
12516a21c0b5SStephane Eranian {
12526a21c0b5SStephane Eranian 	struct regs_dump *intr_regs = &sample->intr_regs;
12536a21c0b5SStephane Eranian 
12546a21c0b5SStephane Eranian 	if (intr_regs->regs)
125583869019SGerman Gomez 		regs__printf("intr", intr_regs, arch);
12560f6a3015SJiri Olsa }
12570f6a3015SJiri Olsa 
stack_user__printf(struct stack_dump * dump)12580f6a3015SJiri Olsa static void stack_user__printf(struct stack_dump *dump)
12590f6a3015SJiri Olsa {
12600f6a3015SJiri Olsa 	printf("... ustack: size %" PRIu64 ", offset 0x%x\n",
12610f6a3015SJiri Olsa 	       dump->size, dump->offset);
12620f6a3015SJiri Olsa }
12630f6a3015SJiri Olsa 
evlist__print_tstamp(struct evlist * evlist,union perf_event * event,struct perf_sample * sample)126471273724SArnaldo Carvalho de Melo static void evlist__print_tstamp(struct evlist *evlist, union perf_event *event, struct perf_sample *sample)
12659c90a61cSArnaldo Carvalho de Melo {
1266b3c2cc2bSArnaldo Carvalho de Melo 	u64 sample_type = __evlist__combined_sample_type(evlist);
12677f3be652SArnaldo Carvalho de Melo 
12689c90a61cSArnaldo Carvalho de Melo 	if (event->header.type != PERF_RECORD_SAMPLE &&
12698cedf3a5SArnaldo Carvalho de Melo 	    !evlist__sample_id_all(evlist)) {
12709c90a61cSArnaldo Carvalho de Melo 		fputs("-1 -1 ", stdout);
12719c90a61cSArnaldo Carvalho de Melo 		return;
12729c90a61cSArnaldo Carvalho de Melo 	}
12739c90a61cSArnaldo Carvalho de Melo 
12747f3be652SArnaldo Carvalho de Melo 	if ((sample_type & PERF_SAMPLE_CPU))
12759c90a61cSArnaldo Carvalho de Melo 		printf("%u ", sample->cpu);
12769c90a61cSArnaldo Carvalho de Melo 
12777f3be652SArnaldo Carvalho de Melo 	if (sample_type & PERF_SAMPLE_TIME)
12789486aa38SArnaldo Carvalho de Melo 		printf("%" PRIu64 " ", sample->time);
12799c90a61cSArnaldo Carvalho de Melo }
12809c90a61cSArnaldo Carvalho de Melo 
sample_read__printf(struct perf_sample * sample,u64 read_format)12819ede473cSJiri Olsa static void sample_read__printf(struct perf_sample *sample, u64 read_format)
12829ede473cSJiri Olsa {
12839ede473cSJiri Olsa 	printf("... sample_read:\n");
12849ede473cSJiri Olsa 
12859ede473cSJiri Olsa 	if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
12869ede473cSJiri Olsa 		printf("...... time enabled %016" PRIx64 "\n",
12879ede473cSJiri Olsa 		       sample->read.time_enabled);
12889ede473cSJiri Olsa 
12899ede473cSJiri Olsa 	if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
12909ede473cSJiri Olsa 		printf("...... time running %016" PRIx64 "\n",
12919ede473cSJiri Olsa 		       sample->read.time_running);
12929ede473cSJiri Olsa 
12939ede473cSJiri Olsa 	if (read_format & PERF_FORMAT_GROUP) {
1294f52679b7SNamhyung Kim 		struct sample_read_value *value = sample->read.group.values;
12959ede473cSJiri Olsa 
12969ede473cSJiri Olsa 		printf(".... group nr %" PRIu64 "\n", sample->read.group.nr);
12979ede473cSJiri Olsa 
1298f52679b7SNamhyung Kim 		sample_read_group__for_each(value, sample->read.group.nr, read_format) {
12999ede473cSJiri Olsa 			printf("..... id %016" PRIx64
1300f52679b7SNamhyung Kim 			       ", value %016" PRIx64,
13019ede473cSJiri Olsa 			       value->id, value->value);
1302f52679b7SNamhyung Kim 			if (read_format & PERF_FORMAT_LOST)
1303f52679b7SNamhyung Kim 				printf(", lost %" PRIu64, value->lost);
1304f52679b7SNamhyung Kim 			printf("\n");
13059ede473cSJiri Olsa 		}
1306f52679b7SNamhyung Kim 	} else {
1307f52679b7SNamhyung Kim 		printf("..... id %016" PRIx64 ", value %016" PRIx64,
13089ede473cSJiri Olsa 			sample->read.one.id, sample->read.one.value);
1309f52679b7SNamhyung Kim 		if (read_format & PERF_FORMAT_LOST)
1310f52679b7SNamhyung Kim 			printf(", lost %" PRIu64, sample->read.one.lost);
1311f52679b7SNamhyung Kim 		printf("\n");
1312f52679b7SNamhyung Kim 	}
13139ede473cSJiri Olsa }
13149ede473cSJiri Olsa 
dump_event(struct evlist * evlist,union perf_event * event,u64 file_offset,struct perf_sample * sample,const char * file_path)131563503dbaSJiri Olsa static void dump_event(struct evlist *evlist, union perf_event *event,
13162292083fSAlexey Bayduraev 		       u64 file_offset, struct perf_sample *sample,
13172292083fSAlexey Bayduraev 		       const char *file_path)
13189aefcab0SThomas Gleixner {
13199aefcab0SThomas Gleixner 	if (!dump_trace)
13209aefcab0SThomas Gleixner 		return;
13219aefcab0SThomas Gleixner 
13222292083fSAlexey Bayduraev 	printf("\n%#" PRIx64 "@%s [%#x]: event: %d\n",
13232292083fSAlexey Bayduraev 	       file_offset, file_path, event->header.size, event->header.type);
13249aefcab0SThomas Gleixner 
13259aefcab0SThomas Gleixner 	trace_event(event);
132693115d32SThomas Richter 	if (event->header.type == PERF_RECORD_SAMPLE && evlist->trace_event_sample_raw)
132793115d32SThomas Richter 		evlist->trace_event_sample_raw(evlist, event, sample);
13289aefcab0SThomas Gleixner 
13299aefcab0SThomas Gleixner 	if (sample)
133071273724SArnaldo Carvalho de Melo 		evlist__print_tstamp(evlist, event, sample);
13319aefcab0SThomas Gleixner 
13329486aa38SArnaldo Carvalho de Melo 	printf("%#" PRIx64 " [%#x]: PERF_RECORD_%s", file_offset,
13338115d60cSArnaldo Carvalho de Melo 	       event->header.size, perf_event__name(event->header.type));
13349aefcab0SThomas Gleixner }
13359aefcab0SThomas Gleixner 
get_page_size_name(u64 size,char * str)13366b9bae63SKan Liang char *get_page_size_name(u64 size, char *str)
13376b9bae63SKan Liang {
13386b9bae63SKan Liang 	if (!size || !unit_number__scnprintf(str, PAGE_SIZE_NAME_LEN, size))
13396b9bae63SKan Liang 		snprintf(str, PAGE_SIZE_NAME_LEN, "%s", "N/A");
13406b9bae63SKan Liang 
13416b9bae63SKan Liang 	return str;
13426b9bae63SKan Liang }
13436b9bae63SKan Liang 
dump_sample(struct evsel * evsel,union perf_event * event,struct perf_sample * sample,const char * arch)134432dcd021SJiri Olsa static void dump_sample(struct evsel *evsel, union perf_event *event,
134583869019SGerman Gomez 			struct perf_sample *sample, const char *arch)
13469aefcab0SThomas Gleixner {
13477f3be652SArnaldo Carvalho de Melo 	u64 sample_type;
13486b9bae63SKan Liang 	char str[PAGE_SIZE_NAME_LEN];
13497f3be652SArnaldo Carvalho de Melo 
1350ddbc24b7SArnaldo Carvalho de Melo 	if (!dump_trace)
1351ddbc24b7SArnaldo Carvalho de Melo 		return;
1352ddbc24b7SArnaldo Carvalho de Melo 
13530ea590aeSDon Zickus 	printf("(IP, 0x%x): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRIx64 "\n",
13549486aa38SArnaldo Carvalho de Melo 	       event->header.misc, sample->pid, sample->tid, sample->ip,
13557cec0922SDavid Ahern 	       sample->period, sample->addr);
13569aefcab0SThomas Gleixner 
13571fc632ceSJiri Olsa 	sample_type = evsel->core.attr.sample_type;
13587f3be652SArnaldo Carvalho de Melo 
135927de9b2bSArnaldo Carvalho de Melo 	if (evsel__has_callchain(evsel))
1360384b6055SKan Liang 		callchain__printf(evsel, sample);
1361b5387528SRoberto Agostino Vitillo 
13626cd2cbfcSAdrian Hunter 	if (evsel__has_br_stack(evsel))
13634f138a9eSArnaldo Carvalho de Melo 		branch_stack__printf(sample, evsel__has_branch_callstack(evsel));
13640f6a3015SJiri Olsa 
13650f6a3015SJiri Olsa 	if (sample_type & PERF_SAMPLE_REGS_USER)
136683869019SGerman Gomez 		regs_user__printf(sample, arch);
13670f6a3015SJiri Olsa 
13686a21c0b5SStephane Eranian 	if (sample_type & PERF_SAMPLE_REGS_INTR)
136983869019SGerman Gomez 		regs_intr__printf(sample, arch);
13706a21c0b5SStephane Eranian 
13710f6a3015SJiri Olsa 	if (sample_type & PERF_SAMPLE_STACK_USER)
13720f6a3015SJiri Olsa 		stack_user__printf(&sample->user_stack);
137305484298SAndi Kleen 
1374590db42dSKan Liang 	if (sample_type & PERF_SAMPLE_WEIGHT_TYPE) {
1375590db42dSKan Liang 		printf("... weight: %" PRIu64 "", sample->weight);
137606e5ca74SAthira Rajeev 			if (sample_type & PERF_SAMPLE_WEIGHT_STRUCT) {
1377590db42dSKan Liang 				printf(",0x%"PRIx16"", sample->ins_lat);
137806e5ca74SAthira Rajeev 				printf(",0x%"PRIx16"", sample->p_stage_cyc);
137906e5ca74SAthira Rajeev 			}
1380590db42dSKan Liang 		printf("\n");
1381590db42dSKan Liang 	}
138298a3b32cSStephane Eranian 
138398a3b32cSStephane Eranian 	if (sample_type & PERF_SAMPLE_DATA_SRC)
138498a3b32cSStephane Eranian 		printf(" . data_src: 0x%"PRIx64"\n", sample->data_src);
13859ede473cSJiri Olsa 
13868780fb25SKan Liang 	if (sample_type & PERF_SAMPLE_PHYS_ADDR)
13878780fb25SKan Liang 		printf(" .. phys_addr: 0x%"PRIx64"\n", sample->phys_addr);
13888780fb25SKan Liang 
13896b9bae63SKan Liang 	if (sample_type & PERF_SAMPLE_DATA_PAGE_SIZE)
13906b9bae63SKan Liang 		printf(" .. data page size: %s\n", get_page_size_name(sample->data_page_size, str));
13916b9bae63SKan Liang 
1392c513de8aSStephane Eranian 	if (sample_type & PERF_SAMPLE_CODE_PAGE_SIZE)
1393c513de8aSStephane Eranian 		printf(" .. code page size: %s\n", get_page_size_name(sample->code_page_size, str));
1394c513de8aSStephane Eranian 
1395475eeab9SAndi Kleen 	if (sample_type & PERF_SAMPLE_TRANSACTION)
1396475eeab9SAndi Kleen 		printf("... transaction: %" PRIx64 "\n", sample->transaction);
1397475eeab9SAndi Kleen 
13989ede473cSJiri Olsa 	if (sample_type & PERF_SAMPLE_READ)
13991fc632ceSJiri Olsa 		sample_read__printf(sample, evsel->core.attr.read_format);
14009aefcab0SThomas Gleixner }
14019aefcab0SThomas Gleixner 
dump_read(struct evsel * evsel,union perf_event * event)140232dcd021SJiri Olsa static void dump_read(struct evsel *evsel, union perf_event *event)
1403dac7f6b7SJiri Olsa {
140469d81f09SArnaldo Carvalho de Melo 	struct perf_record_read *read_event = &event->read;
1405dac7f6b7SJiri Olsa 	u64 read_format;
1406dac7f6b7SJiri Olsa 
1407dac7f6b7SJiri Olsa 	if (!dump_trace)
1408dac7f6b7SJiri Olsa 		return;
1409dac7f6b7SJiri Olsa 
1410213a6c1dSJiri Olsa 	printf(": %d %d %s %" PRI_lu64 "\n", event->read.pid, event->read.tid,
14118ab2e96dSArnaldo Carvalho de Melo 	       evsel__name(evsel), event->read.value);
1412dac7f6b7SJiri Olsa 
1413f3c8d907SLeo Yan 	if (!evsel)
1414f3c8d907SLeo Yan 		return;
1415f3c8d907SLeo Yan 
14161fc632ceSJiri Olsa 	read_format = evsel->core.attr.read_format;
1417dac7f6b7SJiri Olsa 
1418dac7f6b7SJiri Olsa 	if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
1419213a6c1dSJiri Olsa 		printf("... time enabled : %" PRI_lu64 "\n", read_event->time_enabled);
1420dac7f6b7SJiri Olsa 
1421dac7f6b7SJiri Olsa 	if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
1422213a6c1dSJiri Olsa 		printf("... time running : %" PRI_lu64 "\n", read_event->time_running);
1423dac7f6b7SJiri Olsa 
1424dac7f6b7SJiri Olsa 	if (read_format & PERF_FORMAT_ID)
1425213a6c1dSJiri Olsa 		printf("... id           : %" PRI_lu64 "\n", read_event->id);
1426f52679b7SNamhyung Kim 
1427f52679b7SNamhyung Kim 	if (read_format & PERF_FORMAT_LOST)
1428f52679b7SNamhyung Kim 		printf("... lost         : %" PRI_lu64 "\n", read_event->lost);
1429dac7f6b7SJiri Olsa }
1430dac7f6b7SJiri Olsa 
machines__find_for_cpumode(struct machines * machines,union perf_event * event,struct perf_sample * sample)143154245fdcSArnaldo Carvalho de Melo static struct machine *machines__find_for_cpumode(struct machines *machines,
1432ef89325fSAdrian Hunter 					       union perf_event *event,
1433ef89325fSAdrian Hunter 					       struct perf_sample *sample)
1434743eb868SArnaldo Carvalho de Melo {
14357c0f4a41SDavid Ahern 	if (perf_guest &&
1436473398a2SArnaldo Carvalho de Melo 	    ((sample->cpumode == PERF_RECORD_MISC_GUEST_KERNEL) ||
1437473398a2SArnaldo Carvalho de Melo 	     (sample->cpumode == PERF_RECORD_MISC_GUEST_USER))) {
14387fb0a5eeSNikunj A. Dadhania 		u32 pid;
14397fb0a5eeSNikunj A. Dadhania 
144063504909SAdrian Hunter 		if (sample->machine_pid)
144163504909SAdrian Hunter 			pid = sample->machine_pid;
144263504909SAdrian Hunter 		else if (event->header.type == PERF_RECORD_MMAP
14435c5e854bSStephane Eranian 		    || event->header.type == PERF_RECORD_MMAP2)
14447fb0a5eeSNikunj A. Dadhania 			pid = event->mmap.pid;
14457fb0a5eeSNikunj A. Dadhania 		else
1446ef89325fSAdrian Hunter 			pid = sample->pid;
14477fb0a5eeSNikunj A. Dadhania 
1448096fc361SAdrian Hunter 		/*
1449096fc361SAdrian Hunter 		 * Guest code machine is created as needed and does not use
1450096fc361SAdrian Hunter 		 * DEFAULT_GUEST_KERNEL_ID.
1451096fc361SAdrian Hunter 		 */
1452096fc361SAdrian Hunter 		if (symbol_conf.guest_code)
1453096fc361SAdrian Hunter 			return machines__findnew(machines, pid);
1454096fc361SAdrian Hunter 
1455fcda5ff7SAdrian Hunter 		return machines__find_guest(machines, pid);
14567fb0a5eeSNikunj A. Dadhania 	}
1457743eb868SArnaldo Carvalho de Melo 
145854245fdcSArnaldo Carvalho de Melo 	return &machines->host;
1459743eb868SArnaldo Carvalho de Melo }
1460743eb868SArnaldo Carvalho de Melo 
deliver_sample_value(struct evlist * evlist,struct perf_tool * tool,union perf_event * event,struct perf_sample * sample,struct sample_read_value * v,struct machine * machine)146163503dbaSJiri Olsa static int deliver_sample_value(struct evlist *evlist,
1462e4caec0dSJiri Olsa 				struct perf_tool *tool,
1463e4caec0dSJiri Olsa 				union perf_event *event,
1464e4caec0dSJiri Olsa 				struct perf_sample *sample,
1465e4caec0dSJiri Olsa 				struct sample_read_value *v,
1466e4caec0dSJiri Olsa 				struct machine *machine)
1467e4caec0dSJiri Olsa {
14683ccf8a7bSArnaldo Carvalho de Melo 	struct perf_sample_id *sid = evlist__id2sid(evlist, v->id);
146970c20369SJiri Olsa 	struct evsel *evsel;
1470e4caec0dSJiri Olsa 
1471e4caec0dSJiri Olsa 	if (sid) {
1472e4caec0dSJiri Olsa 		sample->id     = v->id;
1473e4caec0dSJiri Olsa 		sample->period = v->value - sid->period;
1474e4caec0dSJiri Olsa 		sid->period    = v->value;
1475e4caec0dSJiri Olsa 	}
1476e4caec0dSJiri Olsa 
1477e4caec0dSJiri Olsa 	if (!sid || sid->evsel == NULL) {
1478313e53b0SArnaldo Carvalho de Melo 		++evlist->stats.nr_unknown_id;
1479e4caec0dSJiri Olsa 		return 0;
1480e4caec0dSJiri Olsa 	}
1481e4caec0dSJiri Olsa 
1482529c1a9eSJiri Olsa 	/*
1483529c1a9eSJiri Olsa 	 * There's no reason to deliver sample
1484529c1a9eSJiri Olsa 	 * for zero period, bail out.
1485529c1a9eSJiri Olsa 	 */
1486529c1a9eSJiri Olsa 	if (!sample->period)
1487529c1a9eSJiri Olsa 		return 0;
1488529c1a9eSJiri Olsa 
148970c20369SJiri Olsa 	evsel = container_of(sid->evsel, struct evsel, core);
149070c20369SJiri Olsa 	return tool->sample(tool, event, sample, evsel, machine);
1491e4caec0dSJiri Olsa }
1492e4caec0dSJiri Olsa 
deliver_sample_group(struct evlist * evlist,struct perf_tool * tool,union perf_event * event,struct perf_sample * sample,struct machine * machine,u64 read_format)149363503dbaSJiri Olsa static int deliver_sample_group(struct evlist *evlist,
1494e4caec0dSJiri Olsa 				struct perf_tool *tool,
1495e4caec0dSJiri Olsa 				union  perf_event *event,
1496e4caec0dSJiri Olsa 				struct perf_sample *sample,
1497f52679b7SNamhyung Kim 				struct machine *machine,
1498f52679b7SNamhyung Kim 				u64 read_format)
1499e4caec0dSJiri Olsa {
1500e4caec0dSJiri Olsa 	int ret = -EINVAL;
1501f52679b7SNamhyung Kim 	struct sample_read_value *v = sample->read.group.values;
1502e4caec0dSJiri Olsa 
1503*ba18185bSIan Rogers 	if (tool->dont_split_sample_group)
1504*ba18185bSIan Rogers 		return deliver_sample_value(evlist, tool, event, sample, v, machine);
1505*ba18185bSIan Rogers 
1506f52679b7SNamhyung Kim 	sample_read_group__for_each(v, sample->read.group.nr, read_format) {
1507f52679b7SNamhyung Kim 		ret = deliver_sample_value(evlist, tool, event, sample, v,
1508e4caec0dSJiri Olsa 					   machine);
1509e4caec0dSJiri Olsa 		if (ret)
1510e4caec0dSJiri Olsa 			break;
1511e4caec0dSJiri Olsa 	}
1512e4caec0dSJiri Olsa 
1513e4caec0dSJiri Olsa 	return ret;
1514e4caec0dSJiri Olsa }
1515e4caec0dSJiri Olsa 
evlist__deliver_sample(struct evlist * evlist,struct perf_tool * tool,union perf_event * event,struct perf_sample * sample,struct evsel * evsel,struct machine * machine)1516515ea461SArnaldo Carvalho de Melo static int evlist__deliver_sample(struct evlist *evlist, struct perf_tool *tool,
1517515ea461SArnaldo Carvalho de Melo 				  union  perf_event *event, struct perf_sample *sample,
1518515ea461SArnaldo Carvalho de Melo 				  struct evsel *evsel, struct machine *machine)
1519e4caec0dSJiri Olsa {
1520e4caec0dSJiri Olsa 	/* We know evsel != NULL. */
15211fc632ceSJiri Olsa 	u64 sample_type = evsel->core.attr.sample_type;
15221fc632ceSJiri Olsa 	u64 read_format = evsel->core.attr.read_format;
1523e4caec0dSJiri Olsa 
1524d94386f2SSoramichi AKIYAMA 	/* Standard sample delivery. */
1525e4caec0dSJiri Olsa 	if (!(sample_type & PERF_SAMPLE_READ))
1526e4caec0dSJiri Olsa 		return tool->sample(tool, event, sample, evsel, machine);
1527e4caec0dSJiri Olsa 
1528e4caec0dSJiri Olsa 	/* For PERF_SAMPLE_READ we have either single or group mode. */
1529e4caec0dSJiri Olsa 	if (read_format & PERF_FORMAT_GROUP)
1530313e53b0SArnaldo Carvalho de Melo 		return deliver_sample_group(evlist, tool, event, sample,
1531f52679b7SNamhyung Kim 					    machine, read_format);
1532e4caec0dSJiri Olsa 	else
1533313e53b0SArnaldo Carvalho de Melo 		return deliver_sample_value(evlist, tool, event, sample,
1534e4caec0dSJiri Olsa 					    &sample->read.one, machine);
1535e4caec0dSJiri Olsa }
1536e4caec0dSJiri Olsa 
machines__deliver_event(struct machines * machines,struct evlist * evlist,union perf_event * event,struct perf_sample * sample,struct perf_tool * tool,u64 file_offset,const char * file_path)1537d10eb1ebSArnaldo Carvalho de Melo static int machines__deliver_event(struct machines *machines,
153863503dbaSJiri Olsa 				   struct evlist *evlist,
15398115d60cSArnaldo Carvalho de Melo 				   union perf_event *event,
15408d50e5b4SArnaldo Carvalho de Melo 				   struct perf_sample *sample,
15412292083fSAlexey Bayduraev 				   struct perf_tool *tool, u64 file_offset,
15422292083fSAlexey Bayduraev 				   const char *file_path)
1543cbf41645SThomas Gleixner {
154432dcd021SJiri Olsa 	struct evsel *evsel;
1545743eb868SArnaldo Carvalho de Melo 	struct machine *machine;
15469e69c210SArnaldo Carvalho de Melo 
15472292083fSAlexey Bayduraev 	dump_event(evlist, event, file_offset, sample, file_path);
1548532e7269SThomas Gleixner 
15493ccf8a7bSArnaldo Carvalho de Melo 	evsel = evlist__id2evsel(evlist, sample->id);
15507b27509fSArnaldo Carvalho de Melo 
1551fa713a4eSArnaldo Carvalho de Melo 	machine = machines__find_for_cpumode(machines, event, sample);
1552743eb868SArnaldo Carvalho de Melo 
1553cbf41645SThomas Gleixner 	switch (event->header.type) {
1554cbf41645SThomas Gleixner 	case PERF_RECORD_SAMPLE:
15559e69c210SArnaldo Carvalho de Melo 		if (evsel == NULL) {
1556313e53b0SArnaldo Carvalho de Melo 			++evlist->stats.nr_unknown_id;
15576782206bSJiri Olsa 			return 0;
15589e69c210SArnaldo Carvalho de Melo 		}
15590c095715SJoerg Roedel 		if (machine == NULL) {
1560313e53b0SArnaldo Carvalho de Melo 			++evlist->stats.nr_unprocessable_samples;
1561d792a7a9SAmeer Hamza 			dump_sample(evsel, event, sample, perf_env__arch(NULL));
15626782206bSJiri Olsa 			return 0;
15630c095715SJoerg Roedel 		}
1564d792a7a9SAmeer Hamza 		dump_sample(evsel, event, sample, perf_env__arch(machine->env));
1565515ea461SArnaldo Carvalho de Melo 		return evlist__deliver_sample(evlist, tool, event, sample, evsel, machine);
1566cbf41645SThomas Gleixner 	case PERF_RECORD_MMAP:
156745694aa7SArnaldo Carvalho de Melo 		return tool->mmap(tool, event, sample, machine);
15685c5e854bSStephane Eranian 	case PERF_RECORD_MMAP2:
1569930e6fcdSKan Liang 		if (event->header.misc & PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT)
1570930e6fcdSKan Liang 			++evlist->stats.nr_proc_map_timeout;
15715c5e854bSStephane Eranian 		return tool->mmap2(tool, event, sample, machine);
1572cbf41645SThomas Gleixner 	case PERF_RECORD_COMM:
157345694aa7SArnaldo Carvalho de Melo 		return tool->comm(tool, event, sample, machine);
1574f3b3614aSHari Bathini 	case PERF_RECORD_NAMESPACES:
1575f3b3614aSHari Bathini 		return tool->namespaces(tool, event, sample, machine);
1576ba78c1c5SNamhyung Kim 	case PERF_RECORD_CGROUP:
1577ba78c1c5SNamhyung Kim 		return tool->cgroup(tool, event, sample, machine);
1578cbf41645SThomas Gleixner 	case PERF_RECORD_FORK:
157945694aa7SArnaldo Carvalho de Melo 		return tool->fork(tool, event, sample, machine);
1580cbf41645SThomas Gleixner 	case PERF_RECORD_EXIT:
158145694aa7SArnaldo Carvalho de Melo 		return tool->exit(tool, event, sample, machine);
1582cbf41645SThomas Gleixner 	case PERF_RECORD_LOST:
158345694aa7SArnaldo Carvalho de Melo 		if (tool->lost == perf_event__process_lost)
1584313e53b0SArnaldo Carvalho de Melo 			evlist->stats.total_lost += event->lost.lost;
158545694aa7SArnaldo Carvalho de Melo 		return tool->lost(tool, event, sample, machine);
1586c4937a91SKan Liang 	case PERF_RECORD_LOST_SAMPLES:
158727c6f245SNamhyung Kim 		if (tool->lost_samples == perf_event__process_lost_samples &&
158827c6f245SNamhyung Kim 		    !(event->header.misc & PERF_RECORD_MISC_LOST_SAMPLES_BPF))
1589c4937a91SKan Liang 			evlist->stats.total_lost_samples += event->lost_samples.lost;
1590c4937a91SKan Liang 		return tool->lost_samples(tool, event, sample, machine);
1591cbf41645SThomas Gleixner 	case PERF_RECORD_READ:
1592dac7f6b7SJiri Olsa 		dump_read(evsel, event);
159345694aa7SArnaldo Carvalho de Melo 		return tool->read(tool, event, sample, evsel, machine);
1594cbf41645SThomas Gleixner 	case PERF_RECORD_THROTTLE:
159545694aa7SArnaldo Carvalho de Melo 		return tool->throttle(tool, event, sample, machine);
1596cbf41645SThomas Gleixner 	case PERF_RECORD_UNTHROTTLE:
159745694aa7SArnaldo Carvalho de Melo 		return tool->unthrottle(tool, event, sample, machine);
15984a96f7a0SAdrian Hunter 	case PERF_RECORD_AUX:
159905a1f47eSAlexander Shishkin 		if (tool->aux == perf_event__process_aux) {
160005a1f47eSAlexander Shishkin 			if (event->aux.flags & PERF_AUX_FLAG_TRUNCATED)
1601a38f48e3SAdrian Hunter 				evlist->stats.total_aux_lost += 1;
160205a1f47eSAlexander Shishkin 			if (event->aux.flags & PERF_AUX_FLAG_PARTIAL)
160305a1f47eSAlexander Shishkin 				evlist->stats.total_aux_partial += 1;
1604c68b421dSSuzuki K Poulose 			if (event->aux.flags & PERF_AUX_FLAG_COLLISION)
1605c68b421dSSuzuki K Poulose 				evlist->stats.total_aux_collision += 1;
160605a1f47eSAlexander Shishkin 		}
16074a96f7a0SAdrian Hunter 		return tool->aux(tool, event, sample, machine);
16080ad21f68SAdrian Hunter 	case PERF_RECORD_ITRACE_START:
16090ad21f68SAdrian Hunter 		return tool->itrace_start(tool, event, sample, machine);
16100286039fSAdrian Hunter 	case PERF_RECORD_SWITCH:
16110286039fSAdrian Hunter 	case PERF_RECORD_SWITCH_CPU_WIDE:
16120286039fSAdrian Hunter 		return tool->context_switch(tool, event, sample, machine);
16139aa0bfa3SSong Liu 	case PERF_RECORD_KSYMBOL:
16149aa0bfa3SSong Liu 		return tool->ksymbol(tool, event, sample, machine);
161545178a92SSong Liu 	case PERF_RECORD_BPF_EVENT:
16163f604b5fSArnaldo Carvalho de Melo 		return tool->bpf(tool, event, sample, machine);
1617246eba8eSAdrian Hunter 	case PERF_RECORD_TEXT_POKE:
1618246eba8eSAdrian Hunter 		return tool->text_poke(tool, event, sample, machine);
161961750473SAdrian Hunter 	case PERF_RECORD_AUX_OUTPUT_HW_ID:
162061750473SAdrian Hunter 		return tool->aux_output_hw_id(tool, event, sample, machine);
1621cbf41645SThomas Gleixner 	default:
1622313e53b0SArnaldo Carvalho de Melo 		++evlist->stats.nr_unknown_events;
1623cbf41645SThomas Gleixner 		return -1;
1624cbf41645SThomas Gleixner 	}
1625cbf41645SThomas Gleixner }
1626cbf41645SThomas Gleixner 
perf_session__deliver_event(struct perf_session * session,union perf_event * event,struct perf_tool * tool,u64 file_offset,const char * file_path)1627c446870dSAdrian Hunter static int perf_session__deliver_event(struct perf_session *session,
1628c446870dSAdrian Hunter 				       union perf_event *event,
1629c446870dSAdrian Hunter 				       struct perf_tool *tool,
16302292083fSAlexey Bayduraev 				       u64 file_offset,
16312292083fSAlexey Bayduraev 				       const char *file_path)
1632c446870dSAdrian Hunter {
163393d10af2SJiri Olsa 	struct perf_sample sample;
16342a6599cdSArnaldo Carvalho de Melo 	int ret = evlist__parse_sample(session->evlist, event, &sample);
1635c446870dSAdrian Hunter 
163693d10af2SJiri Olsa 	if (ret) {
163793d10af2SJiri Olsa 		pr_err("Can't parse sample, err = %d\n", ret);
163893d10af2SJiri Olsa 		return ret;
163993d10af2SJiri Olsa 	}
164093d10af2SJiri Olsa 
164193d10af2SJiri Olsa 	ret = auxtrace__process_event(session, event, &sample, tool);
1642c446870dSAdrian Hunter 	if (ret < 0)
1643c446870dSAdrian Hunter 		return ret;
1644c446870dSAdrian Hunter 	if (ret > 0)
1645c446870dSAdrian Hunter 		return 0;
1646c446870dSAdrian Hunter 
1647b04b8dd1SAdrian Hunter 	ret = machines__deliver_event(&session->machines, session->evlist,
16482292083fSAlexey Bayduraev 				      event, &sample, tool, file_offset, file_path);
1649b04b8dd1SAdrian Hunter 
1650b04b8dd1SAdrian Hunter 	if (dump_trace && sample.aux_sample.size)
1651b04b8dd1SAdrian Hunter 		auxtrace__dump_auxtrace_sample(session, &sample);
1652b04b8dd1SAdrian Hunter 
1653b04b8dd1SAdrian Hunter 	return ret;
1654c446870dSAdrian Hunter }
1655c446870dSAdrian Hunter 
perf_session__process_user_event(struct perf_session * session,union perf_event * event,u64 file_offset,const char * file_path)1656d5652d86SAdrian Hunter static s64 perf_session__process_user_event(struct perf_session *session,
1657d5652d86SAdrian Hunter 					    union perf_event *event,
16582292083fSAlexey Bayduraev 					    u64 file_offset,
16592292083fSAlexey Bayduraev 					    const char *file_path)
166006aae590SArnaldo Carvalho de Melo {
1661d704ebdaSArnaldo Carvalho de Melo 	struct ordered_events *oe = &session->ordered_events;
16629870d780SArnaldo Carvalho de Melo 	struct perf_tool *tool = session->tool;
1663f250b09cSArnaldo Carvalho de Melo 	struct perf_sample sample = { .time = 0, };
16648ceb41d7SJiri Olsa 	int fd = perf_data__fd(session->data);
166510d0f086SArnaldo Carvalho de Melo 	int err;
166610d0f086SArnaldo Carvalho de Melo 
166761a7773cSAlexey Budankov 	if (event->header.type != PERF_RECORD_COMPRESSED ||
166861a7773cSAlexey Budankov 	    tool->compressed == perf_session__process_compressed_event_stub)
16692292083fSAlexey Bayduraev 		dump_event(session->evlist, event, file_offset, &sample, file_path);
167006aae590SArnaldo Carvalho de Melo 
1671cbf41645SThomas Gleixner 	/* These events are processed right away */
167206aae590SArnaldo Carvalho de Melo 	switch (event->header.type) {
16732c46dbb5STom Zanussi 	case PERF_RECORD_HEADER_ATTR:
167447c3d109SAdrian Hunter 		err = tool->attr(tool, event, &session->evlist);
1675cfe1c414SAdrian Hunter 		if (err == 0) {
16767b56cce2SArnaldo Carvalho de Melo 			perf_session__set_id_hdr_size(session);
1677cfe1c414SAdrian Hunter 			perf_session__set_comm_exec(session);
1678cfe1c414SAdrian Hunter 		}
167910d0f086SArnaldo Carvalho de Melo 		return err;
1680ffe77725SJiri Olsa 	case PERF_RECORD_EVENT_UPDATE:
1681ffe77725SJiri Olsa 		return tool->event_update(tool, event, &session->evlist);
1682f67697bdSJiri Olsa 	case PERF_RECORD_HEADER_EVENT_TYPE:
1683f67697bdSJiri Olsa 		/*
16844d39c89fSIngo Molnar 		 * Deprecated, but we need to handle it for sake
1685f67697bdSJiri Olsa 		 * of old data files create in pipe mode.
1686f67697bdSJiri Olsa 		 */
1687f67697bdSJiri Olsa 		return 0;
16889215545eSTom Zanussi 	case PERF_RECORD_HEADER_TRACING_DATA:
1689b491198dSJiri Olsa 		/*
1690b491198dSJiri Olsa 		 * Setup for reading amidst mmap, but only when we
1691b491198dSJiri Olsa 		 * are in 'file' mode. The 'pipe' fd is in proper
1692b491198dSJiri Olsa 		 * place already.
1693b491198dSJiri Olsa 		 */
1694b491198dSJiri Olsa 		if (!perf_data__is_pipe(session->data))
1695cc9784bdSJiri Olsa 			lseek(fd, file_offset, SEEK_SET);
169689f1688aSJiri Olsa 		return tool->tracing_data(session, event);
1697c7929e47STom Zanussi 	case PERF_RECORD_HEADER_BUILD_ID:
169889f1688aSJiri Olsa 		return tool->build_id(session, event);
1699d6b17bebSFrederic Weisbecker 	case PERF_RECORD_FINISHED_ROUND:
1700d704ebdaSArnaldo Carvalho de Melo 		return tool->finished_round(tool, event, oe);
17013c659eedSAdrian Hunter 	case PERF_RECORD_ID_INDEX:
170289f1688aSJiri Olsa 		return tool->id_index(session, event);
1703a16ac023SAdrian Hunter 	case PERF_RECORD_AUXTRACE_INFO:
170489f1688aSJiri Olsa 		return tool->auxtrace_info(session, event);
1705a16ac023SAdrian Hunter 	case PERF_RECORD_AUXTRACE:
170614bf4784SNamhyung Kim 		/*
170714bf4784SNamhyung Kim 		 * Setup for reading amidst mmap, but only when we
170814bf4784SNamhyung Kim 		 * are in 'file' mode.  The 'pipe' fd is in proper
170914bf4784SNamhyung Kim 		 * place already.
171014bf4784SNamhyung Kim 		 */
171114bf4784SNamhyung Kim 		if (!perf_data__is_pipe(session->data))
1712a16ac023SAdrian Hunter 			lseek(fd, file_offset + event->header.size, SEEK_SET);
17137336555aSJiri Olsa 		return tool->auxtrace(session, event);
1714e9bf54d2SAdrian Hunter 	case PERF_RECORD_AUXTRACE_ERROR:
171585ed4729SAdrian Hunter 		perf_session__auxtrace_error_inc(session, event);
171689f1688aSJiri Olsa 		return tool->auxtrace_error(session, event);
17175f3339d2SJiri Olsa 	case PERF_RECORD_THREAD_MAP:
171889f1688aSJiri Olsa 		return tool->thread_map(session, event);
17196640b6c2SJiri Olsa 	case PERF_RECORD_CPU_MAP:
172089f1688aSJiri Olsa 		return tool->cpu_map(session, event);
1721374fb9e3SJiri Olsa 	case PERF_RECORD_STAT_CONFIG:
172289f1688aSJiri Olsa 		return tool->stat_config(session, event);
1723d80518c9SJiri Olsa 	case PERF_RECORD_STAT:
172489f1688aSJiri Olsa 		return tool->stat(session, event);
17252d8f0f18SJiri Olsa 	case PERF_RECORD_STAT_ROUND:
172689f1688aSJiri Olsa 		return tool->stat_round(session, event);
172746bc29b9SAdrian Hunter 	case PERF_RECORD_TIME_CONV:
172846bc29b9SAdrian Hunter 		session->time_conv = event->time_conv;
172989f1688aSJiri Olsa 		return tool->time_conv(session, event);
1730e9def1b2SDavid Carrillo-Cisneros 	case PERF_RECORD_HEADER_FEATURE:
173189f1688aSJiri Olsa 		return tool->feature(session, event);
173261a7773cSAlexey Budankov 	case PERF_RECORD_COMPRESSED:
17332292083fSAlexey Bayduraev 		err = tool->compressed(session, event, file_offset, file_path);
173461a7773cSAlexey Budankov 		if (err)
17352292083fSAlexey Bayduraev 			dump_event(session->evlist, event, file_offset, &sample, file_path);
173661a7773cSAlexey Budankov 		return err;
17373812d298SAdrian Hunter 	case PERF_RECORD_FINISHED_INIT:
17383812d298SAdrian Hunter 		return tool->finished_init(session, event);
173906aae590SArnaldo Carvalho de Melo 	default:
1740ba74f064SThomas Gleixner 		return -EINVAL;
174106aae590SArnaldo Carvalho de Melo 	}
1742ba74f064SThomas Gleixner }
1743ba74f064SThomas Gleixner 
perf_session__deliver_synth_event(struct perf_session * session,union perf_event * event,struct perf_sample * sample)1744a293829dSAdrian Hunter int perf_session__deliver_synth_event(struct perf_session *session,
1745a293829dSAdrian Hunter 				      union perf_event *event,
1746b7b61cbeSArnaldo Carvalho de Melo 				      struct perf_sample *sample)
1747a293829dSAdrian Hunter {
174863503dbaSJiri Olsa 	struct evlist *evlist = session->evlist;
17499870d780SArnaldo Carvalho de Melo 	struct perf_tool *tool = session->tool;
1750fa713a4eSArnaldo Carvalho de Melo 
1751fa713a4eSArnaldo Carvalho de Melo 	events_stats__inc(&evlist->stats, event->header.type);
1752a293829dSAdrian Hunter 
1753a293829dSAdrian Hunter 	if (event->header.type >= PERF_RECORD_USER_TYPE_START)
17542292083fSAlexey Bayduraev 		return perf_session__process_user_event(session, event, 0, NULL);
1755a293829dSAdrian Hunter 
17562292083fSAlexey Bayduraev 	return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0, NULL);
1757a293829dSAdrian Hunter }
1758a293829dSAdrian Hunter 
event_swap(union perf_event * event,bool sample_id_all)1759268fb20fSJiri Olsa static void event_swap(union perf_event *event, bool sample_id_all)
1760268fb20fSJiri Olsa {
1761268fb20fSJiri Olsa 	perf_event__swap_op swap;
1762268fb20fSJiri Olsa 
1763268fb20fSJiri Olsa 	swap = perf_event__swap_ops[event->header.type];
1764268fb20fSJiri Olsa 	if (swap)
1765268fb20fSJiri Olsa 		swap(event, sample_id_all);
1766268fb20fSJiri Olsa }
1767268fb20fSJiri Olsa 
perf_session__peek_event(struct perf_session * session,off_t file_offset,void * buf,size_t buf_sz,union perf_event ** event_ptr,struct perf_sample * sample)17685a52f33aSAdrian Hunter int perf_session__peek_event(struct perf_session *session, off_t file_offset,
17695a52f33aSAdrian Hunter 			     void *buf, size_t buf_sz,
17705a52f33aSAdrian Hunter 			     union perf_event **event_ptr,
17715a52f33aSAdrian Hunter 			     struct perf_sample *sample)
17725a52f33aSAdrian Hunter {
17735a52f33aSAdrian Hunter 	union perf_event *event;
17745a52f33aSAdrian Hunter 	size_t hdr_sz, rest;
17755a52f33aSAdrian Hunter 	int fd;
17765a52f33aSAdrian Hunter 
17775a52f33aSAdrian Hunter 	if (session->one_mmap && !session->header.needs_swap) {
17785a52f33aSAdrian Hunter 		event = file_offset - session->one_mmap_offset +
17795a52f33aSAdrian Hunter 			session->one_mmap_addr;
17805a52f33aSAdrian Hunter 		goto out_parse_sample;
17815a52f33aSAdrian Hunter 	}
17825a52f33aSAdrian Hunter 
17838ceb41d7SJiri Olsa 	if (perf_data__is_pipe(session->data))
17845a52f33aSAdrian Hunter 		return -1;
17855a52f33aSAdrian Hunter 
17868ceb41d7SJiri Olsa 	fd = perf_data__fd(session->data);
17875a52f33aSAdrian Hunter 	hdr_sz = sizeof(struct perf_event_header);
17885a52f33aSAdrian Hunter 
17895a52f33aSAdrian Hunter 	if (buf_sz < hdr_sz)
17905a52f33aSAdrian Hunter 		return -1;
17915a52f33aSAdrian Hunter 
17925a52f33aSAdrian Hunter 	if (lseek(fd, file_offset, SEEK_SET) == (off_t)-1 ||
1793554e92edSAdrian Hunter 	    readn(fd, buf, hdr_sz) != (ssize_t)hdr_sz)
17945a52f33aSAdrian Hunter 		return -1;
17955a52f33aSAdrian Hunter 
17965a52f33aSAdrian Hunter 	event = (union perf_event *)buf;
17975a52f33aSAdrian Hunter 
17985a52f33aSAdrian Hunter 	if (session->header.needs_swap)
17995a52f33aSAdrian Hunter 		perf_event_header__bswap(&event->header);
18005a52f33aSAdrian Hunter 
1801554e92edSAdrian Hunter 	if (event->header.size < hdr_sz || event->header.size > buf_sz)
18025a52f33aSAdrian Hunter 		return -1;
18035a52f33aSAdrian Hunter 
1804197eecb6SLeo Yan 	buf += hdr_sz;
18055a52f33aSAdrian Hunter 	rest = event->header.size - hdr_sz;
18065a52f33aSAdrian Hunter 
1807554e92edSAdrian Hunter 	if (readn(fd, buf, rest) != (ssize_t)rest)
18085a52f33aSAdrian Hunter 		return -1;
18095a52f33aSAdrian Hunter 
18105a52f33aSAdrian Hunter 	if (session->header.needs_swap)
18118cedf3a5SArnaldo Carvalho de Melo 		event_swap(event, evlist__sample_id_all(session->evlist));
18125a52f33aSAdrian Hunter 
18135a52f33aSAdrian Hunter out_parse_sample:
18145a52f33aSAdrian Hunter 
18155a52f33aSAdrian Hunter 	if (sample && event->header.type < PERF_RECORD_USER_TYPE_START &&
18162a6599cdSArnaldo Carvalho de Melo 	    evlist__parse_sample(session->evlist, event, sample))
18175a52f33aSAdrian Hunter 		return -1;
18185a52f33aSAdrian Hunter 
18195a52f33aSAdrian Hunter 	*event_ptr = event;
18205a52f33aSAdrian Hunter 
18215a52f33aSAdrian Hunter 	return 0;
18225a52f33aSAdrian Hunter }
18235a52f33aSAdrian Hunter 
perf_session__peek_events(struct perf_session * session,u64 offset,u64 size,peek_events_cb_t cb,void * data)1824103ed40eSAdrian Hunter int perf_session__peek_events(struct perf_session *session, u64 offset,
1825103ed40eSAdrian Hunter 			      u64 size, peek_events_cb_t cb, void *data)
1826103ed40eSAdrian Hunter {
1827103ed40eSAdrian Hunter 	u64 max_offset = offset + size;
1828103ed40eSAdrian Hunter 	char buf[PERF_SAMPLE_MAX_SIZE];
1829103ed40eSAdrian Hunter 	union perf_event *event;
1830103ed40eSAdrian Hunter 	int err;
1831103ed40eSAdrian Hunter 
1832103ed40eSAdrian Hunter 	do {
1833103ed40eSAdrian Hunter 		err = perf_session__peek_event(session, offset, buf,
1834103ed40eSAdrian Hunter 					       PERF_SAMPLE_MAX_SIZE, &event,
1835103ed40eSAdrian Hunter 					       NULL);
1836103ed40eSAdrian Hunter 		if (err)
1837103ed40eSAdrian Hunter 			return err;
1838103ed40eSAdrian Hunter 
1839103ed40eSAdrian Hunter 		err = cb(session, event, offset, data);
1840103ed40eSAdrian Hunter 		if (err)
1841103ed40eSAdrian Hunter 			return err;
1842103ed40eSAdrian Hunter 
1843103ed40eSAdrian Hunter 		offset += event->header.size;
1844103ed40eSAdrian Hunter 		if (event->header.type == PERF_RECORD_AUXTRACE)
1845103ed40eSAdrian Hunter 			offset += event->auxtrace.size;
1846103ed40eSAdrian Hunter 
1847103ed40eSAdrian Hunter 	} while (offset < max_offset);
1848103ed40eSAdrian Hunter 
1849103ed40eSAdrian Hunter 	return err;
1850103ed40eSAdrian Hunter }
1851103ed40eSAdrian Hunter 
perf_session__process_event(struct perf_session * session,union perf_event * event,u64 file_offset,const char * file_path)1852d5652d86SAdrian Hunter static s64 perf_session__process_event(struct perf_session *session,
18532292083fSAlexey Bayduraev 				       union perf_event *event, u64 file_offset,
18542292083fSAlexey Bayduraev 				       const char *file_path)
1855ba74f064SThomas Gleixner {
185663503dbaSJiri Olsa 	struct evlist *evlist = session->evlist;
18579870d780SArnaldo Carvalho de Melo 	struct perf_tool *tool = session->tool;
1858ba74f064SThomas Gleixner 	int ret;
1859ba74f064SThomas Gleixner 
1860268fb20fSJiri Olsa 	if (session->header.needs_swap)
18618cedf3a5SArnaldo Carvalho de Melo 		event_swap(event, evlist__sample_id_all(evlist));
1862ba74f064SThomas Gleixner 
1863ba74f064SThomas Gleixner 	if (event->header.type >= PERF_RECORD_HEADER_MAX)
1864ba74f064SThomas Gleixner 		return -EINVAL;
1865ba74f064SThomas Gleixner 
1866313e53b0SArnaldo Carvalho de Melo 	events_stats__inc(&evlist->stats, event->header.type);
1867ba74f064SThomas Gleixner 
1868ba74f064SThomas Gleixner 	if (event->header.type >= PERF_RECORD_USER_TYPE_START)
18692292083fSAlexey Bayduraev 		return perf_session__process_user_event(session, event, file_offset, file_path);
1870cbf41645SThomas Gleixner 
187193d10af2SJiri Olsa 	if (tool->ordered_events) {
1872631e8f0aSMathieu Poirier 		u64 timestamp = -1ULL;
187393d10af2SJiri Olsa 
18742a6599cdSArnaldo Carvalho de Melo 		ret = evlist__parse_sample_timestamp(evlist, event, &timestamp);
1875631e8f0aSMathieu Poirier 		if (ret && ret != -1)
18765538becaSFrederic Weisbecker 			return ret;
18773dfc2c0aSThomas Gleixner 
18782292083fSAlexey Bayduraev 		ret = perf_session__queue_event(session, event, timestamp, file_offset, file_path);
1879cbf41645SThomas Gleixner 		if (ret != -ETIME)
1880cbf41645SThomas Gleixner 			return ret;
1881cbf41645SThomas Gleixner 	}
1882cbf41645SThomas Gleixner 
18832292083fSAlexey Bayduraev 	return perf_session__deliver_event(session, event, tool, file_offset, file_path);
188406aae590SArnaldo Carvalho de Melo }
188506aae590SArnaldo Carvalho de Melo 
perf_event_header__bswap(struct perf_event_header * hdr)1886316c7136SArnaldo Carvalho de Melo void perf_event_header__bswap(struct perf_event_header *hdr)
1887ba21594cSArnaldo Carvalho de Melo {
1888316c7136SArnaldo Carvalho de Melo 	hdr->type = bswap_32(hdr->type);
1889316c7136SArnaldo Carvalho de Melo 	hdr->misc = bswap_16(hdr->misc);
1890316c7136SArnaldo Carvalho de Melo 	hdr->size = bswap_16(hdr->size);
1891ba21594cSArnaldo Carvalho de Melo }
1892ba21594cSArnaldo Carvalho de Melo 
perf_session__findnew(struct perf_session * session,pid_t pid)1893b424eba2SArnaldo Carvalho de Melo struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
1894b424eba2SArnaldo Carvalho de Melo {
18951fcb8768SAdrian Hunter 	return machine__findnew_thread(&session->machines.host, -1, pid);
1896b424eba2SArnaldo Carvalho de Melo }
1897b424eba2SArnaldo Carvalho de Melo 
perf_session__register_idle_thread(struct perf_session * session)18989d8b172fSMasami Hiramatsu int perf_session__register_idle_thread(struct perf_session *session)
189906aae590SArnaldo Carvalho de Melo {
19003035cb6cSAdrian Hunter 	struct thread *thread = machine__idle_thread(&session->machines.host);
190106aae590SArnaldo Carvalho de Melo 
19023035cb6cSAdrian Hunter 	/* machine__idle_thread() got the thread, so put it */
19039d8b172fSMasami Hiramatsu 	thread__put(thread);
19043035cb6cSAdrian Hunter 	return thread ? 0 : -1;
190506aae590SArnaldo Carvalho de Melo }
190606aae590SArnaldo Carvalho de Melo 
1907f06149c0SWang Nan static void
perf_session__warn_order(const struct perf_session * session)1908f06149c0SWang Nan perf_session__warn_order(const struct perf_session *session)
1909f06149c0SWang Nan {
1910f06149c0SWang Nan 	const struct ordered_events *oe = &session->ordered_events;
191132dcd021SJiri Olsa 	struct evsel *evsel;
1912f06149c0SWang Nan 	bool should_warn = true;
1913f06149c0SWang Nan 
1914f06149c0SWang Nan 	evlist__for_each_entry(session->evlist, evsel) {
19151fc632ceSJiri Olsa 		if (evsel->core.attr.write_backward)
1916f06149c0SWang Nan 			should_warn = false;
1917f06149c0SWang Nan 	}
1918f06149c0SWang Nan 
1919f06149c0SWang Nan 	if (!should_warn)
1920f06149c0SWang Nan 		return;
1921f06149c0SWang Nan 	if (oe->nr_unordered_events != 0)
1922f06149c0SWang Nan 		ui__warning("%u out of order events recorded.\n", oe->nr_unordered_events);
1923f06149c0SWang Nan }
1924f06149c0SWang Nan 
perf_session__warn_about_errors(const struct perf_session * session)19259870d780SArnaldo Carvalho de Melo static void perf_session__warn_about_errors(const struct perf_session *session)
192611095994SArnaldo Carvalho de Melo {
19279870d780SArnaldo Carvalho de Melo 	const struct events_stats *stats = &session->evlist->stats;
19289870d780SArnaldo Carvalho de Melo 
19299870d780SArnaldo Carvalho de Melo 	if (session->tool->lost == perf_event__process_lost &&
1930ccda068fSArnaldo Carvalho de Melo 	    stats->nr_events[PERF_RECORD_LOST] != 0) {
19317b27509fSArnaldo Carvalho de Melo 		ui__warning("Processed %d events and lost %d chunks!\n\n"
19327b27509fSArnaldo Carvalho de Melo 			    "Check IO/CPU overload!\n\n",
1933ccda068fSArnaldo Carvalho de Melo 			    stats->nr_events[0],
1934ccda068fSArnaldo Carvalho de Melo 			    stats->nr_events[PERF_RECORD_LOST]);
193511095994SArnaldo Carvalho de Melo 	}
193611095994SArnaldo Carvalho de Melo 
1937c4937a91SKan Liang 	if (session->tool->lost_samples == perf_event__process_lost_samples) {
1938c4937a91SKan Liang 		double drop_rate;
1939c4937a91SKan Liang 
1940c4937a91SKan Liang 		drop_rate = (double)stats->total_lost_samples /
1941c4937a91SKan Liang 			    (double) (stats->nr_events[PERF_RECORD_SAMPLE] + stats->total_lost_samples);
1942c4937a91SKan Liang 		if (drop_rate > 0.05) {
194341a43dacSArnaldo Carvalho de Melo 			ui__warning("Processed %" PRIu64 " samples and lost %3.2f%%!\n\n",
1944c4937a91SKan Liang 				    stats->nr_events[PERF_RECORD_SAMPLE] + stats->total_lost_samples,
1945c4937a91SKan Liang 				    drop_rate * 100.0);
1946c4937a91SKan Liang 		}
1947c4937a91SKan Liang 	}
1948c4937a91SKan Liang 
1949a38f48e3SAdrian Hunter 	if (session->tool->aux == perf_event__process_aux &&
1950a38f48e3SAdrian Hunter 	    stats->total_aux_lost != 0) {
1951a38f48e3SAdrian Hunter 		ui__warning("AUX data lost %" PRIu64 " times out of %u!\n\n",
1952a38f48e3SAdrian Hunter 			    stats->total_aux_lost,
1953a38f48e3SAdrian Hunter 			    stats->nr_events[PERF_RECORD_AUX]);
1954a38f48e3SAdrian Hunter 	}
1955a38f48e3SAdrian Hunter 
195605a1f47eSAlexander Shishkin 	if (session->tool->aux == perf_event__process_aux &&
195705a1f47eSAlexander Shishkin 	    stats->total_aux_partial != 0) {
195805a1f47eSAlexander Shishkin 		bool vmm_exclusive = false;
195905a1f47eSAlexander Shishkin 
196005a1f47eSAlexander Shishkin 		(void)sysfs__read_bool("module/kvm_intel/parameters/vmm_exclusive",
196105a1f47eSAlexander Shishkin 		                       &vmm_exclusive);
196205a1f47eSAlexander Shishkin 
196305a1f47eSAlexander Shishkin 		ui__warning("AUX data had gaps in it %" PRIu64 " times out of %u!\n\n"
196405a1f47eSAlexander Shishkin 		            "Are you running a KVM guest in the background?%s\n\n",
196505a1f47eSAlexander Shishkin 			    stats->total_aux_partial,
196605a1f47eSAlexander Shishkin 			    stats->nr_events[PERF_RECORD_AUX],
196705a1f47eSAlexander Shishkin 			    vmm_exclusive ?
196805a1f47eSAlexander Shishkin 			    "\nReloading kvm_intel module with vmm_exclusive=0\n"
196905a1f47eSAlexander Shishkin 			    "will reduce the gaps to only guest's timeslices." :
197005a1f47eSAlexander Shishkin 			    "");
197105a1f47eSAlexander Shishkin 	}
197205a1f47eSAlexander Shishkin 
1973c68b421dSSuzuki K Poulose 	if (session->tool->aux == perf_event__process_aux &&
1974c68b421dSSuzuki K Poulose 	    stats->total_aux_collision != 0) {
1975c68b421dSSuzuki K Poulose 		ui__warning("AUX data detected collision  %" PRIu64 " times out of %u!\n\n",
1976c68b421dSSuzuki K Poulose 			    stats->total_aux_collision,
1977c68b421dSSuzuki K Poulose 			    stats->nr_events[PERF_RECORD_AUX]);
1978c68b421dSSuzuki K Poulose 	}
1979c68b421dSSuzuki K Poulose 
1980ccda068fSArnaldo Carvalho de Melo 	if (stats->nr_unknown_events != 0) {
198111095994SArnaldo Carvalho de Melo 		ui__warning("Found %u unknown events!\n\n"
198211095994SArnaldo Carvalho de Melo 			    "Is this an older tool processing a perf.data "
198311095994SArnaldo Carvalho de Melo 			    "file generated by a more recent tool?\n\n"
198411095994SArnaldo Carvalho de Melo 			    "If that is not the case, consider "
198511095994SArnaldo Carvalho de Melo 			    "reporting to linux-kernel@vger.kernel.org.\n\n",
1986ccda068fSArnaldo Carvalho de Melo 			    stats->nr_unknown_events);
198711095994SArnaldo Carvalho de Melo 	}
198811095994SArnaldo Carvalho de Melo 
1989ccda068fSArnaldo Carvalho de Melo 	if (stats->nr_unknown_id != 0) {
19909e69c210SArnaldo Carvalho de Melo 		ui__warning("%u samples with id not present in the header\n",
1991ccda068fSArnaldo Carvalho de Melo 			    stats->nr_unknown_id);
19929e69c210SArnaldo Carvalho de Melo 	}
19939e69c210SArnaldo Carvalho de Melo 
1994ccda068fSArnaldo Carvalho de Melo 	if (stats->nr_invalid_chains != 0) {
199511095994SArnaldo Carvalho de Melo 		ui__warning("Found invalid callchains!\n\n"
199611095994SArnaldo Carvalho de Melo 			    "%u out of %u events were discarded for this reason.\n\n"
199711095994SArnaldo Carvalho de Melo 			    "Consider reporting to linux-kernel@vger.kernel.org.\n\n",
1998ccda068fSArnaldo Carvalho de Melo 			    stats->nr_invalid_chains,
1999ccda068fSArnaldo Carvalho de Melo 			    stats->nr_events[PERF_RECORD_SAMPLE]);
200011095994SArnaldo Carvalho de Melo 	}
20010c095715SJoerg Roedel 
2002ccda068fSArnaldo Carvalho de Melo 	if (stats->nr_unprocessable_samples != 0) {
20030c095715SJoerg Roedel 		ui__warning("%u unprocessable samples recorded.\n"
20040c095715SJoerg Roedel 			    "Do you have a KVM guest running and not using 'perf kvm'?\n",
2005ccda068fSArnaldo Carvalho de Melo 			    stats->nr_unprocessable_samples);
20060c095715SJoerg Roedel 	}
2007f61ff6c0SJiri Olsa 
2008f06149c0SWang Nan 	perf_session__warn_order(session);
200985ed4729SAdrian Hunter 
201085ed4729SAdrian Hunter 	events_stats__auxtrace_error_warn(stats);
2011930e6fcdSKan Liang 
2012930e6fcdSKan Liang 	if (stats->nr_proc_map_timeout != 0) {
2013930e6fcdSKan Liang 		ui__warning("%d map information files for pre-existing threads were\n"
2014930e6fcdSKan Liang 			    "not processed, if there are samples for addresses they\n"
2015930e6fcdSKan Liang 			    "will not be resolved, you may find out which are these\n"
2016930e6fcdSKan Liang 			    "threads by running with -v and redirecting the output\n"
20179d9cad76SKan Liang 			    "to a file.\n"
20189d9cad76SKan Liang 			    "The time limit to process proc map is too short?\n"
20199d9cad76SKan Liang 			    "Increase it by --proc-map-timeout\n",
2020930e6fcdSKan Liang 			    stats->nr_proc_map_timeout);
2021930e6fcdSKan Liang 	}
202211095994SArnaldo Carvalho de Melo }
202311095994SArnaldo Carvalho de Melo 
perf_session__flush_thread_stack(struct thread * thread,void * p __maybe_unused)2024a5499b37SAdrian Hunter static int perf_session__flush_thread_stack(struct thread *thread,
2025a5499b37SAdrian Hunter 					    void *p __maybe_unused)
2026a5499b37SAdrian Hunter {
2027a5499b37SAdrian Hunter 	return thread_stack__flush(thread);
2028a5499b37SAdrian Hunter }
2029a5499b37SAdrian Hunter 
perf_session__flush_thread_stacks(struct perf_session * session)2030a5499b37SAdrian Hunter static int perf_session__flush_thread_stacks(struct perf_session *session)
2031a5499b37SAdrian Hunter {
2032a5499b37SAdrian Hunter 	return machines__for_each_thread(&session->machines,
2033a5499b37SAdrian Hunter 					 perf_session__flush_thread_stack,
2034a5499b37SAdrian Hunter 					 NULL);
2035a5499b37SAdrian Hunter }
2036a5499b37SAdrian Hunter 
2037057929f9SIan Rogers volatile sig_atomic_t session_done;
20388dc58101STom Zanussi 
2039cb62c6f1SAlexey Budankov static int __perf_session__process_decomp_events(struct perf_session *session);
2040cb62c6f1SAlexey Budankov 
__perf_session__process_pipe_events(struct perf_session * session)2041b7b61cbeSArnaldo Carvalho de Melo static int __perf_session__process_pipe_events(struct perf_session *session)
20428dc58101STom Zanussi {
2043fa713a4eSArnaldo Carvalho de Melo 	struct ordered_events *oe = &session->ordered_events;
20449870d780SArnaldo Carvalho de Melo 	struct perf_tool *tool = session->tool;
2045444d2866SStephane Eranian 	union perf_event *event;
2046444d2866SStephane Eranian 	uint32_t size, cur_size = 0;
2047444d2866SStephane Eranian 	void *buf = NULL;
2048d5652d86SAdrian Hunter 	s64 skip = 0;
20498dc58101STom Zanussi 	u64 head;
2050727ebd54SJiri Olsa 	ssize_t err;
20518dc58101STom Zanussi 	void *p;
20528dc58101STom Zanussi 
205345694aa7SArnaldo Carvalho de Melo 	perf_tool__fill_defaults(tool);
20548dc58101STom Zanussi 
20558dc58101STom Zanussi 	head = 0;
2056444d2866SStephane Eranian 	cur_size = sizeof(union perf_event);
2057444d2866SStephane Eranian 
2058444d2866SStephane Eranian 	buf = malloc(cur_size);
2059444d2866SStephane Eranian 	if (!buf)
2060444d2866SStephane Eranian 		return -errno;
20611e0d4f02SDavid Carrillo-Cisneros 	ordered_events__set_copy_on_queue(oe, true);
20628dc58101STom Zanussi more:
2063444d2866SStephane Eranian 	event = buf;
206460136667SNamhyung Kim 	err = perf_data__read(session->data, event,
206560136667SNamhyung Kim 			      sizeof(struct perf_event_header));
20668dc58101STom Zanussi 	if (err <= 0) {
20678dc58101STom Zanussi 		if (err == 0)
20688dc58101STom Zanussi 			goto done;
20698dc58101STom Zanussi 
20708dc58101STom Zanussi 		pr_err("failed to read event header\n");
20718dc58101STom Zanussi 		goto out_err;
20728dc58101STom Zanussi 	}
20738dc58101STom Zanussi 
2074316c7136SArnaldo Carvalho de Melo 	if (session->header.needs_swap)
2075444d2866SStephane Eranian 		perf_event_header__bswap(&event->header);
20768dc58101STom Zanussi 
2077444d2866SStephane Eranian 	size = event->header.size;
207827389d78SAdrian Hunter 	if (size < sizeof(struct perf_event_header)) {
207927389d78SAdrian Hunter 		pr_err("bad event header size\n");
208027389d78SAdrian Hunter 		goto out_err;
208127389d78SAdrian Hunter 	}
20828dc58101STom Zanussi 
2083444d2866SStephane Eranian 	if (size > cur_size) {
2084444d2866SStephane Eranian 		void *new = realloc(buf, size);
2085444d2866SStephane Eranian 		if (!new) {
2086444d2866SStephane Eranian 			pr_err("failed to allocate memory to read event\n");
2087444d2866SStephane Eranian 			goto out_err;
2088444d2866SStephane Eranian 		}
2089444d2866SStephane Eranian 		buf = new;
2090444d2866SStephane Eranian 		cur_size = size;
2091444d2866SStephane Eranian 		event = buf;
2092444d2866SStephane Eranian 	}
2093444d2866SStephane Eranian 	p = event;
20948dc58101STom Zanussi 	p += sizeof(struct perf_event_header);
20958dc58101STom Zanussi 
2096794e43b5STom Zanussi 	if (size - sizeof(struct perf_event_header)) {
209760136667SNamhyung Kim 		err = perf_data__read(session->data, p,
209860136667SNamhyung Kim 				      size - sizeof(struct perf_event_header));
20998dc58101STom Zanussi 		if (err <= 0) {
21008dc58101STom Zanussi 			if (err == 0) {
21018dc58101STom Zanussi 				pr_err("unexpected end of event stream\n");
21028dc58101STom Zanussi 				goto done;
21038dc58101STom Zanussi 			}
21048dc58101STom Zanussi 
21058dc58101STom Zanussi 			pr_err("failed to read event data\n");
21068dc58101STom Zanussi 			goto out_err;
21078dc58101STom Zanussi 		}
2108794e43b5STom Zanussi 	}
21098dc58101STom Zanussi 
21102292083fSAlexey Bayduraev 	if ((skip = perf_session__process_event(session, event, head, "pipe")) < 0) {
21119389a460SJiri Olsa 		pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
2112444d2866SStephane Eranian 		       head, event->header.size, event->header.type);
21139389a460SJiri Olsa 		err = -EINVAL;
21149389a460SJiri Olsa 		goto out_err;
21158dc58101STom Zanussi 	}
21168dc58101STom Zanussi 
21178dc58101STom Zanussi 	head += size;
21188dc58101STom Zanussi 
21198dc58101STom Zanussi 	if (skip > 0)
21208dc58101STom Zanussi 		head += skip;
21218dc58101STom Zanussi 
2122cb62c6f1SAlexey Budankov 	err = __perf_session__process_decomp_events(session);
2123cb62c6f1SAlexey Budankov 	if (err)
2124cb62c6f1SAlexey Budankov 		goto out_err;
2125cb62c6f1SAlexey Budankov 
21268dc58101STom Zanussi 	if (!session_done())
21278dc58101STom Zanussi 		goto more;
21288dc58101STom Zanussi done:
21298c16b649SAdrian Hunter 	/* do the final flush for ordered samples */
2130b7b61cbeSArnaldo Carvalho de Melo 	err = ordered_events__flush(oe, OE_FLUSH__FINAL);
2131c446870dSAdrian Hunter 	if (err)
2132c446870dSAdrian Hunter 		goto out_err;
2133c446870dSAdrian Hunter 	err = auxtrace__flush_events(session, tool);
2134a5499b37SAdrian Hunter 	if (err)
2135a5499b37SAdrian Hunter 		goto out_err;
2136a5499b37SAdrian Hunter 	err = perf_session__flush_thread_stacks(session);
21378dc58101STom Zanussi out_err:
2138444d2866SStephane Eranian 	free(buf);
2139075ca1ebSJiri Olsa 	if (!tool->no_warn)
21409870d780SArnaldo Carvalho de Melo 		perf_session__warn_about_errors(session);
2141adc56ed1SJiri Olsa 	ordered_events__free(&session->ordered_events);
2142c446870dSAdrian Hunter 	auxtrace__free_events(session);
21438dc58101STom Zanussi 	return err;
21448dc58101STom Zanussi }
21458dc58101STom Zanussi 
2146998bedc8SFrederic Weisbecker static union perf_event *
prefetch_event(char * buf,u64 head,size_t mmap_size,bool needs_swap,union perf_event * error)2147bb1835a3SAlexey Budankov prefetch_event(char *buf, u64 head, size_t mmap_size,
2148bb1835a3SAlexey Budankov 	       bool needs_swap, union perf_event *error)
2149998bedc8SFrederic Weisbecker {
2150998bedc8SFrederic Weisbecker 	union perf_event *event;
2151bc21e74dSDenis Nikitin 	u16 event_size;
2152998bedc8SFrederic Weisbecker 
2153998bedc8SFrederic Weisbecker 	/*
2154998bedc8SFrederic Weisbecker 	 * Ensure we have enough space remaining to read
2155998bedc8SFrederic Weisbecker 	 * the size of the event in the headers.
2156998bedc8SFrederic Weisbecker 	 */
2157998bedc8SFrederic Weisbecker 	if (head + sizeof(event->header) > mmap_size)
2158998bedc8SFrederic Weisbecker 		return NULL;
2159998bedc8SFrederic Weisbecker 
2160998bedc8SFrederic Weisbecker 	event = (union perf_event *)(buf + head);
2161bb1835a3SAlexey Budankov 	if (needs_swap)
2162998bedc8SFrederic Weisbecker 		perf_event_header__bswap(&event->header);
2163998bedc8SFrederic Weisbecker 
2164bc21e74dSDenis Nikitin 	event_size = event->header.size;
2165bc21e74dSDenis Nikitin 	if (head + event_size <= mmap_size)
2166bb1835a3SAlexey Budankov 		return event;
2167bb1835a3SAlexey Budankov 
216827389d78SAdrian Hunter 	/* We're not fetching the event so swap back again */
2169bb1835a3SAlexey Budankov 	if (needs_swap)
217027389d78SAdrian Hunter 		perf_event_header__bswap(&event->header);
2171bb1835a3SAlexey Budankov 
2172bc21e74dSDenis Nikitin 	/* Check if the event fits into the next mmapped buf. */
2173bc21e74dSDenis Nikitin 	if (event_size <= mmap_size - head % page_size) {
2174bc21e74dSDenis Nikitin 		/* Remap buf and fetch again. */
2175bc21e74dSDenis Nikitin 		return NULL;
2176bc21e74dSDenis Nikitin 	}
2177bc21e74dSDenis Nikitin 
2178bc21e74dSDenis Nikitin 	/* Invalid input. Event size should never exceed mmap_size. */
2179bc21e74dSDenis Nikitin 	pr_debug("%s: head=%#" PRIx64 " event->header.size=%#x, mmap_size=%#zx:"
2180bc21e74dSDenis Nikitin 		 " fuzzed or compressed perf.data?\n", __func__, head, event_size, mmap_size);
2181bb1835a3SAlexey Budankov 
2182bb1835a3SAlexey Budankov 	return error;
218327389d78SAdrian Hunter }
2184998bedc8SFrederic Weisbecker 
2185bb1835a3SAlexey Budankov static union perf_event *
fetch_mmaped_event(u64 head,size_t mmap_size,char * buf,bool needs_swap)2186bb1835a3SAlexey Budankov fetch_mmaped_event(u64 head, size_t mmap_size, char *buf, bool needs_swap)
2187bb1835a3SAlexey Budankov {
2188bb1835a3SAlexey Budankov 	return prefetch_event(buf, head, mmap_size, needs_swap, ERR_PTR(-EINVAL));
2189bb1835a3SAlexey Budankov }
2190bb1835a3SAlexey Budankov 
2191bb1835a3SAlexey Budankov static union perf_event *
fetch_decomp_event(u64 head,size_t mmap_size,char * buf,bool needs_swap)2192bb1835a3SAlexey Budankov fetch_decomp_event(u64 head, size_t mmap_size, char *buf, bool needs_swap)
2193bb1835a3SAlexey Budankov {
2194bb1835a3SAlexey Budankov 	return prefetch_event(buf, head, mmap_size, needs_swap, NULL);
2195998bedc8SFrederic Weisbecker }
2196998bedc8SFrederic Weisbecker 
__perf_session__process_decomp_events(struct perf_session * session)2197cb62c6f1SAlexey Budankov static int __perf_session__process_decomp_events(struct perf_session *session)
2198cb62c6f1SAlexey Budankov {
2199cb62c6f1SAlexey Budankov 	s64 skip;
22008e820f96SAlexey Bayduraev 	u64 size;
22013a3535e6SAlexey Bayduraev 	struct decomp *decomp = session->active_decomp->decomp_last;
2202cb62c6f1SAlexey Budankov 
2203cb62c6f1SAlexey Budankov 	if (!decomp)
2204cb62c6f1SAlexey Budankov 		return 0;
2205cb62c6f1SAlexey Budankov 
2206cb62c6f1SAlexey Budankov 	while (decomp->head < decomp->size && !session_done()) {
2207bb1835a3SAlexey Budankov 		union perf_event *event = fetch_decomp_event(decomp->head, decomp->size, decomp->data,
2208bb1835a3SAlexey Budankov 							     session->header.needs_swap);
220957fc032aSArnaldo Carvalho de Melo 
2210cb62c6f1SAlexey Budankov 		if (!event)
2211cb62c6f1SAlexey Budankov 			break;
2212cb62c6f1SAlexey Budankov 
2213cb62c6f1SAlexey Budankov 		size = event->header.size;
2214cb62c6f1SAlexey Budankov 
2215cb62c6f1SAlexey Budankov 		if (size < sizeof(struct perf_event_header) ||
22162292083fSAlexey Bayduraev 		    (skip = perf_session__process_event(session, event, decomp->file_pos,
22172292083fSAlexey Bayduraev 							decomp->file_path)) < 0) {
2218cb62c6f1SAlexey Budankov 			pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
2219cb62c6f1SAlexey Budankov 				decomp->file_pos + decomp->head, event->header.size, event->header.type);
2220cb62c6f1SAlexey Budankov 			return -EINVAL;
2221cb62c6f1SAlexey Budankov 		}
2222cb62c6f1SAlexey Budankov 
2223cb62c6f1SAlexey Budankov 		if (skip)
2224cb62c6f1SAlexey Budankov 			size += skip;
2225cb62c6f1SAlexey Budankov 
2226cb62c6f1SAlexey Budankov 		decomp->head += size;
2227cb62c6f1SAlexey Budankov 	}
2228cb62c6f1SAlexey Budankov 
2229cb62c6f1SAlexey Budankov 	return 0;
2230cb62c6f1SAlexey Budankov }
2231cb62c6f1SAlexey Budankov 
223235d48ddfSDavid Miller /*
223335d48ddfSDavid Miller  * On 64bit we can mmap the data file in one go. No need for tiny mmap
223435d48ddfSDavid Miller  * slices. On 32bit we use 32MB.
223535d48ddfSDavid Miller  */
223635d48ddfSDavid Miller #if BITS_PER_LONG == 64
223735d48ddfSDavid Miller #define MMAP_SIZE ULLONG_MAX
223835d48ddfSDavid Miller #define NUM_MMAPS 1
223935d48ddfSDavid Miller #else
224035d48ddfSDavid Miller #define MMAP_SIZE (32 * 1024 * 1024ULL)
224135d48ddfSDavid Miller #define NUM_MMAPS 128
224235d48ddfSDavid Miller #endif
224335d48ddfSDavid Miller 
2244e51f8061SJiri Olsa struct reader;
2245e51f8061SJiri Olsa 
2246e51f8061SJiri Olsa typedef s64 (*reader_cb_t)(struct perf_session *session,
2247e51f8061SJiri Olsa 			   union perf_event *event,
22482292083fSAlexey Bayduraev 			   u64 file_offset,
22492292083fSAlexey Bayduraev 			   const char *file_path);
2250e51f8061SJiri Olsa 
225182715eb1SJiri Olsa struct reader {
225282715eb1SJiri Olsa 	int		 fd;
22532292083fSAlexey Bayduraev 	const char	 *path;
2254f66f0950SJiri Olsa 	u64		 data_size;
225571002bd2SJiri Olsa 	u64		 data_offset;
2256e51f8061SJiri Olsa 	reader_cb_t	 process;
22572a525f6aSAdrian Hunter 	bool		 in_place_update;
2258529b6fbcSAlexey Bayduraev 	char		 *mmaps[NUM_MMAPS];
2259529b6fbcSAlexey Bayduraev 	size_t		 mmap_size;
2260529b6fbcSAlexey Bayduraev 	int		 mmap_idx;
2261529b6fbcSAlexey Bayduraev 	char		 *mmap_cur;
2262529b6fbcSAlexey Bayduraev 	u64		 file_pos;
2263529b6fbcSAlexey Bayduraev 	u64		 file_offset;
2264529b6fbcSAlexey Bayduraev 	u64		 head;
2265bb6be405SAlexey Bayduraev 	u64		 size;
2266bb6be405SAlexey Bayduraev 	bool		 done;
22673a3535e6SAlexey Bayduraev 	struct zstd_data   zstd_data;
22683a3535e6SAlexey Bayduraev 	struct decomp_data decomp_data;
226982715eb1SJiri Olsa };
227082715eb1SJiri Olsa 
22713c7b67b2SJiri Olsa static int
reader__init(struct reader * rd,bool * one_mmap)227259650630SAlexey Bayduraev reader__init(struct reader *rd, bool *one_mmap)
227306aae590SArnaldo Carvalho de Melo {
22743c7b67b2SJiri Olsa 	u64 data_size = rd->data_size;
227559650630SAlexey Bayduraev 	char **mmaps = rd->mmaps;
22760331ee0cSThomas Gleixner 
2277de096489SAlexey Bayduraev 	rd->head = rd->data_offset;
22783c7b67b2SJiri Olsa 	data_size += rd->data_offset;
227955b44629SThomas Gleixner 
2280529b6fbcSAlexey Bayduraev 	rd->mmap_size = MMAP_SIZE;
2281529b6fbcSAlexey Bayduraev 	if (rd->mmap_size > data_size) {
2282529b6fbcSAlexey Bayduraev 		rd->mmap_size = data_size;
228359650630SAlexey Bayduraev 		if (one_mmap)
228459650630SAlexey Bayduraev 			*one_mmap = true;
2285919d86d3SAdrian Hunter 	}
228655b44629SThomas Gleixner 
2287529b6fbcSAlexey Bayduraev 	memset(mmaps, 0, sizeof(rd->mmaps));
2288fe174207SThomas Gleixner 
22893a3535e6SAlexey Bayduraev 	if (zstd_init(&rd->zstd_data, 0))
22903a3535e6SAlexey Bayduraev 		return -1;
22913a3535e6SAlexey Bayduraev 	rd->decomp_data.zstd_decomp = &rd->zstd_data;
229259650630SAlexey Bayduraev 
229359650630SAlexey Bayduraev 	return 0;
229459650630SAlexey Bayduraev }
229559650630SAlexey Bayduraev 
229659650630SAlexey Bayduraev static void
reader__release_decomp(struct reader * rd)229759650630SAlexey Bayduraev reader__release_decomp(struct reader *rd)
229859650630SAlexey Bayduraev {
229959650630SAlexey Bayduraev 	perf_decomp__release_events(rd->decomp_data.decomp);
230059650630SAlexey Bayduraev 	zstd_fini(&rd->zstd_data);
230159650630SAlexey Bayduraev }
230259650630SAlexey Bayduraev 
230359650630SAlexey Bayduraev static int
reader__mmap(struct reader * rd,struct perf_session * session)230406763e7bSAlexey Bayduraev reader__mmap(struct reader *rd, struct perf_session *session)
230559650630SAlexey Bayduraev {
230606763e7bSAlexey Bayduraev 	int mmap_prot, mmap_flags;
230759650630SAlexey Bayduraev 	char *buf, **mmaps = rd->mmaps;
2308de096489SAlexey Bayduraev 	u64 page_offset;
23093a3535e6SAlexey Bayduraev 
2310ba21594cSArnaldo Carvalho de Melo 	mmap_prot  = PROT_READ;
2311ba21594cSArnaldo Carvalho de Melo 	mmap_flags = MAP_SHARED;
2312ba21594cSArnaldo Carvalho de Melo 
23132a525f6aSAdrian Hunter 	if (rd->in_place_update) {
23142a525f6aSAdrian Hunter 		mmap_prot  |= PROT_WRITE;
23152a525f6aSAdrian Hunter 	} else if (session->header.needs_swap) {
2316ba21594cSArnaldo Carvalho de Melo 		mmap_prot  |= PROT_WRITE;
2317ba21594cSArnaldo Carvalho de Melo 		mmap_flags = MAP_PRIVATE;
2318ba21594cSArnaldo Carvalho de Melo 	}
231906763e7bSAlexey Bayduraev 
2320de096489SAlexey Bayduraev 	if (mmaps[rd->mmap_idx]) {
2321de096489SAlexey Bayduraev 		munmap(mmaps[rd->mmap_idx], rd->mmap_size);
2322de096489SAlexey Bayduraev 		mmaps[rd->mmap_idx] = NULL;
2323de096489SAlexey Bayduraev 	}
2324de096489SAlexey Bayduraev 
2325de096489SAlexey Bayduraev 	page_offset = page_size * (rd->head / page_size);
2326de096489SAlexey Bayduraev 	rd->file_offset += page_offset;
2327de096489SAlexey Bayduraev 	rd->head -= page_offset;
2328de096489SAlexey Bayduraev 
2329529b6fbcSAlexey Bayduraev 	buf = mmap(NULL, rd->mmap_size, mmap_prot, mmap_flags, rd->fd,
2330529b6fbcSAlexey Bayduraev 		   rd->file_offset);
233106aae590SArnaldo Carvalho de Melo 	if (buf == MAP_FAILED) {
233206aae590SArnaldo Carvalho de Melo 		pr_err("failed to mmap file\n");
233306763e7bSAlexey Bayduraev 		return -errno;
233406aae590SArnaldo Carvalho de Melo 	}
2335529b6fbcSAlexey Bayduraev 	mmaps[rd->mmap_idx] = rd->mmap_cur = buf;
2336529b6fbcSAlexey Bayduraev 	rd->mmap_idx = (rd->mmap_idx + 1) & (ARRAY_SIZE(rd->mmaps) - 1);
2337529b6fbcSAlexey Bayduraev 	rd->file_pos = rd->file_offset + rd->head;
2338919d86d3SAdrian Hunter 	if (session->one_mmap) {
2339919d86d3SAdrian Hunter 		session->one_mmap_addr = buf;
2340529b6fbcSAlexey Bayduraev 		session->one_mmap_offset = rd->file_offset;
2341919d86d3SAdrian Hunter 	}
234206aae590SArnaldo Carvalho de Melo 
234306763e7bSAlexey Bayduraev 	return 0;
234406763e7bSAlexey Bayduraev }
234506763e7bSAlexey Bayduraev 
23464c002886SAlexey Bayduraev enum {
23474c002886SAlexey Bayduraev 	READER_OK,
23484c002886SAlexey Bayduraev 	READER_NODATA,
23494c002886SAlexey Bayduraev };
23504c002886SAlexey Bayduraev 
235106763e7bSAlexey Bayduraev static int
reader__read_event(struct reader * rd,struct perf_session * session,struct ui_progress * prog)23525c10dc92SAlexey Bayduraev reader__read_event(struct reader *rd, struct perf_session *session,
235306763e7bSAlexey Bayduraev 		   struct ui_progress *prog)
235406763e7bSAlexey Bayduraev {
2355de096489SAlexey Bayduraev 	u64 size;
23564c002886SAlexey Bayduraev 	int err = READER_OK;
235706763e7bSAlexey Bayduraev 	union perf_event *event;
235806763e7bSAlexey Bayduraev 	s64 skip;
235906763e7bSAlexey Bayduraev 
2360529b6fbcSAlexey Bayduraev 	event = fetch_mmaped_event(rd->head, rd->mmap_size, rd->mmap_cur,
2361529b6fbcSAlexey Bayduraev 				   session->header.needs_swap);
236257fc032aSArnaldo Carvalho de Melo 	if (IS_ERR(event))
236357fc032aSArnaldo Carvalho de Melo 		return PTR_ERR(event);
236457fc032aSArnaldo Carvalho de Melo 
2365de096489SAlexey Bayduraev 	if (!event)
23664c002886SAlexey Bayduraev 		return READER_NODATA;
236706aae590SArnaldo Carvalho de Melo 
236806aae590SArnaldo Carvalho de Melo 	size = event->header.size;
236906aae590SArnaldo Carvalho de Melo 
2370167e418fSThomas Richter 	skip = -EINVAL;
2371167e418fSThomas Richter 
237227389d78SAdrian Hunter 	if (size < sizeof(struct perf_event_header) ||
23732292083fSAlexey Bayduraev 	    (skip = rd->process(session, event, rd->file_pos, rd->path)) < 0) {
2374167e418fSThomas Richter 		pr_err("%#" PRIx64 " [%#x]: failed to process type: %d [%s]\n",
2375529b6fbcSAlexey Bayduraev 		       rd->file_offset + rd->head, event->header.size,
2376167e418fSThomas Richter 		       event->header.type, strerror(-skip));
2377167e418fSThomas Richter 		err = skip;
23783c7b67b2SJiri Olsa 		goto out;
237906aae590SArnaldo Carvalho de Melo 	}
238006aae590SArnaldo Carvalho de Melo 
23816f917c70SAdrian Hunter 	if (skip)
23826f917c70SAdrian Hunter 		size += skip;
23836f917c70SAdrian Hunter 
2384bb6be405SAlexey Bayduraev 	rd->size += size;
2385529b6fbcSAlexey Bayduraev 	rd->head += size;
2386529b6fbcSAlexey Bayduraev 	rd->file_pos += size;
238706aae590SArnaldo Carvalho de Melo 
2388cb62c6f1SAlexey Budankov 	err = __perf_session__process_decomp_events(session);
2389cb62c6f1SAlexey Budankov 	if (err)
2390cb62c6f1SAlexey Budankov 		goto out;
2391cb62c6f1SAlexey Budankov 
23923c7b67b2SJiri Olsa 	ui_progress__update(prog, size);
239355b44629SThomas Gleixner 
23945c10dc92SAlexey Bayduraev out:
23955c10dc92SAlexey Bayduraev 	return err;
23965c10dc92SAlexey Bayduraev }
23975c10dc92SAlexey Bayduraev 
239825900ea8SAlexey Bayduraev static inline bool
reader__eof(struct reader * rd)239925900ea8SAlexey Bayduraev reader__eof(struct reader *rd)
240025900ea8SAlexey Bayduraev {
240125900ea8SAlexey Bayduraev 	return (rd->file_pos >= rd->data_size + rd->data_offset);
240225900ea8SAlexey Bayduraev }
240325900ea8SAlexey Bayduraev 
24045c10dc92SAlexey Bayduraev static int
reader__process_events(struct reader * rd,struct perf_session * session,struct ui_progress * prog)24055c10dc92SAlexey Bayduraev reader__process_events(struct reader *rd, struct perf_session *session,
24065c10dc92SAlexey Bayduraev 		       struct ui_progress *prog)
24075c10dc92SAlexey Bayduraev {
24085c10dc92SAlexey Bayduraev 	int err;
24095c10dc92SAlexey Bayduraev 
24105c10dc92SAlexey Bayduraev 	err = reader__init(rd, &session->one_mmap);
24115c10dc92SAlexey Bayduraev 	if (err)
24125c10dc92SAlexey Bayduraev 		goto out;
24135c10dc92SAlexey Bayduraev 
24145c10dc92SAlexey Bayduraev 	session->active_decomp = &rd->decomp_data;
24155c10dc92SAlexey Bayduraev 
24165c10dc92SAlexey Bayduraev remap:
24175c10dc92SAlexey Bayduraev 	err = reader__mmap(rd, session);
24185c10dc92SAlexey Bayduraev 	if (err)
24195c10dc92SAlexey Bayduraev 		goto out;
24205c10dc92SAlexey Bayduraev 
24215c10dc92SAlexey Bayduraev more:
24225c10dc92SAlexey Bayduraev 	err = reader__read_event(rd, session, prog);
24235c10dc92SAlexey Bayduraev 	if (err < 0)
24245c10dc92SAlexey Bayduraev 		goto out;
24254c002886SAlexey Bayduraev 	else if (err == READER_NODATA)
24265c10dc92SAlexey Bayduraev 		goto remap;
24275c10dc92SAlexey Bayduraev 
242833e940a2SArnaldo Carvalho de Melo 	if (session_done())
24298c16b649SAdrian Hunter 		goto out;
243033e940a2SArnaldo Carvalho de Melo 
243125900ea8SAlexey Bayduraev 	if (!reader__eof(rd))
243206aae590SArnaldo Carvalho de Melo 		goto more;
2433d6513281SThomas Gleixner 
24348c16b649SAdrian Hunter out:
24353a3535e6SAlexey Bayduraev 	session->active_decomp = &session->decomp_data;
24363c7b67b2SJiri Olsa 	return err;
24373c7b67b2SJiri Olsa }
24383c7b67b2SJiri Olsa 
process_simple(struct perf_session * session,union perf_event * event,u64 file_offset,const char * file_path)2439e51f8061SJiri Olsa static s64 process_simple(struct perf_session *session,
2440e51f8061SJiri Olsa 			  union perf_event *event,
24412292083fSAlexey Bayduraev 			  u64 file_offset,
24422292083fSAlexey Bayduraev 			  const char *file_path)
2443e51f8061SJiri Olsa {
24442292083fSAlexey Bayduraev 	return perf_session__process_event(session, event, file_offset, file_path);
2445e51f8061SJiri Olsa }
2446e51f8061SJiri Olsa 
__perf_session__process_events(struct perf_session * session)24473c7b67b2SJiri Olsa static int __perf_session__process_events(struct perf_session *session)
24483c7b67b2SJiri Olsa {
24493c7b67b2SJiri Olsa 	struct reader rd = {
24503c7b67b2SJiri Olsa 		.fd		= perf_data__fd(session->data),
24512292083fSAlexey Bayduraev 		.path		= session->data->file.path,
24523c7b67b2SJiri Olsa 		.data_size	= session->header.data_size,
24533c7b67b2SJiri Olsa 		.data_offset	= session->header.data_offset,
2454e51f8061SJiri Olsa 		.process	= process_simple,
24552a525f6aSAdrian Hunter 		.in_place_update = session->data->in_place_update,
24563c7b67b2SJiri Olsa 	};
24573c7b67b2SJiri Olsa 	struct ordered_events *oe = &session->ordered_events;
24583c7b67b2SJiri Olsa 	struct perf_tool *tool = session->tool;
24593c7b67b2SJiri Olsa 	struct ui_progress prog;
24603c7b67b2SJiri Olsa 	int err;
24613c7b67b2SJiri Olsa 
24623c7b67b2SJiri Olsa 	perf_tool__fill_defaults(tool);
24633c7b67b2SJiri Olsa 
24643c7b67b2SJiri Olsa 	if (rd.data_size == 0)
24653c7b67b2SJiri Olsa 		return -1;
24663c7b67b2SJiri Olsa 
24673c7b67b2SJiri Olsa 	ui_progress__init_size(&prog, rd.data_size, "Processing events...");
24683c7b67b2SJiri Olsa 
24693c7b67b2SJiri Olsa 	err = reader__process_events(&rd, session, &prog);
24703c7b67b2SJiri Olsa 	if (err)
24713c7b67b2SJiri Olsa 		goto out_err;
2472c61e52eeSFrederic Weisbecker 	/* do the final flush for ordered samples */
2473b7b61cbeSArnaldo Carvalho de Melo 	err = ordered_events__flush(oe, OE_FLUSH__FINAL);
2474c446870dSAdrian Hunter 	if (err)
2475c446870dSAdrian Hunter 		goto out_err;
2476c446870dSAdrian Hunter 	err = auxtrace__flush_events(session, tool);
2477a5499b37SAdrian Hunter 	if (err)
2478a5499b37SAdrian Hunter 		goto out_err;
2479a5499b37SAdrian Hunter 	err = perf_session__flush_thread_stacks(session);
248006aae590SArnaldo Carvalho de Melo out_err:
2481a5580f3eSNamhyung Kim 	ui_progress__finish();
2482075ca1ebSJiri Olsa 	if (!tool->no_warn)
24839870d780SArnaldo Carvalho de Melo 		perf_session__warn_about_errors(session);
2484b26dc730SWang Nan 	/*
2485b26dc730SWang Nan 	 * We may switching perf.data output, make ordered_events
2486b26dc730SWang Nan 	 * reusable.
2487b26dc730SWang Nan 	 */
2488b26dc730SWang Nan 	ordered_events__reinit(&session->ordered_events);
2489c446870dSAdrian Hunter 	auxtrace__free_events(session);
249059650630SAlexey Bayduraev 	reader__release_decomp(&rd);
2491919d86d3SAdrian Hunter 	session->one_mmap = false;
249206aae590SArnaldo Carvalho de Melo 	return err;
249306aae590SArnaldo Carvalho de Melo }
249427295592SArnaldo Carvalho de Melo 
2495bb6be405SAlexey Bayduraev /*
2496bb6be405SAlexey Bayduraev  * Processing 2 MB of data from each reader in sequence,
2497bb6be405SAlexey Bayduraev  * because that's the way the ordered events sorting works
2498bb6be405SAlexey Bayduraev  * most efficiently.
2499bb6be405SAlexey Bayduraev  */
2500bb6be405SAlexey Bayduraev #define READER_MAX_SIZE (2 * 1024 * 1024)
2501bb6be405SAlexey Bayduraev 
2502bb6be405SAlexey Bayduraev /*
2503bb6be405SAlexey Bayduraev  * This function reads, merge and process directory data.
2504bb6be405SAlexey Bayduraev  * It assumens the version 1 of directory data, where each
2505bb6be405SAlexey Bayduraev  * data file holds per-cpu data, already sorted by kernel.
2506bb6be405SAlexey Bayduraev  */
__perf_session__process_dir_events(struct perf_session * session)2507bb6be405SAlexey Bayduraev static int __perf_session__process_dir_events(struct perf_session *session)
2508bb6be405SAlexey Bayduraev {
2509bb6be405SAlexey Bayduraev 	struct perf_data *data = session->data;
2510bb6be405SAlexey Bayduraev 	struct perf_tool *tool = session->tool;
2511bb6be405SAlexey Bayduraev 	int i, ret, readers, nr_readers;
2512bb6be405SAlexey Bayduraev 	struct ui_progress prog;
2513bb6be405SAlexey Bayduraev 	u64 total_size = perf_data__size(session->data);
2514bb6be405SAlexey Bayduraev 	struct reader *rd;
2515bb6be405SAlexey Bayduraev 
2516bb6be405SAlexey Bayduraev 	perf_tool__fill_defaults(tool);
2517bb6be405SAlexey Bayduraev 
2518bb6be405SAlexey Bayduraev 	ui_progress__init_size(&prog, total_size, "Sorting events...");
2519bb6be405SAlexey Bayduraev 
2520bb6be405SAlexey Bayduraev 	nr_readers = 1;
2521bb6be405SAlexey Bayduraev 	for (i = 0; i < data->dir.nr; i++) {
2522bb6be405SAlexey Bayduraev 		if (data->dir.files[i].size)
2523bb6be405SAlexey Bayduraev 			nr_readers++;
2524bb6be405SAlexey Bayduraev 	}
2525bb6be405SAlexey Bayduraev 
2526bb6be405SAlexey Bayduraev 	rd = zalloc(nr_readers * sizeof(struct reader));
2527bb6be405SAlexey Bayduraev 	if (!rd)
2528bb6be405SAlexey Bayduraev 		return -ENOMEM;
2529bb6be405SAlexey Bayduraev 
2530bb6be405SAlexey Bayduraev 	rd[0] = (struct reader) {
2531bb6be405SAlexey Bayduraev 		.fd		 = perf_data__fd(session->data),
25322292083fSAlexey Bayduraev 		.path		 = session->data->file.path,
2533bb6be405SAlexey Bayduraev 		.data_size	 = session->header.data_size,
2534bb6be405SAlexey Bayduraev 		.data_offset	 = session->header.data_offset,
2535bb6be405SAlexey Bayduraev 		.process	 = process_simple,
2536bb6be405SAlexey Bayduraev 		.in_place_update = session->data->in_place_update,
2537bb6be405SAlexey Bayduraev 	};
2538bb6be405SAlexey Bayduraev 	ret = reader__init(&rd[0], NULL);
2539bb6be405SAlexey Bayduraev 	if (ret)
2540bb6be405SAlexey Bayduraev 		goto out_err;
2541bb6be405SAlexey Bayduraev 	ret = reader__mmap(&rd[0], session);
2542bb6be405SAlexey Bayduraev 	if (ret)
2543bb6be405SAlexey Bayduraev 		goto out_err;
2544bb6be405SAlexey Bayduraev 	readers = 1;
2545bb6be405SAlexey Bayduraev 
2546bb6be405SAlexey Bayduraev 	for (i = 0; i < data->dir.nr; i++) {
2547bb6be405SAlexey Bayduraev 		if (!data->dir.files[i].size)
2548bb6be405SAlexey Bayduraev 			continue;
2549bb6be405SAlexey Bayduraev 		rd[readers] = (struct reader) {
2550bb6be405SAlexey Bayduraev 			.fd		 = data->dir.files[i].fd,
25512292083fSAlexey Bayduraev 			.path		 = data->dir.files[i].path,
2552bb6be405SAlexey Bayduraev 			.data_size	 = data->dir.files[i].size,
2553bb6be405SAlexey Bayduraev 			.data_offset	 = 0,
2554bb6be405SAlexey Bayduraev 			.process	 = process_simple,
2555bb6be405SAlexey Bayduraev 			.in_place_update = session->data->in_place_update,
2556bb6be405SAlexey Bayduraev 		};
2557bb6be405SAlexey Bayduraev 		ret = reader__init(&rd[readers], NULL);
2558bb6be405SAlexey Bayduraev 		if (ret)
2559bb6be405SAlexey Bayduraev 			goto out_err;
2560bb6be405SAlexey Bayduraev 		ret = reader__mmap(&rd[readers], session);
2561bb6be405SAlexey Bayduraev 		if (ret)
2562bb6be405SAlexey Bayduraev 			goto out_err;
2563bb6be405SAlexey Bayduraev 		readers++;
2564bb6be405SAlexey Bayduraev 	}
2565bb6be405SAlexey Bayduraev 
2566bb6be405SAlexey Bayduraev 	i = 0;
2567bb6be405SAlexey Bayduraev 	while (readers) {
2568bb6be405SAlexey Bayduraev 		if (session_done())
2569bb6be405SAlexey Bayduraev 			break;
2570bb6be405SAlexey Bayduraev 
2571bb6be405SAlexey Bayduraev 		if (rd[i].done) {
2572bb6be405SAlexey Bayduraev 			i = (i + 1) % nr_readers;
2573bb6be405SAlexey Bayduraev 			continue;
2574bb6be405SAlexey Bayduraev 		}
2575bb6be405SAlexey Bayduraev 		if (reader__eof(&rd[i])) {
2576bb6be405SAlexey Bayduraev 			rd[i].done = true;
2577bb6be405SAlexey Bayduraev 			readers--;
2578bb6be405SAlexey Bayduraev 			continue;
2579bb6be405SAlexey Bayduraev 		}
2580bb6be405SAlexey Bayduraev 
2581bb6be405SAlexey Bayduraev 		session->active_decomp = &rd[i].decomp_data;
2582bb6be405SAlexey Bayduraev 		ret = reader__read_event(&rd[i], session, &prog);
2583bb6be405SAlexey Bayduraev 		if (ret < 0) {
2584bb6be405SAlexey Bayduraev 			goto out_err;
2585bb6be405SAlexey Bayduraev 		} else if (ret == READER_NODATA) {
2586bb6be405SAlexey Bayduraev 			ret = reader__mmap(&rd[i], session);
2587bb6be405SAlexey Bayduraev 			if (ret)
2588bb6be405SAlexey Bayduraev 				goto out_err;
2589bb6be405SAlexey Bayduraev 		}
2590bb6be405SAlexey Bayduraev 
2591bb6be405SAlexey Bayduraev 		if (rd[i].size >= READER_MAX_SIZE) {
2592bb6be405SAlexey Bayduraev 			rd[i].size = 0;
2593bb6be405SAlexey Bayduraev 			i = (i + 1) % nr_readers;
2594bb6be405SAlexey Bayduraev 		}
2595bb6be405SAlexey Bayduraev 	}
2596bb6be405SAlexey Bayduraev 
2597bb6be405SAlexey Bayduraev 	ret = ordered_events__flush(&session->ordered_events, OE_FLUSH__FINAL);
2598bb6be405SAlexey Bayduraev 	if (ret)
2599bb6be405SAlexey Bayduraev 		goto out_err;
2600bb6be405SAlexey Bayduraev 
2601bb6be405SAlexey Bayduraev 	ret = perf_session__flush_thread_stacks(session);
2602bb6be405SAlexey Bayduraev out_err:
2603bb6be405SAlexey Bayduraev 	ui_progress__finish();
2604bb6be405SAlexey Bayduraev 
2605bb6be405SAlexey Bayduraev 	if (!tool->no_warn)
2606bb6be405SAlexey Bayduraev 		perf_session__warn_about_errors(session);
2607bb6be405SAlexey Bayduraev 
2608bb6be405SAlexey Bayduraev 	/*
2609bb6be405SAlexey Bayduraev 	 * We may switching perf.data output, make ordered_events
2610bb6be405SAlexey Bayduraev 	 * reusable.
2611bb6be405SAlexey Bayduraev 	 */
2612bb6be405SAlexey Bayduraev 	ordered_events__reinit(&session->ordered_events);
2613bb6be405SAlexey Bayduraev 
2614bb6be405SAlexey Bayduraev 	session->one_mmap = false;
2615bb6be405SAlexey Bayduraev 
2616bb6be405SAlexey Bayduraev 	session->active_decomp = &session->decomp_data;
2617bb6be405SAlexey Bayduraev 	for (i = 0; i < nr_readers; i++)
2618bb6be405SAlexey Bayduraev 		reader__release_decomp(&rd[i]);
2619bb6be405SAlexey Bayduraev 	zfree(&rd);
2620bb6be405SAlexey Bayduraev 
2621bb6be405SAlexey Bayduraev 	return ret;
2622bb6be405SAlexey Bayduraev }
2623bb6be405SAlexey Bayduraev 
perf_session__process_events(struct perf_session * session)2624b7b61cbeSArnaldo Carvalho de Melo int perf_session__process_events(struct perf_session *session)
26256122e4e4SArnaldo Carvalho de Melo {
26269d8b172fSMasami Hiramatsu 	if (perf_session__register_idle_thread(session) < 0)
26276122e4e4SArnaldo Carvalho de Melo 		return -ENOMEM;
26286122e4e4SArnaldo Carvalho de Melo 
26297ba4da10SJiri Olsa 	if (perf_data__is_pipe(session->data))
26307ba4da10SJiri Olsa 		return __perf_session__process_pipe_events(session);
263188ca895dSDave Martin 
2632de8fd138SAdrian Hunter 	if (perf_data__is_dir(session->data) && session->data->dir.nr)
2633bb6be405SAlexey Bayduraev 		return __perf_session__process_dir_events(session);
2634bb6be405SAlexey Bayduraev 
26357ba4da10SJiri Olsa 	return __perf_session__process_events(session);
26366122e4e4SArnaldo Carvalho de Melo }
26376122e4e4SArnaldo Carvalho de Melo 
perf_session__has_traces(struct perf_session * session,const char * msg)26387f3be652SArnaldo Carvalho de Melo bool perf_session__has_traces(struct perf_session *session, const char *msg)
263927295592SArnaldo Carvalho de Melo {
264032dcd021SJiri Olsa 	struct evsel *evsel;
264193ea01c2SDavid Ahern 
2642e5cadb93SArnaldo Carvalho de Melo 	evlist__for_each_entry(session->evlist, evsel) {
26431fc632ceSJiri Olsa 		if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT)
264493ea01c2SDavid Ahern 			return true;
264527295592SArnaldo Carvalho de Melo 	}
264627295592SArnaldo Carvalho de Melo 
264793ea01c2SDavid Ahern 	pr_err("No trace sample to read. Did you call 'perf %s'?\n", msg);
264893ea01c2SDavid Ahern 	return false;
264927295592SArnaldo Carvalho de Melo }
265056b03f3cSArnaldo Carvalho de Melo 
map__set_kallsyms_ref_reloc_sym(struct map * map,const char * symbol_name,u64 addr)26513183f8caSArnaldo Carvalho de Melo int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name, u64 addr)
265256b03f3cSArnaldo Carvalho de Melo {
265356b03f3cSArnaldo Carvalho de Melo 	char *bracket;
2654a1645ce1SZhang, Yanmin 	struct ref_reloc_sym *ref;
26553183f8caSArnaldo Carvalho de Melo 	struct kmap *kmap;
265656b03f3cSArnaldo Carvalho de Melo 
2657a1645ce1SZhang, Yanmin 	ref = zalloc(sizeof(struct ref_reloc_sym));
2658a1645ce1SZhang, Yanmin 	if (ref == NULL)
265956b03f3cSArnaldo Carvalho de Melo 		return -ENOMEM;
266056b03f3cSArnaldo Carvalho de Melo 
2661a1645ce1SZhang, Yanmin 	ref->name = strdup(symbol_name);
2662a1645ce1SZhang, Yanmin 	if (ref->name == NULL) {
2663a1645ce1SZhang, Yanmin 		free(ref);
2664a1645ce1SZhang, Yanmin 		return -ENOMEM;
2665a1645ce1SZhang, Yanmin 	}
2666a1645ce1SZhang, Yanmin 
2667a1645ce1SZhang, Yanmin 	bracket = strchr(ref->name, ']');
266856b03f3cSArnaldo Carvalho de Melo 	if (bracket)
266956b03f3cSArnaldo Carvalho de Melo 		*bracket = '\0';
267056b03f3cSArnaldo Carvalho de Melo 
2671a1645ce1SZhang, Yanmin 	ref->addr = addr;
26729de89fe7SArnaldo Carvalho de Melo 
26733183f8caSArnaldo Carvalho de Melo 	kmap = map__kmap(map);
26743183f8caSArnaldo Carvalho de Melo 	if (kmap)
2675a1645ce1SZhang, Yanmin 		kmap->ref_reloc_sym = ref;
26769de89fe7SArnaldo Carvalho de Melo 
267756b03f3cSArnaldo Carvalho de Melo 	return 0;
267856b03f3cSArnaldo Carvalho de Melo }
26791f626bc3SArnaldo Carvalho de Melo 
perf_session__fprintf_dsos(struct perf_session * session,FILE * fp)2680316c7136SArnaldo Carvalho de Melo size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp)
26811f626bc3SArnaldo Carvalho de Melo {
2682316c7136SArnaldo Carvalho de Melo 	return machines__fprintf_dsos(&session->machines, fp);
26831f626bc3SArnaldo Carvalho de Melo }
2684f869097eSArnaldo Carvalho de Melo 
perf_session__fprintf_dsos_buildid(struct perf_session * session,FILE * fp,bool (skip)(struct dso * dso,int parm),int parm)2685316c7136SArnaldo Carvalho de Melo size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
2686417c2ff6SArnaldo Carvalho de Melo 					  bool (skip)(struct dso *dso, int parm), int parm)
2687f869097eSArnaldo Carvalho de Melo {
2688316c7136SArnaldo Carvalho de Melo 	return machines__fprintf_dsos_buildid(&session->machines, fp, skip, parm);
2689f869097eSArnaldo Carvalho de Melo }
2690e248de33SArnaldo Carvalho de Melo 
perf_session__fprintf_nr_events(struct perf_session * session,FILE * fp,bool skip_empty)26912775de0bSNamhyung Kim size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp,
26922775de0bSNamhyung Kim 				       bool skip_empty)
2693e248de33SArnaldo Carvalho de Melo {
2694c446870dSAdrian Hunter 	size_t ret;
2695c446870dSAdrian Hunter 	const char *msg = "";
2696c446870dSAdrian Hunter 
2697c446870dSAdrian Hunter 	if (perf_header__has_feat(&session->header, HEADER_AUXTRACE))
2698c446870dSAdrian Hunter 		msg = " (excludes AUX area (e.g. instruction trace) decoded / synthesized events)";
2699c446870dSAdrian Hunter 
2700fe692ac8SAdrian Hunter 	ret = fprintf(fp, "\nAggregated stats:%s\n", msg);
2701e248de33SArnaldo Carvalho de Melo 
27022775de0bSNamhyung Kim 	ret += events_stats__fprintf(&session->evlist->stats, fp, skip_empty);
2703e248de33SArnaldo Carvalho de Melo 	return ret;
2704e248de33SArnaldo Carvalho de Melo }
2705c0230b2bSDavid Ahern 
perf_session__fprintf(struct perf_session * session,FILE * fp)2706b424eba2SArnaldo Carvalho de Melo size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
2707b424eba2SArnaldo Carvalho de Melo {
2708b424eba2SArnaldo Carvalho de Melo 	/*
2709b424eba2SArnaldo Carvalho de Melo 	 * FIXME: Here we have to actually print all the machines in this
2710b424eba2SArnaldo Carvalho de Melo 	 * session, not just the host...
2711b424eba2SArnaldo Carvalho de Melo 	 */
2712876650e6SArnaldo Carvalho de Melo 	return machine__fprintf(&session->machines.host, fp);
2713b424eba2SArnaldo Carvalho de Melo }
2714b424eba2SArnaldo Carvalho de Melo 
perf_session__find_first_evtype(struct perf_session * session,unsigned int type)271532dcd021SJiri Olsa struct evsel *perf_session__find_first_evtype(struct perf_session *session,
27169cbdb702SDavid Ahern 					      unsigned int type)
27179cbdb702SDavid Ahern {
271832dcd021SJiri Olsa 	struct evsel *pos;
27199cbdb702SDavid Ahern 
2720e5cadb93SArnaldo Carvalho de Melo 	evlist__for_each_entry(session->evlist, pos) {
27211fc632ceSJiri Olsa 		if (pos->core.attr.type == type)
27229cbdb702SDavid Ahern 			return pos;
27239cbdb702SDavid Ahern 	}
27249cbdb702SDavid Ahern 	return NULL;
27259cbdb702SDavid Ahern }
27269cbdb702SDavid Ahern 
perf_session__cpu_bitmap(struct perf_session * session,const char * cpu_list,unsigned long * cpu_bitmap)27275d67be97SAnton Blanchard int perf_session__cpu_bitmap(struct perf_session *session,
27285d67be97SAnton Blanchard 			     const char *cpu_list, unsigned long *cpu_bitmap)
27295d67be97SAnton Blanchard {
27308bac41cbSStanislav Fomichev 	int i, err = -1;
2731f854839bSJiri Olsa 	struct perf_cpu_map *map;
27325501e922SAdrian Hunter 	int nr_cpus = min(session->header.env.nr_cpus_avail, MAX_NR_CPUS);
27335d67be97SAnton Blanchard 
27345d67be97SAnton Blanchard 	for (i = 0; i < PERF_TYPE_MAX; ++i) {
273532dcd021SJiri Olsa 		struct evsel *evsel;
27365d67be97SAnton Blanchard 
27375d67be97SAnton Blanchard 		evsel = perf_session__find_first_evtype(session, i);
27385d67be97SAnton Blanchard 		if (!evsel)
27395d67be97SAnton Blanchard 			continue;
27405d67be97SAnton Blanchard 
27411fc632ceSJiri Olsa 		if (!(evsel->core.attr.sample_type & PERF_SAMPLE_CPU)) {
27425d67be97SAnton Blanchard 			pr_err("File does not contain CPU events. "
274330795467SAdrian Hunter 			       "Remove -C option to proceed.\n");
27445d67be97SAnton Blanchard 			return -1;
27455d67be97SAnton Blanchard 		}
27465d67be97SAnton Blanchard 	}
27475d67be97SAnton Blanchard 
27489c3516d1SJiri Olsa 	map = perf_cpu_map__new(cpu_list);
274947fbe53bSDavid Ahern 	if (map == NULL) {
275047fbe53bSDavid Ahern 		pr_err("Invalid cpu_list\n");
275147fbe53bSDavid Ahern 		return -1;
275247fbe53bSDavid Ahern 	}
27535d67be97SAnton Blanchard 
275444028699SIan Rogers 	for (i = 0; i < perf_cpu_map__nr(map); i++) {
275544028699SIan Rogers 		struct perf_cpu cpu = perf_cpu_map__cpu(map, i);
27565d67be97SAnton Blanchard 
27576d18804bSIan Rogers 		if (cpu.cpu >= nr_cpus) {
27585d67be97SAnton Blanchard 			pr_err("Requested CPU %d too large. "
27596d18804bSIan Rogers 			       "Consider raising MAX_NR_CPUS\n", cpu.cpu);
27608bac41cbSStanislav Fomichev 			goto out_delete_map;
27615d67be97SAnton Blanchard 		}
27625d67be97SAnton Blanchard 
276349bd97c2SSean Christopherson 		__set_bit(cpu.cpu, cpu_bitmap);
27645d67be97SAnton Blanchard 	}
27655d67be97SAnton Blanchard 
27668bac41cbSStanislav Fomichev 	err = 0;
27678bac41cbSStanislav Fomichev 
27688bac41cbSStanislav Fomichev out_delete_map:
276938f01d8dSJiri Olsa 	perf_cpu_map__put(map);
27708bac41cbSStanislav Fomichev 	return err;
27715d67be97SAnton Blanchard }
2772fbe96f29SStephane Eranian 
perf_session__fprintf_info(struct perf_session * session,FILE * fp,bool full)2773fbe96f29SStephane Eranian void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
2774fbe96f29SStephane Eranian 				bool full)
2775fbe96f29SStephane Eranian {
2776fbe96f29SStephane Eranian 	if (session == NULL || fp == NULL)
2777fbe96f29SStephane Eranian 		return;
2778fbe96f29SStephane Eranian 
2779fbe96f29SStephane Eranian 	fprintf(fp, "# ========\n");
2780fbe96f29SStephane Eranian 	perf_header__fprintf_info(session, fp, full);
2781fbe96f29SStephane Eranian 	fprintf(fp, "# ========\n#\n");
2782fbe96f29SStephane Eranian }
2783da378962SArnaldo Carvalho de Melo 
perf_session__register_guest(struct perf_session * session,pid_t machine_pid)2784ff7a78c2SAdrian Hunter static int perf_session__register_guest(struct perf_session *session, pid_t machine_pid)
2785ff7a78c2SAdrian Hunter {
2786ff7a78c2SAdrian Hunter 	struct machine *machine = machines__findnew(&session->machines, machine_pid);
2787ff7a78c2SAdrian Hunter 	struct thread *thread;
2788ff7a78c2SAdrian Hunter 
2789ff7a78c2SAdrian Hunter 	if (!machine)
2790ff7a78c2SAdrian Hunter 		return -ENOMEM;
2791ff7a78c2SAdrian Hunter 
2792ff7a78c2SAdrian Hunter 	machine->single_address_space = session->machines.host.single_address_space;
2793ff7a78c2SAdrian Hunter 
2794ff7a78c2SAdrian Hunter 	thread = machine__idle_thread(machine);
2795ff7a78c2SAdrian Hunter 	if (!thread)
2796ff7a78c2SAdrian Hunter 		return -ENOMEM;
2797ff7a78c2SAdrian Hunter 	thread__put(thread);
2798ff7a78c2SAdrian Hunter 
2799a5367ecbSAdrian Hunter 	machine->kallsyms_filename = perf_data__guest_kallsyms_name(session->data, machine_pid);
2800a5367ecbSAdrian Hunter 
2801ff7a78c2SAdrian Hunter 	return 0;
2802ff7a78c2SAdrian Hunter }
2803ff7a78c2SAdrian Hunter 
perf_session__set_guest_cpu(struct perf_session * session,pid_t pid,pid_t tid,int guest_cpu)2804797efbc5SAdrian Hunter static int perf_session__set_guest_cpu(struct perf_session *session, pid_t pid,
2805797efbc5SAdrian Hunter 				       pid_t tid, int guest_cpu)
2806797efbc5SAdrian Hunter {
2807797efbc5SAdrian Hunter 	struct machine *machine = &session->machines.host;
2808797efbc5SAdrian Hunter 	struct thread *thread = machine__findnew_thread(machine, pid, tid);
2809797efbc5SAdrian Hunter 
2810797efbc5SAdrian Hunter 	if (!thread)
2811797efbc5SAdrian Hunter 		return -ENOMEM;
2812ee84a303SIan Rogers 	thread__set_guest_cpu(thread, guest_cpu);
2813797efbc5SAdrian Hunter 	thread__put(thread);
2814797efbc5SAdrian Hunter 
2815797efbc5SAdrian Hunter 	return 0;
2816797efbc5SAdrian Hunter }
2817797efbc5SAdrian Hunter 
perf_event__process_id_index(struct perf_session * session,union perf_event * event)281889f1688aSJiri Olsa int perf_event__process_id_index(struct perf_session *session,
281989f1688aSJiri Olsa 				 union perf_event *event)
28203c659eedSAdrian Hunter {
282163503dbaSJiri Olsa 	struct evlist *evlist = session->evlist;
282272932371SJiri Olsa 	struct perf_record_id_index *ie = &event->id_index;
2823b47bb186SAdrian Hunter 	size_t sz = ie->header.size - sizeof(*ie);
28243c659eedSAdrian Hunter 	size_t i, nr, max_nr;
2825b47bb186SAdrian Hunter 	size_t e1_sz = sizeof(struct id_index_entry);
2826b47bb186SAdrian Hunter 	size_t e2_sz = sizeof(struct id_index_entry_2);
2827b47bb186SAdrian Hunter 	size_t etot_sz = e1_sz + e2_sz;
2828b47bb186SAdrian Hunter 	struct id_index_entry_2 *e2;
2829ff7a78c2SAdrian Hunter 	pid_t last_pid = 0;
28303c659eedSAdrian Hunter 
2831b47bb186SAdrian Hunter 	max_nr = sz / e1_sz;
28323c659eedSAdrian Hunter 	nr = ie->nr;
2833b47bb186SAdrian Hunter 	if (nr > max_nr) {
2834b47bb186SAdrian Hunter 		printf("Too big: nr %zu max_nr %zu\n", nr, max_nr);
28353c659eedSAdrian Hunter 		return -EINVAL;
2836b47bb186SAdrian Hunter 	}
2837b47bb186SAdrian Hunter 
2838b47bb186SAdrian Hunter 	if (sz >= nr * etot_sz) {
2839b47bb186SAdrian Hunter 		max_nr = sz / etot_sz;
2840b47bb186SAdrian Hunter 		if (nr > max_nr) {
2841b47bb186SAdrian Hunter 			printf("Too big2: nr %zu max_nr %zu\n", nr, max_nr);
2842b47bb186SAdrian Hunter 			return -EINVAL;
2843b47bb186SAdrian Hunter 		}
2844b47bb186SAdrian Hunter 		e2 = (void *)ie + sizeof(*ie) + nr * e1_sz;
2845b47bb186SAdrian Hunter 	} else {
2846b47bb186SAdrian Hunter 		e2 = NULL;
2847b47bb186SAdrian Hunter 	}
28483c659eedSAdrian Hunter 
28493c659eedSAdrian Hunter 	if (dump_trace)
28503c659eedSAdrian Hunter 		fprintf(stdout, " nr: %zu\n", nr);
28513c659eedSAdrian Hunter 
2852b47bb186SAdrian Hunter 	for (i = 0; i < nr; i++, (e2 ? e2++ : 0)) {
28533c659eedSAdrian Hunter 		struct id_index_entry *e = &ie->entries[i];
28543c659eedSAdrian Hunter 		struct perf_sample_id *sid;
2855ff7a78c2SAdrian Hunter 		int ret;
28563c659eedSAdrian Hunter 
28573c659eedSAdrian Hunter 		if (dump_trace) {
2858fecb4100SJiri Olsa 			fprintf(stdout,	" ... id: %"PRI_lu64, e->id);
2859fecb4100SJiri Olsa 			fprintf(stdout,	"  idx: %"PRI_lu64, e->idx);
2860fecb4100SJiri Olsa 			fprintf(stdout,	"  cpu: %"PRI_ld64, e->cpu);
2861b47bb186SAdrian Hunter 			fprintf(stdout, "  tid: %"PRI_ld64, e->tid);
2862b47bb186SAdrian Hunter 			if (e2) {
2863b47bb186SAdrian Hunter 				fprintf(stdout, "  machine_pid: %"PRI_ld64, e2->machine_pid);
2864b47bb186SAdrian Hunter 				fprintf(stdout, "  vcpu: %"PRI_lu64"\n", e2->vcpu);
2865b47bb186SAdrian Hunter 			} else {
2866b47bb186SAdrian Hunter 				fprintf(stdout, "\n");
2867b47bb186SAdrian Hunter 			}
28683c659eedSAdrian Hunter 		}
28693c659eedSAdrian Hunter 
28703ccf8a7bSArnaldo Carvalho de Melo 		sid = evlist__id2sid(evlist, e->id);
28713c659eedSAdrian Hunter 		if (!sid)
28723c659eedSAdrian Hunter 			return -ENOENT;
2873b47bb186SAdrian Hunter 
28743c659eedSAdrian Hunter 		sid->idx = e->idx;
28756d18804bSIan Rogers 		sid->cpu.cpu = e->cpu;
28763c659eedSAdrian Hunter 		sid->tid = e->tid;
2877b47bb186SAdrian Hunter 
2878b47bb186SAdrian Hunter 		if (!e2)
2879b47bb186SAdrian Hunter 			continue;
2880b47bb186SAdrian Hunter 
2881b47bb186SAdrian Hunter 		sid->machine_pid = e2->machine_pid;
2882b47bb186SAdrian Hunter 		sid->vcpu.cpu = e2->vcpu;
2883ff7a78c2SAdrian Hunter 
2884ff7a78c2SAdrian Hunter 		if (!sid->machine_pid)
2885ff7a78c2SAdrian Hunter 			continue;
2886ff7a78c2SAdrian Hunter 
2887ff7a78c2SAdrian Hunter 		if (sid->machine_pid != last_pid) {
2888ff7a78c2SAdrian Hunter 			ret = perf_session__register_guest(session, sid->machine_pid);
2889ff7a78c2SAdrian Hunter 			if (ret)
2890ff7a78c2SAdrian Hunter 				return ret;
2891ff7a78c2SAdrian Hunter 			last_pid = sid->machine_pid;
2892ff7a78c2SAdrian Hunter 			perf_guest = true;
2893ff7a78c2SAdrian Hunter 		}
2894797efbc5SAdrian Hunter 
2895797efbc5SAdrian Hunter 		ret = perf_session__set_guest_cpu(session, sid->machine_pid, e->tid, e2->vcpu);
2896797efbc5SAdrian Hunter 		if (ret)
2897797efbc5SAdrian Hunter 			return ret;
28983c659eedSAdrian Hunter 	}
28993c659eedSAdrian Hunter 	return 0;
29003c659eedSAdrian Hunter }
2901