1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or modify
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * it under the terms of the GNU General Public License as published by
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * the Free Software Foundation; version 2 of the License (not later!)
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is distributed in the hope that it will be useful,
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * but WITHOUT ANY WARRANTY; without even the implied warranty of
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * GNU General Public License for more details.
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * You should have received a copy of the GNU General Public License
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * along with this program; if not, write to the Free Software
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <dirent.h>
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h>
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h>
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <string.h>
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <getopt.h>
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdarg.h>
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/types.h>
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/stat.h>
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/wait.h>
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/mman.h>
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <pthread.h>
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <fcntl.h>
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <unistd.h>
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <errno.h>
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../perf.h"
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util.h"
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "trace-event.h"
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int input_fd;
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic ssize_t trace_data_size;
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic bool repipe;
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __do_read(int fd, void *buf, int size)
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int rsize = size;
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (size) {
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		int ret = read(fd, buf, size);
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (ret <= 0)
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return -1;
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (repipe) {
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			int retw = write(STDOUT_FILENO, buf, ret);
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (retw <= 0 || retw != ret) {
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				pr_debug("repiping input file");
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				return -1;
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			}
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		size -= ret;
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		buf += ret;
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rsize;
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int do_read(void *data, int size)
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int r;
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	r = __do_read(input_fd, data, size);
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (r <= 0) {
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("reading input file (size expected=%d received=%d)",
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 size, r);
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	trace_data_size += r;
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return r;
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* If it fails, the next read will report it */
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void skip(int size)
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char buf[BUFSIZ];
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int r;
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (size) {
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		r = size > BUFSIZ ? BUFSIZ : size;
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		do_read(buf, r);
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		size -= r;
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic unsigned int read4(struct pevent *pevent)
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int data;
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(&data, 4) < 0)
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return 0;
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return __data2host4(pevent, data);
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic unsigned long long read8(struct pevent *pevent)
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long data;
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(&data, 8) < 0)
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return 0;
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return __data2host8(pevent, data);
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic char *read_string(void)
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char buf[BUFSIZ];
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *str = NULL;
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int size = 0;
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	off_t r;
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char c;
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (;;) {
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		r = read(input_fd, &c, 1);
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (r < 0) {
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			pr_debug("reading input file");
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			goto out;
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!r) {
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			pr_debug("no data");
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			goto out;
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (repipe) {
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			int retw = write(STDOUT_FILENO, &c, 1);
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (retw <= 0 || retw != r) {
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				pr_debug("repiping input file string");
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				goto out;
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			}
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		buf[size++] = c;
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!c)
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			break;
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	trace_data_size += size;
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	str = malloc(size);
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (str)
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		memcpy(str, buf, size);
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout:
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return str;
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_proc_kallsyms(struct pevent *pevent)
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int size;
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *buf;
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	size = read4(pevent);
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!size)
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return 0;
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	buf = malloc(size + 1);
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (buf == NULL)
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, size) < 0) {
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		free(buf);
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	buf[size] = '\0';
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	parse_proc_kallsyms(pevent, buf, size);
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(buf);
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_ftrace_printk(struct pevent *pevent)
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int size;
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *buf;
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* it can have 0 size */
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	size = read4(pevent);
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!size)
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return 0;
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	buf = malloc(size);
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (buf == NULL)
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, size) < 0) {
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		free(buf);
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	parse_ftrace_printk(pevent, buf, size);
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(buf);
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_header_files(struct pevent *pevent)
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long size;
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *header_page;
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char buf[BUFSIZ];
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int ret = 0;
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, 12) < 0)
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (memcmp(buf, "header_page", 12) != 0) {
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("did not read header page");
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	size = read8(pevent);
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	header_page = malloc(size);
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (header_page == NULL)
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(header_page, size) < 0) {
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("did not read header page");
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		free(header_page);
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!pevent_parse_header_page(pevent, header_page, size,
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				      pevent_get_long_size(pevent))) {
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		/*
242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		 * The commit field in the page is of type long,
243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		 * use that instead, since it represents the kernel.
244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		 */
245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pevent_set_long_size(pevent, pevent->header_page_size_size);
246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(header_page);
248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, 13) < 0)
250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (memcmp(buf, "header_event", 13) != 0) {
253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("did not read header event");
254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	size = read8(pevent);
258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	skip(size);
259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return ret;
261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_ftrace_file(struct pevent *pevent, unsigned long long size)
264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *buf;
266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	buf = malloc(size);
268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (buf == NULL)
269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, size) < 0) {
272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		free(buf);
273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	parse_ftrace_file(pevent, buf, size);
277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(buf);
278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_event_file(struct pevent *pevent, char *sys,
282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			    unsigned long long size)
283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *buf;
285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	buf = malloc(size);
287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (buf == NULL)
288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, size) < 0) {
291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		free(buf);
292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	parse_event_file(pevent, buf, size, sys);
296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(buf);
297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_ftrace_files(struct pevent *pevent)
301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long size;
303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int count;
304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int i;
305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int ret;
306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	count = read4(pevent);
308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (i = 0; i < count; i++) {
310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		size = read8(pevent);
311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		ret = read_ftrace_file(pevent, size);
312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (ret)
313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return ret;
314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_event_files(struct pevent *pevent)
319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long size;
321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *sys;
322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int systems;
323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int count;
324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int i,x;
325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int ret;
326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	systems = read4(pevent);
328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (i = 0; i < systems; i++) {
330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		sys = read_string();
331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (sys == NULL)
332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return -1;
333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		count = read4(pevent);
335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		for (x=0; x < count; x++) {
337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			size = read8(pevent);
338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			ret = read_event_file(pevent, sys, size);
339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (ret)
340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				return ret;
341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char buf[BUFSIZ];
349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char test[] = { 23, 8, 68 };
350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *version;
351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int show_version = 0;
352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int show_funcs = 0;
353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int show_printk = 0;
354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ssize_t size = -1;
355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int file_bigendian;
356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int host_bigendian;
357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int file_long_size;
358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int file_page_size;
359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent *pevent;
360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int err;
361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	*ppevent = NULL;
363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	repipe = __repipe;
365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	input_fd = fd;
366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, 3) < 0)
368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (memcmp(buf, test, 3) != 0) {
370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("no trace data in the file");
371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, 7) < 0)
375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (memcmp(buf, "tracing", 7) != 0) {
377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("not a trace file (missing 'tracing' tag)");
378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	version = read_string();
382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (version == NULL)
383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (show_version)
385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		printf("version = %s\n", version);
386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	free(version);
387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, 1) < 0)
389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	file_bigendian = buf[0];
391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	host_bigendian = bigendian();
392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent = read_trace_init(file_bigendian, host_bigendian);
394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (pevent == NULL) {
395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("read_trace_init failed");
396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (do_read(buf, 1) < 0)
400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	file_long_size = buf[0];
402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	file_page_size = read4(pevent);
404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!file_page_size)
405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent_set_long_size(pevent, file_long_size);
408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent_set_page_size(pevent, file_page_size);
409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = read_header_files(pevent);
411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err)
412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = read_ftrace_files(pevent);
414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err)
415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = read_event_files(pevent);
417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err)
418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = read_proc_kallsyms(pevent);
420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err)
421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	err = read_ftrace_printk(pevent);
423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (err)
424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		goto out;
425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	size = trace_data_size;
427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	repipe = false;
428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (show_funcs) {
430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pevent_print_funcs(pevent);
431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	} else if (show_printk) {
432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pevent_print_printk(pevent);
433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	*ppevent = pevent;
436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent = NULL;
437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout:
439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (pevent)
440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pevent_free(pevent);
441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return size;
442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
443