15a8e0ff9SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2538bafb5SSteven Rostedt /*
3538bafb5SSteven Rostedt  * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
4538bafb5SSteven Rostedt  */
5538bafb5SSteven Rostedt #include <dirent.h>
6538bafb5SSteven Rostedt #include <stdio.h>
7538bafb5SSteven Rostedt #include <stdlib.h>
8538bafb5SSteven Rostedt #include <string.h>
9538bafb5SSteven Rostedt #include <stdarg.h>
10538bafb5SSteven Rostedt #include <sys/types.h>
11538bafb5SSteven Rostedt #include <sys/stat.h>
12538bafb5SSteven Rostedt #include <sys/wait.h>
13538bafb5SSteven Rostedt #include <sys/mman.h>
14*378ef0f5SIan Rogers #include <traceevent/event-parse.h>
15538bafb5SSteven Rostedt #include <fcntl.h>
16538bafb5SSteven Rostedt #include <unistd.h>
17538bafb5SSteven Rostedt #include <errno.h>
18538bafb5SSteven Rostedt 
19538bafb5SSteven Rostedt #include "trace-event.h"
2084f5d36fSJiri Olsa #include "debug.h"
215b7a29fbSIan Rogers #include "util.h"
22538bafb5SSteven Rostedt 
23538bafb5SSteven Rostedt static int input_fd;
24538bafb5SSteven Rostedt 
25ebf3c675SNamhyung Kim static ssize_t trace_data_size;
26454c407eSTom Zanussi static bool repipe;
279215545eSTom Zanussi 
__do_read(int fd,void * buf,int size)284a31e565SNamhyung Kim static int __do_read(int fd, void *buf, int size)
299215545eSTom Zanussi {
309215545eSTom Zanussi 	int rsize = size;
319215545eSTom Zanussi 
329215545eSTom Zanussi 	while (size) {
339215545eSTom Zanussi 		int ret = read(fd, buf, size);
349215545eSTom Zanussi 
359215545eSTom Zanussi 		if (ret <= 0)
369215545eSTom Zanussi 			return -1;
379215545eSTom Zanussi 
38454c407eSTom Zanussi 		if (repipe) {
39454c407eSTom Zanussi 			int retw = write(STDOUT_FILENO, buf, ret);
40454c407eSTom Zanussi 
414a31e565SNamhyung Kim 			if (retw <= 0 || retw != ret) {
424a31e565SNamhyung Kim 				pr_debug("repiping input file");
434a31e565SNamhyung Kim 				return -1;
444a31e565SNamhyung Kim 			}
45454c407eSTom Zanussi 		}
46454c407eSTom Zanussi 
479215545eSTom Zanussi 		size -= ret;
489215545eSTom Zanussi 		buf += ret;
499215545eSTom Zanussi 	}
509215545eSTom Zanussi 
519215545eSTom Zanussi 	return rsize;
529215545eSTom Zanussi }
539215545eSTom Zanussi 
do_read(void * data,int size)544a31e565SNamhyung Kim static int do_read(void *data, int size)
55538bafb5SSteven Rostedt {
56538bafb5SSteven Rostedt 	int r;
57538bafb5SSteven Rostedt 
584a31e565SNamhyung Kim 	r = __do_read(input_fd, data, size);
594a31e565SNamhyung Kim 	if (r <= 0) {
604a31e565SNamhyung Kim 		pr_debug("reading input file (size expected=%d received=%d)",
61538bafb5SSteven Rostedt 			 size, r);
624a31e565SNamhyung Kim 		return -1;
634a31e565SNamhyung Kim 	}
649215545eSTom Zanussi 
65ebf3c675SNamhyung Kim 	trace_data_size += r;
669215545eSTom Zanussi 
67538bafb5SSteven Rostedt 	return r;
68538bafb5SSteven Rostedt }
69538bafb5SSteven Rostedt 
70cbb5cf7fSTom Zanussi /* If it fails, the next read will report it */
skip(int size)71cbb5cf7fSTom Zanussi static void skip(int size)
72cbb5cf7fSTom Zanussi {
73cbb5cf7fSTom Zanussi 	char buf[BUFSIZ];
74cbb5cf7fSTom Zanussi 	int r;
75cbb5cf7fSTom Zanussi 
76cbb5cf7fSTom Zanussi 	while (size) {
77cbb5cf7fSTom Zanussi 		r = size > BUFSIZ ? BUFSIZ : size;
784a31e565SNamhyung Kim 		do_read(buf, r);
79cbb5cf7fSTom Zanussi 		size -= r;
808284bbeaSZou Wei 	}
81cbb5cf7fSTom Zanussi }
82cbb5cf7fSTom Zanussi 
read4(struct tep_handle * pevent)83096177a8STzvetomir Stoyanov (VMware) static unsigned int read4(struct tep_handle *pevent)
84538bafb5SSteven Rostedt {
85538bafb5SSteven Rostedt 	unsigned int data;
86538bafb5SSteven Rostedt 
874a31e565SNamhyung Kim 	if (do_read(&data, 4) < 0)
884a31e565SNamhyung Kim 		return 0;
89f0bba09cSTzvetomir Stoyanov 	return tep_read_number(pevent, &data, 4);
90538bafb5SSteven Rostedt }
91538bafb5SSteven Rostedt 
read8(struct tep_handle * pevent)92096177a8STzvetomir Stoyanov (VMware) static unsigned long long read8(struct tep_handle *pevent)
93538bafb5SSteven Rostedt {
94538bafb5SSteven Rostedt 	unsigned long long data;
95538bafb5SSteven Rostedt 
964a31e565SNamhyung Kim 	if (do_read(&data, 8) < 0)
974a31e565SNamhyung Kim 		return 0;
98f0bba09cSTzvetomir Stoyanov 	return tep_read_number(pevent, &data, 8);
99538bafb5SSteven Rostedt }
100538bafb5SSteven Rostedt 
read_string(void)101538bafb5SSteven Rostedt static char *read_string(void)
102538bafb5SSteven Rostedt {
103538bafb5SSteven Rostedt 	char buf[BUFSIZ];
104538bafb5SSteven Rostedt 	char *str = NULL;
105538bafb5SSteven Rostedt 	int size = 0;
106f887f301SXiao Guangrong 	off_t r;
1079215545eSTom Zanussi 	char c;
108538bafb5SSteven Rostedt 
109538bafb5SSteven Rostedt 	for (;;) {
1109215545eSTom Zanussi 		r = read(input_fd, &c, 1);
111452958fdSNamhyung Kim 		if (r < 0) {
112452958fdSNamhyung Kim 			pr_debug("reading input file");
113452958fdSNamhyung Kim 			goto out;
114452958fdSNamhyung Kim 		}
115538bafb5SSteven Rostedt 
116452958fdSNamhyung Kim 		if (!r) {
117452958fdSNamhyung Kim 			pr_debug("no data");
118452958fdSNamhyung Kim 			goto out;
119452958fdSNamhyung Kim 		}
120538bafb5SSteven Rostedt 
121454c407eSTom Zanussi 		if (repipe) {
122454c407eSTom Zanussi 			int retw = write(STDOUT_FILENO, &c, 1);
123454c407eSTom Zanussi 
124452958fdSNamhyung Kim 			if (retw <= 0 || retw != r) {
125452958fdSNamhyung Kim 				pr_debug("repiping input file string");
126452958fdSNamhyung Kim 				goto out;
127452958fdSNamhyung Kim 			}
128454c407eSTom Zanussi 		}
129454c407eSTom Zanussi 
1309215545eSTom Zanussi 		buf[size++] = c;
1319215545eSTom Zanussi 
1329215545eSTom Zanussi 		if (!c)
133538bafb5SSteven Rostedt 			break;
134538bafb5SSteven Rostedt 	}
135538bafb5SSteven Rostedt 
136ebf3c675SNamhyung Kim 	trace_data_size += size;
1379215545eSTom Zanussi 
138a4c98367SNamhyung Kim 	str = malloc(size);
139a4c98367SNamhyung Kim 	if (str)
140538bafb5SSteven Rostedt 		memcpy(str, buf, size);
141452958fdSNamhyung Kim out:
142538bafb5SSteven Rostedt 	return str;
143538bafb5SSteven Rostedt }
144538bafb5SSteven Rostedt 
read_proc_kallsyms(struct tep_handle * pevent)145096177a8STzvetomir Stoyanov (VMware) static int read_proc_kallsyms(struct tep_handle *pevent)
146538bafb5SSteven Rostedt {
147538bafb5SSteven Rostedt 	unsigned int size;
148538bafb5SSteven Rostedt 
149da378962SArnaldo Carvalho de Melo 	size = read4(pevent);
150538bafb5SSteven Rostedt 	if (!size)
151a4c98367SNamhyung Kim 		return 0;
1524263ceceSArnaldo Carvalho de Melo 	/*
1534263ceceSArnaldo Carvalho de Melo 	 * Just skip it, now that we configure libtraceevent to use the
1544263ceceSArnaldo Carvalho de Melo 	 * tools/perf/ symbol resolver.
1554263ceceSArnaldo Carvalho de Melo 	 *
1564263ceceSArnaldo Carvalho de Melo 	 * We need to skip it so that we can continue parsing old perf.data
1574263ceceSArnaldo Carvalho de Melo 	 * files, that contains this /proc/kallsyms payload.
1584263ceceSArnaldo Carvalho de Melo 	 *
1594263ceceSArnaldo Carvalho de Melo 	 * Newer perf.data files will have just the 4-bytes zeros "kallsyms
1604263ceceSArnaldo Carvalho de Melo 	 * payload", so that older tools can continue reading it and interpret
1614263ceceSArnaldo Carvalho de Melo 	 * it as "no kallsyms payload is present".
1624263ceceSArnaldo Carvalho de Melo 	 */
1634263ceceSArnaldo Carvalho de Melo 	lseek(input_fd, size, SEEK_CUR);
1644263ceceSArnaldo Carvalho de Melo 	trace_data_size += size;
165a4c98367SNamhyung Kim 	return 0;
166538bafb5SSteven Rostedt }
167538bafb5SSteven Rostedt 
read_ftrace_printk(struct tep_handle * pevent)168096177a8STzvetomir Stoyanov (VMware) static int read_ftrace_printk(struct tep_handle *pevent)
169538bafb5SSteven Rostedt {
170538bafb5SSteven Rostedt 	unsigned int size;
171538bafb5SSteven Rostedt 	char *buf;
172538bafb5SSteven Rostedt 
1734a31e565SNamhyung Kim 	/* it can have 0 size */
174da378962SArnaldo Carvalho de Melo 	size = read4(pevent);
175538bafb5SSteven Rostedt 	if (!size)
176a4c98367SNamhyung Kim 		return 0;
177538bafb5SSteven Rostedt 
178d4b364dfSTommi Rantala 	buf = malloc(size + 1);
179a4c98367SNamhyung Kim 	if (buf == NULL)
180a4c98367SNamhyung Kim 		return -1;
181a4c98367SNamhyung Kim 
1824a31e565SNamhyung Kim 	if (do_read(buf, size) < 0) {
1834a31e565SNamhyung Kim 		free(buf);
1844a31e565SNamhyung Kim 		return -1;
1854a31e565SNamhyung Kim 	}
186538bafb5SSteven Rostedt 
187d4b364dfSTommi Rantala 	buf[size] = '\0';
188d4b364dfSTommi Rantala 
189da378962SArnaldo Carvalho de Melo 	parse_ftrace_printk(pevent, buf, size);
190538bafb5SSteven Rostedt 
191538bafb5SSteven Rostedt 	free(buf);
192a4c98367SNamhyung Kim 	return 0;
193538bafb5SSteven Rostedt }
194538bafb5SSteven Rostedt 
read_header_files(struct tep_handle * pevent)195096177a8STzvetomir Stoyanov (VMware) static int read_header_files(struct tep_handle *pevent)
196538bafb5SSteven Rostedt {
197538bafb5SSteven Rostedt 	unsigned long long size;
19894b4d89eSNamhyung Kim 	char *header_page;
199538bafb5SSteven Rostedt 	char buf[BUFSIZ];
2004a31e565SNamhyung Kim 	int ret = 0;
201538bafb5SSteven Rostedt 
2024a31e565SNamhyung Kim 	if (do_read(buf, 12) < 0)
2034a31e565SNamhyung Kim 		return -1;
204538bafb5SSteven Rostedt 
205452958fdSNamhyung Kim 	if (memcmp(buf, "header_page", 12) != 0) {
206452958fdSNamhyung Kim 		pr_debug("did not read header page");
207452958fdSNamhyung Kim 		return -1;
208452958fdSNamhyung Kim 	}
209538bafb5SSteven Rostedt 
210da378962SArnaldo Carvalho de Melo 	size = read8(pevent);
21194b4d89eSNamhyung Kim 
21294b4d89eSNamhyung Kim 	header_page = malloc(size);
21394b4d89eSNamhyung Kim 	if (header_page == NULL)
21494b4d89eSNamhyung Kim 		return -1;
21594b4d89eSNamhyung Kim 
21694b4d89eSNamhyung Kim 	if (do_read(header_page, size) < 0) {
21794b4d89eSNamhyung Kim 		pr_debug("did not read header page");
21894b4d89eSNamhyung Kim 		free(header_page);
21994b4d89eSNamhyung Kim 		return -1;
22094b4d89eSNamhyung Kim 	}
22194b4d89eSNamhyung Kim 
222c60167c1STzvetomir Stoyanov (VMware) 	if (!tep_parse_header_page(pevent, header_page, size,
223ece2a4f4STzvetomir Stoyanov (VMware) 				   tep_get_long_size(pevent))) {
22494b4d89eSNamhyung Kim 		/*
22594b4d89eSNamhyung Kim 		 * The commit field in the page is of type long,
22694b4d89eSNamhyung Kim 		 * use that instead, since it represents the kernel.
22794b4d89eSNamhyung Kim 		 */
228bb3dd7e7STzvetomir Stoyanov 		tep_set_long_size(pevent, tep_get_header_page_size(pevent));
22994b4d89eSNamhyung Kim 	}
23094b4d89eSNamhyung Kim 	free(header_page);
231538bafb5SSteven Rostedt 
2324a31e565SNamhyung Kim 	if (do_read(buf, 13) < 0)
2334a31e565SNamhyung Kim 		return -1;
2344a31e565SNamhyung Kim 
235452958fdSNamhyung Kim 	if (memcmp(buf, "header_event", 13) != 0) {
236452958fdSNamhyung Kim 		pr_debug("did not read header event");
237452958fdSNamhyung Kim 		return -1;
238452958fdSNamhyung Kim 	}
239538bafb5SSteven Rostedt 
240da378962SArnaldo Carvalho de Melo 	size = read8(pevent);
2412b2efc7fSNamhyung Kim 	skip(size);
242a4c98367SNamhyung Kim 
2434a31e565SNamhyung Kim 	return ret;
244538bafb5SSteven Rostedt }
245538bafb5SSteven Rostedt 
read_ftrace_file(struct tep_handle * pevent,unsigned long long size)246096177a8STzvetomir Stoyanov (VMware) static int read_ftrace_file(struct tep_handle *pevent, unsigned long long size)
247538bafb5SSteven Rostedt {
248a7619aefSNamhyung Kim 	int ret;
249538bafb5SSteven Rostedt 	char *buf;
250538bafb5SSteven Rostedt 
251a4c98367SNamhyung Kim 	buf = malloc(size);
252a7619aefSNamhyung Kim 	if (buf == NULL) {
253a7619aefSNamhyung Kim 		pr_debug("memory allocation failure\n");
2544a31e565SNamhyung Kim 		return -1;
2554a31e565SNamhyung Kim 	}
2564a31e565SNamhyung Kim 
257a7619aefSNamhyung Kim 	ret = do_read(buf, size);
258a7619aefSNamhyung Kim 	if (ret < 0) {
259a7619aefSNamhyung Kim 		pr_debug("error reading ftrace file.\n");
260a7619aefSNamhyung Kim 		goto out;
261a7619aefSNamhyung Kim 	}
262a7619aefSNamhyung Kim 
263a7619aefSNamhyung Kim 	ret = parse_ftrace_file(pevent, buf, size);
264a7619aefSNamhyung Kim 	if (ret < 0)
265a7619aefSNamhyung Kim 		pr_debug("error parsing ftrace file.\n");
266a7619aefSNamhyung Kim out:
267538bafb5SSteven Rostedt 	free(buf);
268a7619aefSNamhyung Kim 	return ret;
269538bafb5SSteven Rostedt }
270538bafb5SSteven Rostedt 
read_event_file(struct tep_handle * pevent,char * sys,unsigned long long size)271096177a8STzvetomir Stoyanov (VMware) static int read_event_file(struct tep_handle *pevent, char *sys,
272da378962SArnaldo Carvalho de Melo 			   unsigned long long size)
273538bafb5SSteven Rostedt {
274a7619aefSNamhyung Kim 	int ret;
275538bafb5SSteven Rostedt 	char *buf;
276538bafb5SSteven Rostedt 
277a4c98367SNamhyung Kim 	buf = malloc(size);
278a7619aefSNamhyung Kim 	if (buf == NULL) {
279a7619aefSNamhyung Kim 		pr_debug("memory allocation failure\n");
2804a31e565SNamhyung Kim 		return -1;
2814a31e565SNamhyung Kim 	}
2824a31e565SNamhyung Kim 
283a7619aefSNamhyung Kim 	ret = do_read(buf, size);
284470c8f7cSSanskriti Sharma 	if (ret < 0)
285a7619aefSNamhyung Kim 		goto out;
286a7619aefSNamhyung Kim 
287a7619aefSNamhyung Kim 	ret = parse_event_file(pevent, buf, size, sys);
288a7619aefSNamhyung Kim 	if (ret < 0)
289a7619aefSNamhyung Kim 		pr_debug("error parsing event file.\n");
290a7619aefSNamhyung Kim out:
291a7619aefSNamhyung Kim 	free(buf);
292a7619aefSNamhyung Kim 	return ret;
293538bafb5SSteven Rostedt }
294538bafb5SSteven Rostedt 
read_ftrace_files(struct tep_handle * pevent)295096177a8STzvetomir Stoyanov (VMware) static int read_ftrace_files(struct tep_handle *pevent)
296538bafb5SSteven Rostedt {
297538bafb5SSteven Rostedt 	unsigned long long size;
298538bafb5SSteven Rostedt 	int count;
299538bafb5SSteven Rostedt 	int i;
300a4c98367SNamhyung Kim 	int ret;
301538bafb5SSteven Rostedt 
302da378962SArnaldo Carvalho de Melo 	count = read4(pevent);
303538bafb5SSteven Rostedt 
304538bafb5SSteven Rostedt 	for (i = 0; i < count; i++) {
305da378962SArnaldo Carvalho de Melo 		size = read8(pevent);
306a4c98367SNamhyung Kim 		ret = read_ftrace_file(pevent, size);
307a4c98367SNamhyung Kim 		if (ret)
308a4c98367SNamhyung Kim 			return ret;
309538bafb5SSteven Rostedt 	}
310a4c98367SNamhyung Kim 	return 0;
311538bafb5SSteven Rostedt }
312538bafb5SSteven Rostedt 
read_event_files(struct tep_handle * pevent)313096177a8STzvetomir Stoyanov (VMware) static int read_event_files(struct tep_handle *pevent)
314538bafb5SSteven Rostedt {
315538bafb5SSteven Rostedt 	unsigned long long size;
316538bafb5SSteven Rostedt 	char *sys;
317538bafb5SSteven Rostedt 	int systems;
318538bafb5SSteven Rostedt 	int count;
319538bafb5SSteven Rostedt 	int i,x;
320a4c98367SNamhyung Kim 	int ret;
321538bafb5SSteven Rostedt 
322da378962SArnaldo Carvalho de Melo 	systems = read4(pevent);
323538bafb5SSteven Rostedt 
324538bafb5SSteven Rostedt 	for (i = 0; i < systems; i++) {
325538bafb5SSteven Rostedt 		sys = read_string();
326a4c98367SNamhyung Kim 		if (sys == NULL)
327a4c98367SNamhyung Kim 			return -1;
328538bafb5SSteven Rostedt 
329da378962SArnaldo Carvalho de Melo 		count = read4(pevent);
3304a31e565SNamhyung Kim 
331538bafb5SSteven Rostedt 		for (x=0; x < count; x++) {
332da378962SArnaldo Carvalho de Melo 			size = read8(pevent);
333a4c98367SNamhyung Kim 			ret = read_event_file(pevent, sys, size);
3341e44224fSSanskriti Sharma 			if (ret) {
3351e44224fSSanskriti Sharma 				free(sys);
336a4c98367SNamhyung Kim 				return ret;
337538bafb5SSteven Rostedt 			}
338538bafb5SSteven Rostedt 		}
3391e44224fSSanskriti Sharma 		free(sys);
3401e44224fSSanskriti Sharma 	}
341a4c98367SNamhyung Kim 	return 0;
342538bafb5SSteven Rostedt }
343538bafb5SSteven Rostedt 
read_saved_cmdline(struct tep_handle * pevent)344096177a8STzvetomir Stoyanov (VMware) static int read_saved_cmdline(struct tep_handle *pevent)
345cd4ceb63SNamhyung Kim {
346cd4ceb63SNamhyung Kim 	unsigned long long size;
347cd4ceb63SNamhyung Kim 	char *buf;
348a7619aefSNamhyung Kim 	int ret;
349cd4ceb63SNamhyung Kim 
350cd4ceb63SNamhyung Kim 	/* it can have 0 size */
351cd4ceb63SNamhyung Kim 	size = read8(pevent);
352cd4ceb63SNamhyung Kim 	if (!size)
353cd4ceb63SNamhyung Kim 		return 0;
354cd4ceb63SNamhyung Kim 
355cd4ceb63SNamhyung Kim 	buf = malloc(size + 1);
356a7619aefSNamhyung Kim 	if (buf == NULL) {
357a7619aefSNamhyung Kim 		pr_debug("memory allocation failure\n");
358cd4ceb63SNamhyung Kim 		return -1;
359cd4ceb63SNamhyung Kim 	}
360cd4ceb63SNamhyung Kim 
361a7619aefSNamhyung Kim 	ret = do_read(buf, size);
362a7619aefSNamhyung Kim 	if (ret < 0) {
363a7619aefSNamhyung Kim 		pr_debug("error reading saved cmdlines\n");
364a7619aefSNamhyung Kim 		goto out;
365a7619aefSNamhyung Kim 	}
366137a5258SIan Rogers 	buf[ret] = '\0';
367cd4ceb63SNamhyung Kim 
368a7619aefSNamhyung Kim 	parse_saved_cmdline(pevent, buf, size);
369a7619aefSNamhyung Kim 	ret = 0;
370a7619aefSNamhyung Kim out:
371cd4ceb63SNamhyung Kim 	free(buf);
372a7619aefSNamhyung Kim 	return ret;
373cd4ceb63SNamhyung Kim }
374cd4ceb63SNamhyung Kim 
trace_report(int fd,struct trace_event * tevent,bool __repipe)37529f5ffd3SJiri Olsa ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
376538bafb5SSteven Rostedt {
377538bafb5SSteven Rostedt 	char buf[BUFSIZ];
378538bafb5SSteven Rostedt 	char test[] = { 23, 8, 68 };
379538bafb5SSteven Rostedt 	char *version;
380d9340c1dSIngo Molnar 	int show_version = 0;
381538bafb5SSteven Rostedt 	int show_funcs = 0;
382538bafb5SSteven Rostedt 	int show_printk = 0;
3833dce2ce3SNamhyung Kim 	ssize_t size = -1;
38463af28faSNamhyung Kim 	int file_bigendian;
38563af28faSNamhyung Kim 	int host_bigendian;
38659657f9cSNamhyung Kim 	int file_long_size;
38730f36762SNamhyung Kim 	int file_page_size;
388096177a8STzvetomir Stoyanov (VMware) 	struct tep_handle *pevent = NULL;
389a4c98367SNamhyung Kim 	int err;
3903dce2ce3SNamhyung Kim 
391454c407eSTom Zanussi 	repipe = __repipe;
39203456a15SFrederic Weisbecker 	input_fd = fd;
393538bafb5SSteven Rostedt 
3944a31e565SNamhyung Kim 	if (do_read(buf, 3) < 0)
3954a31e565SNamhyung Kim 		return -1;
396452958fdSNamhyung Kim 	if (memcmp(buf, test, 3) != 0) {
397452958fdSNamhyung Kim 		pr_debug("no trace data in the file");
398452958fdSNamhyung Kim 		return -1;
399452958fdSNamhyung Kim 	}
400538bafb5SSteven Rostedt 
4014a31e565SNamhyung Kim 	if (do_read(buf, 7) < 0)
4024a31e565SNamhyung Kim 		return -1;
403452958fdSNamhyung Kim 	if (memcmp(buf, "tracing", 7) != 0) {
404452958fdSNamhyung Kim 		pr_debug("not a trace file (missing 'tracing' tag)");
405452958fdSNamhyung Kim 		return -1;
406452958fdSNamhyung Kim 	}
407538bafb5SSteven Rostedt 
408538bafb5SSteven Rostedt 	version = read_string();
409a4c98367SNamhyung Kim 	if (version == NULL)
410a4c98367SNamhyung Kim 		return -1;
411d9340c1dSIngo Molnar 	if (show_version)
412538bafb5SSteven Rostedt 		printf("version = %s\n", version);
413538bafb5SSteven Rostedt 
414cd4ceb63SNamhyung Kim 	if (do_read(buf, 1) < 0) {
415cd4ceb63SNamhyung Kim 		free(version);
4164a31e565SNamhyung Kim 		return -1;
417cd4ceb63SNamhyung Kim 	}
418538bafb5SSteven Rostedt 	file_bigendian = buf[0];
4195b7a29fbSIan Rogers 	host_bigendian = host_is_bigendian() ? 1 : 0;
420538bafb5SSteven Rostedt 
42129f5ffd3SJiri Olsa 	if (trace_event__init(tevent)) {
42229f5ffd3SJiri Olsa 		pr_debug("trace_event__init failed");
4233dce2ce3SNamhyung Kim 		goto out;
4243dce2ce3SNamhyung Kim 	}
425aaf045f7SSteven Rostedt 
42629f5ffd3SJiri Olsa 	pevent = tevent->pevent;
42729f5ffd3SJiri Olsa 
4286fed932eSTzvetomir Stoyanov (VMware) 	tep_set_flag(pevent, TEP_NSEC_OUTPUT);
429ece2a4f4STzvetomir Stoyanov (VMware) 	tep_set_file_bigendian(pevent, file_bigendian);
43055c34ae0STzvetomir Stoyanov 	tep_set_local_bigendian(pevent, host_bigendian);
43129f5ffd3SJiri Olsa 
4324a31e565SNamhyung Kim 	if (do_read(buf, 1) < 0)
4334a31e565SNamhyung Kim 		goto out;
43459657f9cSNamhyung Kim 	file_long_size = buf[0];
435538bafb5SSteven Rostedt 
43630f36762SNamhyung Kim 	file_page_size = read4(pevent);
43730f36762SNamhyung Kim 	if (!file_page_size)
4384a31e565SNamhyung Kim 		goto out;
439538bafb5SSteven Rostedt 
440ece2a4f4STzvetomir Stoyanov (VMware) 	tep_set_long_size(pevent, file_long_size);
441ece2a4f4STzvetomir Stoyanov (VMware) 	tep_set_page_size(pevent, file_page_size);
44230f36762SNamhyung Kim 
443a4c98367SNamhyung Kim 	err = read_header_files(pevent);
444a4c98367SNamhyung Kim 	if (err)
445a4c98367SNamhyung Kim 		goto out;
446a4c98367SNamhyung Kim 	err = read_ftrace_files(pevent);
447a4c98367SNamhyung Kim 	if (err)
448a4c98367SNamhyung Kim 		goto out;
449a4c98367SNamhyung Kim 	err = read_event_files(pevent);
450a4c98367SNamhyung Kim 	if (err)
451a4c98367SNamhyung Kim 		goto out;
452a4c98367SNamhyung Kim 	err = read_proc_kallsyms(pevent);
453a4c98367SNamhyung Kim 	if (err)
454a4c98367SNamhyung Kim 		goto out;
455a4c98367SNamhyung Kim 	err = read_ftrace_printk(pevent);
456a4c98367SNamhyung Kim 	if (err)
457a4c98367SNamhyung Kim 		goto out;
458cd4ceb63SNamhyung Kim 	if (atof(version) >= 0.6) {
459cd4ceb63SNamhyung Kim 		err = read_saved_cmdline(pevent);
460cd4ceb63SNamhyung Kim 		if (err)
461cd4ceb63SNamhyung Kim 			goto out;
462cd4ceb63SNamhyung Kim 	}
463538bafb5SSteven Rostedt 
464ebf3c675SNamhyung Kim 	size = trace_data_size;
465454c407eSTom Zanussi 	repipe = false;
4669215545eSTom Zanussi 
467538bafb5SSteven Rostedt 	if (show_funcs) {
4686a48dc29STzvetomir Stoyanov (VMware) 		tep_print_funcs(pevent);
4693dce2ce3SNamhyung Kim 	} else if (show_printk) {
4706a48dc29STzvetomir Stoyanov (VMware) 		tep_print_printk(pevent);
471538bafb5SSteven Rostedt 	}
472538bafb5SSteven Rostedt 
4733dce2ce3SNamhyung Kim 	pevent = NULL;
4743dce2ce3SNamhyung Kim 
4753dce2ce3SNamhyung Kim out:
4763dce2ce3SNamhyung Kim 	if (pevent)
47729f5ffd3SJiri Olsa 		trace_event__cleanup(tevent);
478cd4ceb63SNamhyung Kim 	free(version);
4799215545eSTom Zanussi 	return size;
480538bafb5SSteven Rostedt }
481