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, ×tamp);
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