1538bafb5SSteven Rostedt /*
2538bafb5SSteven Rostedt  * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
3538bafb5SSteven Rostedt  *
4538bafb5SSteven Rostedt  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5538bafb5SSteven Rostedt  *
6538bafb5SSteven Rostedt  * This program is free software; you can redistribute it and/or modify
7538bafb5SSteven Rostedt  * it under the terms of the GNU General Public License as published by
8538bafb5SSteven Rostedt  * the Free Software Foundation; version 2 of the License (not later!)
9538bafb5SSteven Rostedt  *
10538bafb5SSteven Rostedt  * This program is distributed in the hope that it will be useful,
11538bafb5SSteven Rostedt  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12538bafb5SSteven Rostedt  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13538bafb5SSteven Rostedt  * GNU General Public License for more details.
14538bafb5SSteven Rostedt  *
15538bafb5SSteven Rostedt  * You should have received a copy of the GNU General Public License
16538bafb5SSteven Rostedt  * along with this program; if not, write to the Free Software
17538bafb5SSteven Rostedt  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18538bafb5SSteven Rostedt  *
19538bafb5SSteven Rostedt  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20538bafb5SSteven Rostedt  */
21538bafb5SSteven Rostedt #include <dirent.h>
22538bafb5SSteven Rostedt #include <stdio.h>
23538bafb5SSteven Rostedt #include <stdlib.h>
24538bafb5SSteven Rostedt #include <string.h>
25538bafb5SSteven Rostedt #include <stdarg.h>
26538bafb5SSteven Rostedt #include <sys/types.h>
27538bafb5SSteven Rostedt #include <sys/stat.h>
28538bafb5SSteven Rostedt #include <sys/wait.h>
29538bafb5SSteven Rostedt #include <sys/mman.h>
30538bafb5SSteven Rostedt #include <fcntl.h>
31538bafb5SSteven Rostedt #include <unistd.h>
32538bafb5SSteven Rostedt #include <errno.h>
33538bafb5SSteven Rostedt 
341ef2ed10SFrederic Weisbecker #include "../perf.h"
35538bafb5SSteven Rostedt #include "util.h"
36538bafb5SSteven Rostedt #include "trace-event.h"
3784f5d36fSJiri Olsa #include "debug.h"
38538bafb5SSteven Rostedt 
39538bafb5SSteven Rostedt static int input_fd;
40538bafb5SSteven Rostedt 
41ebf3c675SNamhyung Kim static ssize_t trace_data_size;
42454c407eSTom Zanussi static bool repipe;
439215545eSTom Zanussi 
444a31e565SNamhyung Kim static int __do_read(int fd, void *buf, int size)
459215545eSTom Zanussi {
469215545eSTom Zanussi 	int rsize = size;
479215545eSTom Zanussi 
489215545eSTom Zanussi 	while (size) {
499215545eSTom Zanussi 		int ret = read(fd, buf, size);
509215545eSTom Zanussi 
519215545eSTom Zanussi 		if (ret <= 0)
529215545eSTom Zanussi 			return -1;
539215545eSTom Zanussi 
54454c407eSTom Zanussi 		if (repipe) {
55454c407eSTom Zanussi 			int retw = write(STDOUT_FILENO, buf, ret);
56454c407eSTom Zanussi 
574a31e565SNamhyung Kim 			if (retw <= 0 || retw != ret) {
584a31e565SNamhyung Kim 				pr_debug("repiping input file");
594a31e565SNamhyung Kim 				return -1;
604a31e565SNamhyung Kim 			}
61454c407eSTom Zanussi 		}
62454c407eSTom Zanussi 
639215545eSTom Zanussi 		size -= ret;
649215545eSTom Zanussi 		buf += ret;
659215545eSTom Zanussi 	}
669215545eSTom Zanussi 
679215545eSTom Zanussi 	return rsize;
689215545eSTom Zanussi }
699215545eSTom Zanussi 
704a31e565SNamhyung Kim static int do_read(void *data, int size)
71538bafb5SSteven Rostedt {
72538bafb5SSteven Rostedt 	int r;
73538bafb5SSteven Rostedt 
744a31e565SNamhyung Kim 	r = __do_read(input_fd, data, size);
754a31e565SNamhyung Kim 	if (r <= 0) {
764a31e565SNamhyung Kim 		pr_debug("reading input file (size expected=%d received=%d)",
77538bafb5SSteven Rostedt 			 size, r);
784a31e565SNamhyung Kim 		return -1;
794a31e565SNamhyung Kim 	}
809215545eSTom Zanussi 
81ebf3c675SNamhyung Kim 	trace_data_size += r;
829215545eSTom Zanussi 
83538bafb5SSteven Rostedt 	return r;
84538bafb5SSteven Rostedt }
85538bafb5SSteven Rostedt 
86cbb5cf7fSTom Zanussi /* If it fails, the next read will report it */
87cbb5cf7fSTom Zanussi static void skip(int size)
88cbb5cf7fSTom Zanussi {
89cbb5cf7fSTom Zanussi 	char buf[BUFSIZ];
90cbb5cf7fSTom Zanussi 	int r;
91cbb5cf7fSTom Zanussi 
92cbb5cf7fSTom Zanussi 	while (size) {
93cbb5cf7fSTom Zanussi 		r = size > BUFSIZ ? BUFSIZ : size;
944a31e565SNamhyung Kim 		do_read(buf, r);
95cbb5cf7fSTom Zanussi 		size -= r;
96cbb5cf7fSTom Zanussi 	};
97cbb5cf7fSTom Zanussi }
98cbb5cf7fSTom Zanussi 
99096177a8STzvetomir Stoyanov (VMware) static unsigned int read4(struct tep_handle *pevent)
100538bafb5SSteven Rostedt {
101538bafb5SSteven Rostedt 	unsigned int data;
102538bafb5SSteven Rostedt 
1034a31e565SNamhyung Kim 	if (do_read(&data, 4) < 0)
1044a31e565SNamhyung Kim 		return 0;
105da378962SArnaldo Carvalho de Melo 	return __data2host4(pevent, data);
106538bafb5SSteven Rostedt }
107538bafb5SSteven Rostedt 
108096177a8STzvetomir Stoyanov (VMware) static unsigned long long read8(struct tep_handle *pevent)
109538bafb5SSteven Rostedt {
110538bafb5SSteven Rostedt 	unsigned long long data;
111538bafb5SSteven Rostedt 
1124a31e565SNamhyung Kim 	if (do_read(&data, 8) < 0)
1134a31e565SNamhyung Kim 		return 0;
114da378962SArnaldo Carvalho de Melo 	return __data2host8(pevent, data);
115538bafb5SSteven Rostedt }
116538bafb5SSteven Rostedt 
117538bafb5SSteven Rostedt static char *read_string(void)
118538bafb5SSteven Rostedt {
119538bafb5SSteven Rostedt 	char buf[BUFSIZ];
120538bafb5SSteven Rostedt 	char *str = NULL;
121538bafb5SSteven Rostedt 	int size = 0;
122f887f301SXiao Guangrong 	off_t r;
1239215545eSTom Zanussi 	char c;
124538bafb5SSteven Rostedt 
125538bafb5SSteven Rostedt 	for (;;) {
1269215545eSTom Zanussi 		r = read(input_fd, &c, 1);
127452958fdSNamhyung Kim 		if (r < 0) {
128452958fdSNamhyung Kim 			pr_debug("reading input file");
129452958fdSNamhyung Kim 			goto out;
130452958fdSNamhyung Kim 		}
131538bafb5SSteven Rostedt 
132452958fdSNamhyung Kim 		if (!r) {
133452958fdSNamhyung Kim 			pr_debug("no data");
134452958fdSNamhyung Kim 			goto out;
135452958fdSNamhyung Kim 		}
136538bafb5SSteven Rostedt 
137454c407eSTom Zanussi 		if (repipe) {
138454c407eSTom Zanussi 			int retw = write(STDOUT_FILENO, &c, 1);
139454c407eSTom Zanussi 
140452958fdSNamhyung Kim 			if (retw <= 0 || retw != r) {
141452958fdSNamhyung Kim 				pr_debug("repiping input file string");
142452958fdSNamhyung Kim 				goto out;
143452958fdSNamhyung Kim 			}
144454c407eSTom Zanussi 		}
145454c407eSTom Zanussi 
1469215545eSTom Zanussi 		buf[size++] = c;
1479215545eSTom Zanussi 
1489215545eSTom Zanussi 		if (!c)
149538bafb5SSteven Rostedt 			break;
150538bafb5SSteven Rostedt 	}
151538bafb5SSteven Rostedt 
152ebf3c675SNamhyung Kim 	trace_data_size += size;
1539215545eSTom Zanussi 
154a4c98367SNamhyung Kim 	str = malloc(size);
155a4c98367SNamhyung Kim 	if (str)
156538bafb5SSteven Rostedt 		memcpy(str, buf, size);
157452958fdSNamhyung Kim out:
158538bafb5SSteven Rostedt 	return str;
159538bafb5SSteven Rostedt }
160538bafb5SSteven Rostedt 
161096177a8STzvetomir Stoyanov (VMware) static int read_proc_kallsyms(struct tep_handle *pevent)
162538bafb5SSteven Rostedt {
163538bafb5SSteven Rostedt 	unsigned int size;
164538bafb5SSteven Rostedt 
165da378962SArnaldo Carvalho de Melo 	size = read4(pevent);
166538bafb5SSteven Rostedt 	if (!size)
167a4c98367SNamhyung Kim 		return 0;
1684263ceceSArnaldo Carvalho de Melo 	/*
1694263ceceSArnaldo Carvalho de Melo 	 * Just skip it, now that we configure libtraceevent to use the
1704263ceceSArnaldo Carvalho de Melo 	 * tools/perf/ symbol resolver.
1714263ceceSArnaldo Carvalho de Melo 	 *
1724263ceceSArnaldo Carvalho de Melo 	 * We need to skip it so that we can continue parsing old perf.data
1734263ceceSArnaldo Carvalho de Melo 	 * files, that contains this /proc/kallsyms payload.
1744263ceceSArnaldo Carvalho de Melo 	 *
1754263ceceSArnaldo Carvalho de Melo 	 * Newer perf.data files will have just the 4-bytes zeros "kallsyms
1764263ceceSArnaldo Carvalho de Melo 	 * payload", so that older tools can continue reading it and interpret
1774263ceceSArnaldo Carvalho de Melo 	 * it as "no kallsyms payload is present".
1784263ceceSArnaldo Carvalho de Melo 	 */
1794263ceceSArnaldo Carvalho de Melo 	lseek(input_fd, size, SEEK_CUR);
1804263ceceSArnaldo Carvalho de Melo 	trace_data_size += size;
181a4c98367SNamhyung Kim 	return 0;
182538bafb5SSteven Rostedt }
183538bafb5SSteven Rostedt 
184096177a8STzvetomir Stoyanov (VMware) static int read_ftrace_printk(struct tep_handle *pevent)
185538bafb5SSteven Rostedt {
186538bafb5SSteven Rostedt 	unsigned int size;
187538bafb5SSteven Rostedt 	char *buf;
188538bafb5SSteven Rostedt 
1894a31e565SNamhyung Kim 	/* it can have 0 size */
190da378962SArnaldo Carvalho de Melo 	size = read4(pevent);
191538bafb5SSteven Rostedt 	if (!size)
192a4c98367SNamhyung Kim 		return 0;
193538bafb5SSteven Rostedt 
194d4b364dfSTommi Rantala 	buf = malloc(size + 1);
195a4c98367SNamhyung Kim 	if (buf == NULL)
196a4c98367SNamhyung Kim 		return -1;
197a4c98367SNamhyung Kim 
1984a31e565SNamhyung Kim 	if (do_read(buf, size) < 0) {
1994a31e565SNamhyung Kim 		free(buf);
2004a31e565SNamhyung Kim 		return -1;
2014a31e565SNamhyung Kim 	}
202538bafb5SSteven Rostedt 
203d4b364dfSTommi Rantala 	buf[size] = '\0';
204d4b364dfSTommi Rantala 
205da378962SArnaldo Carvalho de Melo 	parse_ftrace_printk(pevent, buf, size);
206538bafb5SSteven Rostedt 
207538bafb5SSteven Rostedt 	free(buf);
208a4c98367SNamhyung Kim 	return 0;
209538bafb5SSteven Rostedt }
210538bafb5SSteven Rostedt 
211096177a8STzvetomir Stoyanov (VMware) static int read_header_files(struct tep_handle *pevent)
212538bafb5SSteven Rostedt {
213538bafb5SSteven Rostedt 	unsigned long long size;
21494b4d89eSNamhyung Kim 	char *header_page;
215538bafb5SSteven Rostedt 	char buf[BUFSIZ];
2164a31e565SNamhyung Kim 	int ret = 0;
217538bafb5SSteven Rostedt 
2184a31e565SNamhyung Kim 	if (do_read(buf, 12) < 0)
2194a31e565SNamhyung Kim 		return -1;
220538bafb5SSteven Rostedt 
221452958fdSNamhyung Kim 	if (memcmp(buf, "header_page", 12) != 0) {
222452958fdSNamhyung Kim 		pr_debug("did not read header page");
223452958fdSNamhyung Kim 		return -1;
224452958fdSNamhyung Kim 	}
225538bafb5SSteven Rostedt 
226da378962SArnaldo Carvalho de Melo 	size = read8(pevent);
22794b4d89eSNamhyung Kim 
22894b4d89eSNamhyung Kim 	header_page = malloc(size);
22994b4d89eSNamhyung Kim 	if (header_page == NULL)
23094b4d89eSNamhyung Kim 		return -1;
23194b4d89eSNamhyung Kim 
23294b4d89eSNamhyung Kim 	if (do_read(header_page, size) < 0) {
23394b4d89eSNamhyung Kim 		pr_debug("did not read header page");
23494b4d89eSNamhyung Kim 		free(header_page);
23594b4d89eSNamhyung Kim 		return -1;
23694b4d89eSNamhyung Kim 	}
23794b4d89eSNamhyung Kim 
238c60167c1STzvetomir Stoyanov (VMware) 	if (!tep_parse_header_page(pevent, header_page, size,
23994b4d89eSNamhyung Kim 				   pevent_get_long_size(pevent))) {
24094b4d89eSNamhyung Kim 		/*
24194b4d89eSNamhyung Kim 		 * The commit field in the page is of type long,
24294b4d89eSNamhyung Kim 		 * use that instead, since it represents the kernel.
24394b4d89eSNamhyung Kim 		 */
24494b4d89eSNamhyung Kim 		pevent_set_long_size(pevent, pevent->header_page_size_size);
24594b4d89eSNamhyung Kim 	}
24694b4d89eSNamhyung Kim 	free(header_page);
247538bafb5SSteven Rostedt 
2484a31e565SNamhyung Kim 	if (do_read(buf, 13) < 0)
2494a31e565SNamhyung Kim 		return -1;
2504a31e565SNamhyung Kim 
251452958fdSNamhyung Kim 	if (memcmp(buf, "header_event", 13) != 0) {
252452958fdSNamhyung Kim 		pr_debug("did not read header event");
253452958fdSNamhyung Kim 		return -1;
254452958fdSNamhyung Kim 	}
255538bafb5SSteven Rostedt 
256da378962SArnaldo Carvalho de Melo 	size = read8(pevent);
2572b2efc7fSNamhyung Kim 	skip(size);
258a4c98367SNamhyung Kim 
2594a31e565SNamhyung Kim 	return ret;
260538bafb5SSteven Rostedt }
261538bafb5SSteven Rostedt 
262096177a8STzvetomir Stoyanov (VMware) static int read_ftrace_file(struct tep_handle *pevent, unsigned long long size)
263538bafb5SSteven Rostedt {
264a7619aefSNamhyung Kim 	int ret;
265538bafb5SSteven Rostedt 	char *buf;
266538bafb5SSteven Rostedt 
267a4c98367SNamhyung Kim 	buf = malloc(size);
268a7619aefSNamhyung Kim 	if (buf == NULL) {
269a7619aefSNamhyung Kim 		pr_debug("memory allocation failure\n");
2704a31e565SNamhyung Kim 		return -1;
2714a31e565SNamhyung Kim 	}
2724a31e565SNamhyung Kim 
273a7619aefSNamhyung Kim 	ret = do_read(buf, size);
274a7619aefSNamhyung Kim 	if (ret < 0) {
275a7619aefSNamhyung Kim 		pr_debug("error reading ftrace file.\n");
276a7619aefSNamhyung Kim 		goto out;
277a7619aefSNamhyung Kim 	}
278a7619aefSNamhyung Kim 
279a7619aefSNamhyung Kim 	ret = parse_ftrace_file(pevent, buf, size);
280a7619aefSNamhyung Kim 	if (ret < 0)
281a7619aefSNamhyung Kim 		pr_debug("error parsing ftrace file.\n");
282a7619aefSNamhyung Kim out:
283538bafb5SSteven Rostedt 	free(buf);
284a7619aefSNamhyung Kim 	return ret;
285538bafb5SSteven Rostedt }
286538bafb5SSteven Rostedt 
287096177a8STzvetomir Stoyanov (VMware) static int read_event_file(struct tep_handle *pevent, char *sys,
288da378962SArnaldo Carvalho de Melo 			   unsigned long long size)
289538bafb5SSteven Rostedt {
290a7619aefSNamhyung Kim 	int ret;
291538bafb5SSteven Rostedt 	char *buf;
292538bafb5SSteven Rostedt 
293a4c98367SNamhyung Kim 	buf = malloc(size);
294a7619aefSNamhyung Kim 	if (buf == NULL) {
295a7619aefSNamhyung Kim 		pr_debug("memory allocation failure\n");
2964a31e565SNamhyung Kim 		return -1;
2974a31e565SNamhyung Kim 	}
2984a31e565SNamhyung Kim 
299a7619aefSNamhyung Kim 	ret = do_read(buf, size);
300a7619aefSNamhyung Kim 	if (ret < 0) {
301538bafb5SSteven Rostedt 		free(buf);
302a7619aefSNamhyung Kim 		goto out;
303a7619aefSNamhyung Kim 	}
304a7619aefSNamhyung Kim 
305a7619aefSNamhyung Kim 	ret = parse_event_file(pevent, buf, size, sys);
306a7619aefSNamhyung Kim 	if (ret < 0)
307a7619aefSNamhyung Kim 		pr_debug("error parsing event file.\n");
308a7619aefSNamhyung Kim out:
309a7619aefSNamhyung Kim 	free(buf);
310a7619aefSNamhyung Kim 	return ret;
311538bafb5SSteven Rostedt }
312538bafb5SSteven Rostedt 
313096177a8STzvetomir Stoyanov (VMware) static int read_ftrace_files(struct tep_handle *pevent)
314538bafb5SSteven Rostedt {
315538bafb5SSteven Rostedt 	unsigned long long size;
316538bafb5SSteven Rostedt 	int count;
317538bafb5SSteven Rostedt 	int i;
318a4c98367SNamhyung Kim 	int ret;
319538bafb5SSteven Rostedt 
320da378962SArnaldo Carvalho de Melo 	count = read4(pevent);
321538bafb5SSteven Rostedt 
322538bafb5SSteven Rostedt 	for (i = 0; i < count; i++) {
323da378962SArnaldo Carvalho de Melo 		size = read8(pevent);
324a4c98367SNamhyung Kim 		ret = read_ftrace_file(pevent, size);
325a4c98367SNamhyung Kim 		if (ret)
326a4c98367SNamhyung Kim 			return ret;
327538bafb5SSteven Rostedt 	}
328a4c98367SNamhyung Kim 	return 0;
329538bafb5SSteven Rostedt }
330538bafb5SSteven Rostedt 
331096177a8STzvetomir Stoyanov (VMware) static int read_event_files(struct tep_handle *pevent)
332538bafb5SSteven Rostedt {
333538bafb5SSteven Rostedt 	unsigned long long size;
334538bafb5SSteven Rostedt 	char *sys;
335538bafb5SSteven Rostedt 	int systems;
336538bafb5SSteven Rostedt 	int count;
337538bafb5SSteven Rostedt 	int i,x;
338a4c98367SNamhyung Kim 	int ret;
339538bafb5SSteven Rostedt 
340da378962SArnaldo Carvalho de Melo 	systems = read4(pevent);
341538bafb5SSteven Rostedt 
342538bafb5SSteven Rostedt 	for (i = 0; i < systems; i++) {
343538bafb5SSteven Rostedt 		sys = read_string();
344a4c98367SNamhyung Kim 		if (sys == NULL)
345a4c98367SNamhyung Kim 			return -1;
346538bafb5SSteven Rostedt 
347da378962SArnaldo Carvalho de Melo 		count = read4(pevent);
3484a31e565SNamhyung Kim 
349538bafb5SSteven Rostedt 		for (x=0; x < count; x++) {
350da378962SArnaldo Carvalho de Melo 			size = read8(pevent);
351a4c98367SNamhyung Kim 			ret = read_event_file(pevent, sys, size);
352a4c98367SNamhyung Kim 			if (ret)
353a4c98367SNamhyung Kim 				return ret;
354538bafb5SSteven Rostedt 		}
355538bafb5SSteven Rostedt 	}
356a4c98367SNamhyung Kim 	return 0;
357538bafb5SSteven Rostedt }
358538bafb5SSteven Rostedt 
359096177a8STzvetomir Stoyanov (VMware) static int read_saved_cmdline(struct tep_handle *pevent)
360cd4ceb63SNamhyung Kim {
361cd4ceb63SNamhyung Kim 	unsigned long long size;
362cd4ceb63SNamhyung Kim 	char *buf;
363a7619aefSNamhyung Kim 	int ret;
364cd4ceb63SNamhyung Kim 
365cd4ceb63SNamhyung Kim 	/* it can have 0 size */
366cd4ceb63SNamhyung Kim 	size = read8(pevent);
367cd4ceb63SNamhyung Kim 	if (!size)
368cd4ceb63SNamhyung Kim 		return 0;
369cd4ceb63SNamhyung Kim 
370cd4ceb63SNamhyung Kim 	buf = malloc(size + 1);
371a7619aefSNamhyung Kim 	if (buf == NULL) {
372a7619aefSNamhyung Kim 		pr_debug("memory allocation failure\n");
373cd4ceb63SNamhyung Kim 		return -1;
374cd4ceb63SNamhyung Kim 	}
375cd4ceb63SNamhyung Kim 
376a7619aefSNamhyung Kim 	ret = do_read(buf, size);
377a7619aefSNamhyung Kim 	if (ret < 0) {
378a7619aefSNamhyung Kim 		pr_debug("error reading saved cmdlines\n");
379a7619aefSNamhyung Kim 		goto out;
380a7619aefSNamhyung Kim 	}
381cd4ceb63SNamhyung Kim 
382a7619aefSNamhyung Kim 	parse_saved_cmdline(pevent, buf, size);
383a7619aefSNamhyung Kim 	ret = 0;
384a7619aefSNamhyung Kim out:
385cd4ceb63SNamhyung Kim 	free(buf);
386a7619aefSNamhyung Kim 	return ret;
387cd4ceb63SNamhyung Kim }
388cd4ceb63SNamhyung Kim 
38929f5ffd3SJiri Olsa ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
390538bafb5SSteven Rostedt {
391538bafb5SSteven Rostedt 	char buf[BUFSIZ];
392538bafb5SSteven Rostedt 	char test[] = { 23, 8, 68 };
393538bafb5SSteven Rostedt 	char *version;
394d9340c1dSIngo Molnar 	int show_version = 0;
395538bafb5SSteven Rostedt 	int show_funcs = 0;
396538bafb5SSteven Rostedt 	int show_printk = 0;
3973dce2ce3SNamhyung Kim 	ssize_t size = -1;
39863af28faSNamhyung Kim 	int file_bigendian;
39963af28faSNamhyung Kim 	int host_bigendian;
40059657f9cSNamhyung Kim 	int file_long_size;
40130f36762SNamhyung Kim 	int file_page_size;
402096177a8STzvetomir Stoyanov (VMware) 	struct tep_handle *pevent = NULL;
403a4c98367SNamhyung Kim 	int err;
4043dce2ce3SNamhyung Kim 
405454c407eSTom Zanussi 	repipe = __repipe;
40603456a15SFrederic Weisbecker 	input_fd = fd;
407538bafb5SSteven Rostedt 
4084a31e565SNamhyung Kim 	if (do_read(buf, 3) < 0)
4094a31e565SNamhyung Kim 		return -1;
410452958fdSNamhyung Kim 	if (memcmp(buf, test, 3) != 0) {
411452958fdSNamhyung Kim 		pr_debug("no trace data in the file");
412452958fdSNamhyung Kim 		return -1;
413452958fdSNamhyung Kim 	}
414538bafb5SSteven Rostedt 
4154a31e565SNamhyung Kim 	if (do_read(buf, 7) < 0)
4164a31e565SNamhyung Kim 		return -1;
417452958fdSNamhyung Kim 	if (memcmp(buf, "tracing", 7) != 0) {
418452958fdSNamhyung Kim 		pr_debug("not a trace file (missing 'tracing' tag)");
419452958fdSNamhyung Kim 		return -1;
420452958fdSNamhyung Kim 	}
421538bafb5SSteven Rostedt 
422538bafb5SSteven Rostedt 	version = read_string();
423a4c98367SNamhyung Kim 	if (version == NULL)
424a4c98367SNamhyung Kim 		return -1;
425d9340c1dSIngo Molnar 	if (show_version)
426538bafb5SSteven Rostedt 		printf("version = %s\n", version);
427538bafb5SSteven Rostedt 
428cd4ceb63SNamhyung Kim 	if (do_read(buf, 1) < 0) {
429cd4ceb63SNamhyung Kim 		free(version);
4304a31e565SNamhyung Kim 		return -1;
431cd4ceb63SNamhyung Kim 	}
432538bafb5SSteven Rostedt 	file_bigendian = buf[0];
433538bafb5SSteven Rostedt 	host_bigendian = bigendian();
434538bafb5SSteven Rostedt 
43529f5ffd3SJiri Olsa 	if (trace_event__init(tevent)) {
43629f5ffd3SJiri Olsa 		pr_debug("trace_event__init failed");
4373dce2ce3SNamhyung Kim 		goto out;
4383dce2ce3SNamhyung Kim 	}
439aaf045f7SSteven Rostedt 
44029f5ffd3SJiri Olsa 	pevent = tevent->pevent;
44129f5ffd3SJiri Olsa 
44229f5ffd3SJiri Olsa 	pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
44329f5ffd3SJiri Olsa 	pevent_set_file_bigendian(pevent, file_bigendian);
44429f5ffd3SJiri Olsa 	pevent_set_host_bigendian(pevent, host_bigendian);
44529f5ffd3SJiri Olsa 
4464a31e565SNamhyung Kim 	if (do_read(buf, 1) < 0)
4474a31e565SNamhyung Kim 		goto out;
44859657f9cSNamhyung Kim 	file_long_size = buf[0];
449538bafb5SSteven Rostedt 
45030f36762SNamhyung Kim 	file_page_size = read4(pevent);
45130f36762SNamhyung Kim 	if (!file_page_size)
4524a31e565SNamhyung Kim 		goto out;
453538bafb5SSteven Rostedt 
45459657f9cSNamhyung Kim 	pevent_set_long_size(pevent, file_long_size);
45530f36762SNamhyung Kim 	pevent_set_page_size(pevent, file_page_size);
45630f36762SNamhyung Kim 
457a4c98367SNamhyung Kim 	err = read_header_files(pevent);
458a4c98367SNamhyung Kim 	if (err)
459a4c98367SNamhyung Kim 		goto out;
460a4c98367SNamhyung Kim 	err = read_ftrace_files(pevent);
461a4c98367SNamhyung Kim 	if (err)
462a4c98367SNamhyung Kim 		goto out;
463a4c98367SNamhyung Kim 	err = read_event_files(pevent);
464a4c98367SNamhyung Kim 	if (err)
465a4c98367SNamhyung Kim 		goto out;
466a4c98367SNamhyung Kim 	err = read_proc_kallsyms(pevent);
467a4c98367SNamhyung Kim 	if (err)
468a4c98367SNamhyung Kim 		goto out;
469a4c98367SNamhyung Kim 	err = read_ftrace_printk(pevent);
470a4c98367SNamhyung Kim 	if (err)
471a4c98367SNamhyung Kim 		goto out;
472cd4ceb63SNamhyung Kim 	if (atof(version) >= 0.6) {
473cd4ceb63SNamhyung Kim 		err = read_saved_cmdline(pevent);
474cd4ceb63SNamhyung Kim 		if (err)
475cd4ceb63SNamhyung Kim 			goto out;
476cd4ceb63SNamhyung Kim 	}
477538bafb5SSteven Rostedt 
478ebf3c675SNamhyung Kim 	size = trace_data_size;
479454c407eSTom Zanussi 	repipe = false;
4809215545eSTom Zanussi 
481538bafb5SSteven Rostedt 	if (show_funcs) {
4826a48dc29STzvetomir Stoyanov (VMware) 		tep_print_funcs(pevent);
4833dce2ce3SNamhyung Kim 	} else if (show_printk) {
4846a48dc29STzvetomir Stoyanov (VMware) 		tep_print_printk(pevent);
485538bafb5SSteven Rostedt 	}
486538bafb5SSteven Rostedt 
4873dce2ce3SNamhyung Kim 	pevent = NULL;
4883dce2ce3SNamhyung Kim 
4893dce2ce3SNamhyung Kim out:
4903dce2ce3SNamhyung Kim 	if (pevent)
49129f5ffd3SJiri Olsa 		trace_event__cleanup(tevent);
492cd4ceb63SNamhyung Kim 	free(version);
4939215545eSTom Zanussi 	return size;
494538bafb5SSteven Rostedt }
495