xref: /aosp_15_r20/external/trace-cmd/tracecmd/trace-dump.c (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
1*58e6ee5fSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker  * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker  *
5*58e6ee5fSAndroid Build Coastguard Worker  * Updates:
6*58e6ee5fSAndroid Build Coastguard Worker  * Copyright (C) 2019, VMware, Tzvetomir Stoyanov <[email protected]>
7*58e6ee5fSAndroid Build Coastguard Worker  */
8*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
9*58e6ee5fSAndroid Build Coastguard Worker #include <unistd.h>
10*58e6ee5fSAndroid Build Coastguard Worker #include <getopt.h>
11*58e6ee5fSAndroid Build Coastguard Worker #include <sys/stat.h>
12*58e6ee5fSAndroid Build Coastguard Worker #include <fcntl.h>
13*58e6ee5fSAndroid Build Coastguard Worker #include <errno.h>
14*58e6ee5fSAndroid Build Coastguard Worker 
15*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
16*58e6ee5fSAndroid Build Coastguard Worker 
17*58e6ee5fSAndroid Build Coastguard Worker #define TRACING_STR	"tracing"
18*58e6ee5fSAndroid Build Coastguard Worker #define HEAD_PAGE_STR	"header_page"
19*58e6ee5fSAndroid Build Coastguard Worker #define HEAD_PAGE_EVENT	"header_event"
20*58e6ee5fSAndroid Build Coastguard Worker #define HEAD_OPTIONS	"options  "
21*58e6ee5fSAndroid Build Coastguard Worker #define HEAD_LATENCY	"latency  "
22*58e6ee5fSAndroid Build Coastguard Worker #define HEAD_FLYRECORD	"flyrecord"
23*58e6ee5fSAndroid Build Coastguard Worker 
24*58e6ee5fSAndroid Build Coastguard Worker #define DUMP_SIZE	1024
25*58e6ee5fSAndroid Build Coastguard Worker 
26*58e6ee5fSAndroid Build Coastguard Worker static struct tep_handle *tep;
27*58e6ee5fSAndroid Build Coastguard Worker static unsigned int trace_cpus;
28*58e6ee5fSAndroid Build Coastguard Worker static int has_clock;
29*58e6ee5fSAndroid Build Coastguard Worker static unsigned long file_version;
30*58e6ee5fSAndroid Build Coastguard Worker static bool	read_compress;
31*58e6ee5fSAndroid Build Coastguard Worker static struct tracecmd_compression *compress;
32*58e6ee5fSAndroid Build Coastguard Worker static char *meta_strings;
33*58e6ee5fSAndroid Build Coastguard Worker static int meta_strings_size;
34*58e6ee5fSAndroid Build Coastguard Worker 
35*58e6ee5fSAndroid Build Coastguard Worker enum dump_items {
36*58e6ee5fSAndroid Build Coastguard Worker 	SUMMARY		= (1 << 0),
37*58e6ee5fSAndroid Build Coastguard Worker 	HEAD_PAGE	= (1 << 1),
38*58e6ee5fSAndroid Build Coastguard Worker 	HEAD_EVENT	= (1 << 2),
39*58e6ee5fSAndroid Build Coastguard Worker 	FTRACE_FORMAT	= (1 << 3),
40*58e6ee5fSAndroid Build Coastguard Worker 	EVENT_SYSTEMS	= (1 << 4),
41*58e6ee5fSAndroid Build Coastguard Worker 	EVENT_FORMAT	= (1 << 5),
42*58e6ee5fSAndroid Build Coastguard Worker 	KALLSYMS	= (1 << 6),
43*58e6ee5fSAndroid Build Coastguard Worker 	TRACE_PRINTK	= (1 << 7),
44*58e6ee5fSAndroid Build Coastguard Worker 	CMDLINES	= (1 << 8),
45*58e6ee5fSAndroid Build Coastguard Worker 	OPTIONS		= (1 << 9),
46*58e6ee5fSAndroid Build Coastguard Worker 	FLYRECORD	= (1 << 10),
47*58e6ee5fSAndroid Build Coastguard Worker 	CLOCK		= (1 << 11),
48*58e6ee5fSAndroid Build Coastguard Worker 	SECTIONS	= (1 << 12),
49*58e6ee5fSAndroid Build Coastguard Worker 	STRINGS		= (1 << 13),
50*58e6ee5fSAndroid Build Coastguard Worker };
51*58e6ee5fSAndroid Build Coastguard Worker 
52*58e6ee5fSAndroid Build Coastguard Worker struct file_section {
53*58e6ee5fSAndroid Build Coastguard Worker 	int id;
54*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset;
55*58e6ee5fSAndroid Build Coastguard Worker 	struct file_section *next;
56*58e6ee5fSAndroid Build Coastguard Worker 	enum dump_items verbosity;
57*58e6ee5fSAndroid Build Coastguard Worker };
58*58e6ee5fSAndroid Build Coastguard Worker 
59*58e6ee5fSAndroid Build Coastguard Worker static struct file_section *sections;
60*58e6ee5fSAndroid Build Coastguard Worker 
61*58e6ee5fSAndroid Build Coastguard Worker enum dump_items verbosity;
62*58e6ee5fSAndroid Build Coastguard Worker 
63*58e6ee5fSAndroid Build Coastguard Worker #define DUMP_CHECK(X) ((X) & verbosity)
64*58e6ee5fSAndroid Build Coastguard Worker 
65*58e6ee5fSAndroid Build Coastguard Worker #define do_print(ids, fmt, ...)					\
66*58e6ee5fSAndroid Build Coastguard Worker 	do {							\
67*58e6ee5fSAndroid Build Coastguard Worker 		if (!(ids) || DUMP_CHECK(ids))			\
68*58e6ee5fSAndroid Build Coastguard Worker 			tracecmd_plog(fmt, ##__VA_ARGS__);	\
69*58e6ee5fSAndroid Build Coastguard Worker 	} while (0)
70*58e6ee5fSAndroid Build Coastguard Worker 
read_fd(int fd,char * dst,int len)71*58e6ee5fSAndroid Build Coastguard Worker static int read_fd(int fd, char *dst, int len)
72*58e6ee5fSAndroid Build Coastguard Worker {
73*58e6ee5fSAndroid Build Coastguard Worker 	size_t size = 0;
74*58e6ee5fSAndroid Build Coastguard Worker 	int r;
75*58e6ee5fSAndroid Build Coastguard Worker 
76*58e6ee5fSAndroid Build Coastguard Worker 	do {
77*58e6ee5fSAndroid Build Coastguard Worker 		r = read(fd, dst+size, len);
78*58e6ee5fSAndroid Build Coastguard Worker 		if (r > 0) {
79*58e6ee5fSAndroid Build Coastguard Worker 			size += r;
80*58e6ee5fSAndroid Build Coastguard Worker 			len -= r;
81*58e6ee5fSAndroid Build Coastguard Worker 		} else
82*58e6ee5fSAndroid Build Coastguard Worker 			break;
83*58e6ee5fSAndroid Build Coastguard Worker 	} while (r > 0);
84*58e6ee5fSAndroid Build Coastguard Worker 
85*58e6ee5fSAndroid Build Coastguard Worker 	if (len)
86*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
87*58e6ee5fSAndroid Build Coastguard Worker 	return size;
88*58e6ee5fSAndroid Build Coastguard Worker }
89*58e6ee5fSAndroid Build Coastguard Worker 
read_compressed(int fd,char * dst,int len)90*58e6ee5fSAndroid Build Coastguard Worker static int read_compressed(int fd, char *dst, int len)
91*58e6ee5fSAndroid Build Coastguard Worker {
92*58e6ee5fSAndroid Build Coastguard Worker 
93*58e6ee5fSAndroid Build Coastguard Worker 	if (read_compress)
94*58e6ee5fSAndroid Build Coastguard Worker 		return tracecmd_compress_buffer_read(compress, dst, len);
95*58e6ee5fSAndroid Build Coastguard Worker 
96*58e6ee5fSAndroid Build Coastguard Worker 	return read_fd(fd, dst, len);
97*58e6ee5fSAndroid Build Coastguard Worker }
98*58e6ee5fSAndroid Build Coastguard Worker 
do_lseek(int fd,int offset,int whence)99*58e6ee5fSAndroid Build Coastguard Worker static int do_lseek(int fd, int offset, int whence)
100*58e6ee5fSAndroid Build Coastguard Worker {
101*58e6ee5fSAndroid Build Coastguard Worker 	if (read_compress)
102*58e6ee5fSAndroid Build Coastguard Worker 		return tracecmd_compress_lseek(compress, offset, whence);
103*58e6ee5fSAndroid Build Coastguard Worker 
104*58e6ee5fSAndroid Build Coastguard Worker 	return lseek64(fd, offset, whence);
105*58e6ee5fSAndroid Build Coastguard Worker }
106*58e6ee5fSAndroid Build Coastguard Worker 
read_file_string(int fd,char * dst,int len)107*58e6ee5fSAndroid Build Coastguard Worker static int read_file_string(int fd, char *dst, int len)
108*58e6ee5fSAndroid Build Coastguard Worker {
109*58e6ee5fSAndroid Build Coastguard Worker 	size_t size = 0;
110*58e6ee5fSAndroid Build Coastguard Worker 	int r;
111*58e6ee5fSAndroid Build Coastguard Worker 
112*58e6ee5fSAndroid Build Coastguard Worker 	do {
113*58e6ee5fSAndroid Build Coastguard Worker 		r = read_compressed(fd, dst+size, 1);
114*58e6ee5fSAndroid Build Coastguard Worker 		if (r > 0) {
115*58e6ee5fSAndroid Build Coastguard Worker 			size++;
116*58e6ee5fSAndroid Build Coastguard Worker 			len--;
117*58e6ee5fSAndroid Build Coastguard Worker 		} else
118*58e6ee5fSAndroid Build Coastguard Worker 			break;
119*58e6ee5fSAndroid Build Coastguard Worker 		if (!dst[size - 1])
120*58e6ee5fSAndroid Build Coastguard Worker 			break;
121*58e6ee5fSAndroid Build Coastguard Worker 	} while (r > 0 && len);
122*58e6ee5fSAndroid Build Coastguard Worker 
123*58e6ee5fSAndroid Build Coastguard Worker 	if (!size || dst[size - 1])
124*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
125*58e6ee5fSAndroid Build Coastguard Worker 	return 0;
126*58e6ee5fSAndroid Build Coastguard Worker }
127*58e6ee5fSAndroid Build Coastguard Worker 
read_file_bytes(int fd,char * dst,int len)128*58e6ee5fSAndroid Build Coastguard Worker static int read_file_bytes(int fd, char *dst, int len)
129*58e6ee5fSAndroid Build Coastguard Worker {
130*58e6ee5fSAndroid Build Coastguard Worker 	int ret;
131*58e6ee5fSAndroid Build Coastguard Worker 
132*58e6ee5fSAndroid Build Coastguard Worker 	ret = read_compressed(fd, dst, len);
133*58e6ee5fSAndroid Build Coastguard Worker 	return ret < 0 ? ret : 0;
134*58e6ee5fSAndroid Build Coastguard Worker }
135*58e6ee5fSAndroid Build Coastguard Worker 
read_dump_string(int fd,int size,enum dump_items id)136*58e6ee5fSAndroid Build Coastguard Worker static void read_dump_string(int fd, int size, enum dump_items id)
137*58e6ee5fSAndroid Build Coastguard Worker {
138*58e6ee5fSAndroid Build Coastguard Worker 	char buf[DUMP_SIZE];
139*58e6ee5fSAndroid Build Coastguard Worker 	int lsize;
140*58e6ee5fSAndroid Build Coastguard Worker 
141*58e6ee5fSAndroid Build Coastguard Worker 	while (size) {
142*58e6ee5fSAndroid Build Coastguard Worker 		lsize = (size < DUMP_SIZE) ? size : DUMP_SIZE - 1;
143*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_bytes(fd, buf, lsize))
144*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read %d bytes", lsize);
145*58e6ee5fSAndroid Build Coastguard Worker 		buf[lsize] = 0;
146*58e6ee5fSAndroid Build Coastguard Worker 		do_print(id, "%s", buf);
147*58e6ee5fSAndroid Build Coastguard Worker 		size -= lsize;
148*58e6ee5fSAndroid Build Coastguard Worker 	}
149*58e6ee5fSAndroid Build Coastguard Worker 
150*58e6ee5fSAndroid Build Coastguard Worker 	do_print(id, "\n");
151*58e6ee5fSAndroid Build Coastguard Worker }
152*58e6ee5fSAndroid Build Coastguard Worker 
read_file_number(int fd,void * digit,int size)153*58e6ee5fSAndroid Build Coastguard Worker static int read_file_number(int fd, void *digit, int size)
154*58e6ee5fSAndroid Build Coastguard Worker {
155*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long val;
156*58e6ee5fSAndroid Build Coastguard Worker 	char buf[8];
157*58e6ee5fSAndroid Build Coastguard Worker 
158*58e6ee5fSAndroid Build Coastguard Worker 	if (size > 8)
159*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
160*58e6ee5fSAndroid Build Coastguard Worker 
161*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, size))
162*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
163*58e6ee5fSAndroid Build Coastguard Worker 
164*58e6ee5fSAndroid Build Coastguard Worker 	val = tep_read_number(tep, buf, size);
165*58e6ee5fSAndroid Build Coastguard Worker 	switch (size) {
166*58e6ee5fSAndroid Build Coastguard Worker 	case 1:
167*58e6ee5fSAndroid Build Coastguard Worker 		*((char *)digit) = val;
168*58e6ee5fSAndroid Build Coastguard Worker 		break;
169*58e6ee5fSAndroid Build Coastguard Worker 	case 2:
170*58e6ee5fSAndroid Build Coastguard Worker 		*((unsigned short *)digit) = val;
171*58e6ee5fSAndroid Build Coastguard Worker 		break;
172*58e6ee5fSAndroid Build Coastguard Worker 	case 4:
173*58e6ee5fSAndroid Build Coastguard Worker 		*((unsigned int *)digit) = val;
174*58e6ee5fSAndroid Build Coastguard Worker 		break;
175*58e6ee5fSAndroid Build Coastguard Worker 	case 8:
176*58e6ee5fSAndroid Build Coastguard Worker 		*((unsigned long long *)digit) = val;
177*58e6ee5fSAndroid Build Coastguard Worker 		break;
178*58e6ee5fSAndroid Build Coastguard Worker 	default:
179*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
180*58e6ee5fSAndroid Build Coastguard Worker 	}
181*58e6ee5fSAndroid Build Coastguard Worker 
182*58e6ee5fSAndroid Build Coastguard Worker 	return 0;
183*58e6ee5fSAndroid Build Coastguard Worker }
184*58e6ee5fSAndroid Build Coastguard Worker 
get_metadata_string(int offset)185*58e6ee5fSAndroid Build Coastguard Worker static const char *get_metadata_string(int offset)
186*58e6ee5fSAndroid Build Coastguard Worker {
187*58e6ee5fSAndroid Build Coastguard Worker 	if (!meta_strings || offset < 0 || meta_strings_size <= offset)
188*58e6ee5fSAndroid Build Coastguard Worker 		return NULL;
189*58e6ee5fSAndroid Build Coastguard Worker 
190*58e6ee5fSAndroid Build Coastguard Worker 	return meta_strings + offset;
191*58e6ee5fSAndroid Build Coastguard Worker }
192*58e6ee5fSAndroid Build Coastguard Worker 
dump_initial_format(int fd)193*58e6ee5fSAndroid Build Coastguard Worker static void dump_initial_format(int fd)
194*58e6ee5fSAndroid Build Coastguard Worker {
195*58e6ee5fSAndroid Build Coastguard Worker 	char magic[] = TRACECMD_MAGIC;
196*58e6ee5fSAndroid Build Coastguard Worker 	char buf[DUMP_SIZE];
197*58e6ee5fSAndroid Build Coastguard Worker 	int val4;
198*58e6ee5fSAndroid Build Coastguard Worker 
199*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t[Initial format]\n");
200*58e6ee5fSAndroid Build Coastguard Worker 
201*58e6ee5fSAndroid Build Coastguard Worker 	/* check initial bytes */
202*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, sizeof(magic)))
203*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read %zu bytes magic", sizeof(magic));
204*58e6ee5fSAndroid Build Coastguard Worker 	if (memcmp(buf, magic, sizeof(magic)) != 0)
205*58e6ee5fSAndroid Build Coastguard Worker 		die("wrong file magic");
206*58e6ee5fSAndroid Build Coastguard Worker 
207*58e6ee5fSAndroid Build Coastguard Worker 	/* check initial tracing string */
208*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, strlen(TRACING_STR)))
209*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read %zu bytes tracing string", strlen(TRACING_STR));
210*58e6ee5fSAndroid Build Coastguard Worker 	buf[strlen(TRACING_STR)] = 0;
211*58e6ee5fSAndroid Build Coastguard Worker 	if (strncmp(buf, TRACING_STR, strlen(TRACING_STR)) != 0)
212*58e6ee5fSAndroid Build Coastguard Worker 		die("wrong tracing string: %s", buf);
213*58e6ee5fSAndroid Build Coastguard Worker 
214*58e6ee5fSAndroid Build Coastguard Worker 	/* get file version */
215*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_string(fd, buf, DUMP_SIZE))
216*58e6ee5fSAndroid Build Coastguard Worker 		die("no version string");
217*58e6ee5fSAndroid Build Coastguard Worker 
218*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t\t%s\t[Version]\n", buf);
219*58e6ee5fSAndroid Build Coastguard Worker 	file_version = strtol(buf, NULL, 10);
220*58e6ee5fSAndroid Build Coastguard Worker 	if (!file_version && errno)
221*58e6ee5fSAndroid Build Coastguard Worker 		die("Invalid file version string %s", buf);
222*58e6ee5fSAndroid Build Coastguard Worker 	if (!tracecmd_is_version_supported(file_version))
223*58e6ee5fSAndroid Build Coastguard Worker 		die("Unsupported file version %lu", file_version);
224*58e6ee5fSAndroid Build Coastguard Worker 
225*58e6ee5fSAndroid Build Coastguard Worker 	/* get file endianness*/
226*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, 1))
227*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read file endianness");
228*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t\t%d\t[%s endian]\n", buf[0], buf[0]?"Big":"Little");
229*58e6ee5fSAndroid Build Coastguard Worker 
230*58e6ee5fSAndroid Build Coastguard Worker 	tep_set_file_bigendian(tep, buf[0]);
231*58e6ee5fSAndroid Build Coastguard Worker 	tep_set_local_bigendian(tep, tracecmd_host_bigendian());
232*58e6ee5fSAndroid Build Coastguard Worker 
233*58e6ee5fSAndroid Build Coastguard Worker 	/* get file bytes per long*/
234*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, 1))
235*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read file bytes per long");
236*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t\t%d\t[Bytes in a long]\n", buf[0]);
237*58e6ee5fSAndroid Build Coastguard Worker 
238*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &val4, 4))
239*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read file page size");
240*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t\t%d\t[Page size, bytes]\n", val4);
241*58e6ee5fSAndroid Build Coastguard Worker }
242*58e6ee5fSAndroid Build Coastguard Worker 
dump_compress(int fd)243*58e6ee5fSAndroid Build Coastguard Worker static void dump_compress(int fd)
244*58e6ee5fSAndroid Build Coastguard Worker {
245*58e6ee5fSAndroid Build Coastguard Worker 	char zname[DUMP_SIZE];
246*58e6ee5fSAndroid Build Coastguard Worker 	char zver[DUMP_SIZE];
247*58e6ee5fSAndroid Build Coastguard Worker 
248*58e6ee5fSAndroid Build Coastguard Worker 	if (file_version < FILE_VERSION_COMPRESSION)
249*58e6ee5fSAndroid Build Coastguard Worker 		return;
250*58e6ee5fSAndroid Build Coastguard Worker 
251*58e6ee5fSAndroid Build Coastguard Worker 	/* get compression header */
252*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_string(fd, zname, DUMP_SIZE))
253*58e6ee5fSAndroid Build Coastguard Worker 		die("no compression header");
254*58e6ee5fSAndroid Build Coastguard Worker 
255*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_string(fd, zver, DUMP_SIZE))
256*58e6ee5fSAndroid Build Coastguard Worker 		die("no compression version");
257*58e6ee5fSAndroid Build Coastguard Worker 
258*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY), "\t\t%s\t[Compression algorithm]\n", zname);
259*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY), "\t\t%s\t[Compression version]\n", zver);
260*58e6ee5fSAndroid Build Coastguard Worker 
261*58e6ee5fSAndroid Build Coastguard Worker 	if (strcmp(zname, "none")) {
262*58e6ee5fSAndroid Build Coastguard Worker 		compress = tracecmd_compress_alloc(zname, zver, fd, tep, NULL);
263*58e6ee5fSAndroid Build Coastguard Worker 		if (!compress)
264*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot uncompress the file");
265*58e6ee5fSAndroid Build Coastguard Worker 	}
266*58e6ee5fSAndroid Build Coastguard Worker }
267*58e6ee5fSAndroid Build Coastguard Worker 
dump_header_page(int fd)268*58e6ee5fSAndroid Build Coastguard Worker static void dump_header_page(int fd)
269*58e6ee5fSAndroid Build Coastguard Worker {
270*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long size;
271*58e6ee5fSAndroid Build Coastguard Worker 	char buf[DUMP_SIZE];
272*58e6ee5fSAndroid Build Coastguard Worker 
273*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | HEAD_PAGE), "\t[Header page, ");
274*58e6ee5fSAndroid Build Coastguard Worker 
275*58e6ee5fSAndroid Build Coastguard Worker 	/* check header string */
276*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, strlen(HEAD_PAGE_STR) + 1))
277*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read %zu bytes header string", strlen(HEAD_PAGE_STR));
278*58e6ee5fSAndroid Build Coastguard Worker 	if (strncmp(buf, HEAD_PAGE_STR, strlen(HEAD_PAGE_STR)) != 0)
279*58e6ee5fSAndroid Build Coastguard Worker 		die("wrong header string: %s", buf);
280*58e6ee5fSAndroid Build Coastguard Worker 
281*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 8))
282*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the size of the page header information");
283*58e6ee5fSAndroid Build Coastguard Worker 
284*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | HEAD_PAGE), "%lld bytes]\n", size);
285*58e6ee5fSAndroid Build Coastguard Worker 
286*58e6ee5fSAndroid Build Coastguard Worker 	read_dump_string(fd, size, HEAD_PAGE);
287*58e6ee5fSAndroid Build Coastguard Worker }
288*58e6ee5fSAndroid Build Coastguard Worker 
dump_header_event(int fd)289*58e6ee5fSAndroid Build Coastguard Worker static void dump_header_event(int fd)
290*58e6ee5fSAndroid Build Coastguard Worker {
291*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long size;
292*58e6ee5fSAndroid Build Coastguard Worker 	char buf[DUMP_SIZE];
293*58e6ee5fSAndroid Build Coastguard Worker 
294*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | HEAD_EVENT), "\t[Header event, ");
295*58e6ee5fSAndroid Build Coastguard Worker 
296*58e6ee5fSAndroid Build Coastguard Worker 	/* check header string */
297*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, strlen(HEAD_PAGE_EVENT) + 1))
298*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read %zu bytes header string", strlen(HEAD_PAGE_EVENT));
299*58e6ee5fSAndroid Build Coastguard Worker 	if (strncmp(buf, HEAD_PAGE_EVENT, strlen(HEAD_PAGE_EVENT)) != 0)
300*58e6ee5fSAndroid Build Coastguard Worker 		die("wrong header string: %s", buf);
301*58e6ee5fSAndroid Build Coastguard Worker 
302*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 8))
303*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the size of the page header information");
304*58e6ee5fSAndroid Build Coastguard Worker 
305*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | HEAD_EVENT), "%lld bytes]\n", size);
306*58e6ee5fSAndroid Build Coastguard Worker 
307*58e6ee5fSAndroid Build Coastguard Worker 	read_dump_string(fd, size, HEAD_EVENT);
308*58e6ee5fSAndroid Build Coastguard Worker }
309*58e6ee5fSAndroid Build Coastguard Worker 
uncompress_reset(void)310*58e6ee5fSAndroid Build Coastguard Worker static void uncompress_reset(void)
311*58e6ee5fSAndroid Build Coastguard Worker {
312*58e6ee5fSAndroid Build Coastguard Worker 	if (compress && file_version >= FILE_VERSION_COMPRESSION) {
313*58e6ee5fSAndroid Build Coastguard Worker 		read_compress = false;
314*58e6ee5fSAndroid Build Coastguard Worker 		tracecmd_compress_reset(compress);
315*58e6ee5fSAndroid Build Coastguard Worker 	}
316*58e6ee5fSAndroid Build Coastguard Worker }
317*58e6ee5fSAndroid Build Coastguard Worker 
uncompress_block(void)318*58e6ee5fSAndroid Build Coastguard Worker static int uncompress_block(void)
319*58e6ee5fSAndroid Build Coastguard Worker {
320*58e6ee5fSAndroid Build Coastguard Worker 	int ret = 0;
321*58e6ee5fSAndroid Build Coastguard Worker 
322*58e6ee5fSAndroid Build Coastguard Worker 	if (compress && file_version >= FILE_VERSION_COMPRESSION) {
323*58e6ee5fSAndroid Build Coastguard Worker 		ret = tracecmd_uncompress_block(compress);
324*58e6ee5fSAndroid Build Coastguard Worker 		if (!ret)
325*58e6ee5fSAndroid Build Coastguard Worker 			read_compress = true;
326*58e6ee5fSAndroid Build Coastguard Worker 
327*58e6ee5fSAndroid Build Coastguard Worker 	}
328*58e6ee5fSAndroid Build Coastguard Worker 
329*58e6ee5fSAndroid Build Coastguard Worker 	return ret;
330*58e6ee5fSAndroid Build Coastguard Worker }
331*58e6ee5fSAndroid Build Coastguard Worker 
dump_ftrace_events_format(int fd)332*58e6ee5fSAndroid Build Coastguard Worker static void dump_ftrace_events_format(int fd)
333*58e6ee5fSAndroid Build Coastguard Worker {
334*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long size;
335*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int count;
336*58e6ee5fSAndroid Build Coastguard Worker 
337*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | FTRACE_FORMAT), "\t[Ftrace format, ");
338*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &count, 4))
339*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the count of the ftrace events");
340*58e6ee5fSAndroid Build Coastguard Worker 
341*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | FTRACE_FORMAT), "%d events]\n", count);
342*58e6ee5fSAndroid Build Coastguard Worker 
343*58e6ee5fSAndroid Build Coastguard Worker 	while (count) {
344*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &size, 8))
345*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the size of the %d ftrace event", count);
346*58e6ee5fSAndroid Build Coastguard Worker 		read_dump_string(fd, size, FTRACE_FORMAT);
347*58e6ee5fSAndroid Build Coastguard Worker 		count--;
348*58e6ee5fSAndroid Build Coastguard Worker 	}
349*58e6ee5fSAndroid Build Coastguard Worker }
350*58e6ee5fSAndroid Build Coastguard Worker 
dump_events_format(int fd)351*58e6ee5fSAndroid Build Coastguard Worker static void dump_events_format(int fd)
352*58e6ee5fSAndroid Build Coastguard Worker {
353*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long size;
354*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int systems;
355*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int events;
356*58e6ee5fSAndroid Build Coastguard Worker 	char buf[DUMP_SIZE];
357*58e6ee5fSAndroid Build Coastguard Worker 
358*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | EVENT_FORMAT | EVENT_SYSTEMS), "\t[Events format, ");
359*58e6ee5fSAndroid Build Coastguard Worker 
360*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &systems, 4))
361*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the count of the event systems");
362*58e6ee5fSAndroid Build Coastguard Worker 
363*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | EVENT_FORMAT | EVENT_SYSTEMS), "%d systems]\n", systems);
364*58e6ee5fSAndroid Build Coastguard Worker 
365*58e6ee5fSAndroid Build Coastguard Worker 	while (systems) {
366*58e6ee5fSAndroid Build Coastguard Worker 
367*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_string(fd, buf, DUMP_SIZE))
368*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the name of the %dth system", systems);
369*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &events, 4))
370*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the count of the events in system %s",
371*58e6ee5fSAndroid Build Coastguard Worker 			     buf);
372*58e6ee5fSAndroid Build Coastguard Worker 		do_print(EVENT_SYSTEMS, "\t\t%s %d [system, events]\n", buf, events);
373*58e6ee5fSAndroid Build Coastguard Worker 		while (events) {
374*58e6ee5fSAndroid Build Coastguard Worker 			if (read_file_number(fd, &size, 8))
375*58e6ee5fSAndroid Build Coastguard Worker 				die("cannot read the format size of the %dth event from system %s",
376*58e6ee5fSAndroid Build Coastguard Worker 				    events, buf);
377*58e6ee5fSAndroid Build Coastguard Worker 			read_dump_string(fd, size, EVENT_FORMAT);
378*58e6ee5fSAndroid Build Coastguard Worker 			events--;
379*58e6ee5fSAndroid Build Coastguard Worker 		}
380*58e6ee5fSAndroid Build Coastguard Worker 		systems--;
381*58e6ee5fSAndroid Build Coastguard Worker 	}
382*58e6ee5fSAndroid Build Coastguard Worker }
383*58e6ee5fSAndroid Build Coastguard Worker 
dump_kallsyms(int fd)384*58e6ee5fSAndroid Build Coastguard Worker static void dump_kallsyms(int fd)
385*58e6ee5fSAndroid Build Coastguard Worker {
386*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int size;
387*58e6ee5fSAndroid Build Coastguard Worker 
388*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | KALLSYMS), "\t[Kallsyms, ");
389*58e6ee5fSAndroid Build Coastguard Worker 
390*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 4))
391*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the size of the kallsyms");
392*58e6ee5fSAndroid Build Coastguard Worker 
393*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | KALLSYMS), "%d bytes]\n", size);
394*58e6ee5fSAndroid Build Coastguard Worker 
395*58e6ee5fSAndroid Build Coastguard Worker 	read_dump_string(fd, size, KALLSYMS);
396*58e6ee5fSAndroid Build Coastguard Worker }
397*58e6ee5fSAndroid Build Coastguard Worker 
dump_printk(int fd)398*58e6ee5fSAndroid Build Coastguard Worker static void dump_printk(int fd)
399*58e6ee5fSAndroid Build Coastguard Worker {
400*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int size;
401*58e6ee5fSAndroid Build Coastguard Worker 
402*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | TRACE_PRINTK), "\t[Trace printk, ");
403*58e6ee5fSAndroid Build Coastguard Worker 
404*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 4))
405*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the size of the trace printk");
406*58e6ee5fSAndroid Build Coastguard Worker 
407*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | TRACE_PRINTK), "%d bytes]\n", size);
408*58e6ee5fSAndroid Build Coastguard Worker 
409*58e6ee5fSAndroid Build Coastguard Worker 	read_dump_string(fd, size, TRACE_PRINTK);
410*58e6ee5fSAndroid Build Coastguard Worker }
411*58e6ee5fSAndroid Build Coastguard Worker 
dump_cmdlines(int fd)412*58e6ee5fSAndroid Build Coastguard Worker static void dump_cmdlines(int fd)
413*58e6ee5fSAndroid Build Coastguard Worker {
414*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long size;
415*58e6ee5fSAndroid Build Coastguard Worker 
416*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | CMDLINES), "\t[Saved command lines, ");
417*58e6ee5fSAndroid Build Coastguard Worker 
418*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 8))
419*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the size of the saved command lines");
420*58e6ee5fSAndroid Build Coastguard Worker 
421*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | CMDLINES), "%d bytes]\n", size);
422*58e6ee5fSAndroid Build Coastguard Worker 
423*58e6ee5fSAndroid Build Coastguard Worker 	read_dump_string(fd, size, CMDLINES);
424*58e6ee5fSAndroid Build Coastguard Worker }
425*58e6ee5fSAndroid Build Coastguard Worker 
dump_cpus_count(int fd)426*58e6ee5fSAndroid Build Coastguard Worker static void dump_cpus_count(int fd)
427*58e6ee5fSAndroid Build Coastguard Worker {
428*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &trace_cpus, 4))
429*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the cpu count");
430*58e6ee5fSAndroid Build Coastguard Worker 
431*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t%d [CPUs with tracing data]\n", trace_cpus);
432*58e6ee5fSAndroid Build Coastguard Worker }
433*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_string(int fd,int size,char * desc)434*58e6ee5fSAndroid Build Coastguard Worker static void dump_option_string(int fd, int size, char *desc)
435*58e6ee5fSAndroid Build Coastguard Worker {
436*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option %s, %d bytes]\n", desc, size);
437*58e6ee5fSAndroid Build Coastguard Worker 	if (size)
438*58e6ee5fSAndroid Build Coastguard Worker 		read_dump_string(fd, size, OPTIONS);
439*58e6ee5fSAndroid Build Coastguard Worker }
440*58e6ee5fSAndroid Build Coastguard Worker 
dump_section_header(int fd,enum dump_items v,unsigned short * flags)441*58e6ee5fSAndroid Build Coastguard Worker static void dump_section_header(int fd, enum dump_items v, unsigned short *flags)
442*58e6ee5fSAndroid Build Coastguard Worker {
443*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset, size;
444*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short fl;
445*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short id;
446*58e6ee5fSAndroid Build Coastguard Worker 	const char *desc;
447*58e6ee5fSAndroid Build Coastguard Worker 	int desc_id;
448*58e6ee5fSAndroid Build Coastguard Worker 
449*58e6ee5fSAndroid Build Coastguard Worker 	offset = lseek64(fd, 0, SEEK_CUR);
450*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &id, 2))
451*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the section id");
452*58e6ee5fSAndroid Build Coastguard Worker 
453*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &fl, 2))
454*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the section flags");
455*58e6ee5fSAndroid Build Coastguard Worker 
456*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &desc_id, 4))
457*58e6ee5fSAndroid Build Coastguard Worker 		die("no section description");
458*58e6ee5fSAndroid Build Coastguard Worker 
459*58e6ee5fSAndroid Build Coastguard Worker 	desc = get_metadata_string(desc_id);
460*58e6ee5fSAndroid Build Coastguard Worker 	if (!desc)
461*58e6ee5fSAndroid Build Coastguard Worker 		desc = "Unknown";
462*58e6ee5fSAndroid Build Coastguard Worker 
463*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 8))
464*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read section size");
465*58e6ee5fSAndroid Build Coastguard Worker 
466*58e6ee5fSAndroid Build Coastguard Worker 	do_print(v, "\t[Section %d @ %lld: \"%s\", flags 0x%X, %lld bytes]\n",
467*58e6ee5fSAndroid Build Coastguard Worker 		 id, offset, desc, fl, size);
468*58e6ee5fSAndroid Build Coastguard Worker 
469*58e6ee5fSAndroid Build Coastguard Worker 	if (flags)
470*58e6ee5fSAndroid Build Coastguard Worker 		*flags = fl;
471*58e6ee5fSAndroid Build Coastguard Worker }
472*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_buffer(int fd,unsigned short option,int size)473*58e6ee5fSAndroid Build Coastguard Worker static void dump_option_buffer(int fd, unsigned short option, int size)
474*58e6ee5fSAndroid Build Coastguard Worker {
475*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long total_size = 0;
476*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long data_size;
477*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long current;
478*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset;
479*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short flags;
480*58e6ee5fSAndroid Build Coastguard Worker 	char clock[DUMP_SIZE];
481*58e6ee5fSAndroid Build Coastguard Worker 	char name[DUMP_SIZE];
482*58e6ee5fSAndroid Build Coastguard Worker 	int page_size;
483*58e6ee5fSAndroid Build Coastguard Worker 	int cpus = 0;
484*58e6ee5fSAndroid Build Coastguard Worker 	int id;
485*58e6ee5fSAndroid Build Coastguard Worker 	int i;
486*58e6ee5fSAndroid Build Coastguard Worker 
487*58e6ee5fSAndroid Build Coastguard Worker 	if (size < 8)
488*58e6ee5fSAndroid Build Coastguard Worker 		die("broken buffer option with size %d", size);
489*58e6ee5fSAndroid Build Coastguard Worker 
490*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &offset, 8))
491*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the offset of the buffer option");
492*58e6ee5fSAndroid Build Coastguard Worker 
493*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_string(fd, name, DUMP_SIZE))
494*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the name of the buffer option");
495*58e6ee5fSAndroid Build Coastguard Worker 
496*58e6ee5fSAndroid Build Coastguard Worker 	if (file_version < FILE_VERSION_SECTIONS) {
497*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS|FLYRECORD, "\t\t[Option BUFFER, %d bytes]\n", size);
498*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS|FLYRECORD, "%lld [offset]\n", offset);
499*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS|FLYRECORD, "\"%s\" [name]\n", name);
500*58e6ee5fSAndroid Build Coastguard Worker 		return;
501*58e6ee5fSAndroid Build Coastguard Worker 	}
502*58e6ee5fSAndroid Build Coastguard Worker 
503*58e6ee5fSAndroid Build Coastguard Worker 	current = lseek64(fd, 0, SEEK_CUR);
504*58e6ee5fSAndroid Build Coastguard Worker 	if (lseek64(fd, offset, SEEK_SET) == (off_t)-1)
505*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot goto buffer offset %lld", offset);
506*58e6ee5fSAndroid Build Coastguard Worker 
507*58e6ee5fSAndroid Build Coastguard Worker 	dump_section_header(fd, FLYRECORD, &flags);
508*58e6ee5fSAndroid Build Coastguard Worker 
509*58e6ee5fSAndroid Build Coastguard Worker 	if (lseek64(fd, current, SEEK_SET) == (off_t)-1)
510*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot go back to buffer option");
511*58e6ee5fSAndroid Build Coastguard Worker 
512*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS|FLYRECORD, "\t\t[Option BUFFER, %d bytes]\n", size);
513*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS|FLYRECORD, "%lld [offset]\n", offset);
514*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS|FLYRECORD, "\"%s\" [name]\n", name);
515*58e6ee5fSAndroid Build Coastguard Worker 
516*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_string(fd, clock, DUMP_SIZE))
517*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read clock of the buffer option");
518*58e6ee5fSAndroid Build Coastguard Worker 
519*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS|FLYRECORD, "\"%s\" [clock]\n", clock);
520*58e6ee5fSAndroid Build Coastguard Worker 	if (option == TRACECMD_OPTION_BUFFER) {
521*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &page_size, 4))
522*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the page size of the buffer option");
523*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS|FLYRECORD, "%d [Page size, bytes]\n", page_size);
524*58e6ee5fSAndroid Build Coastguard Worker 
525*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &cpus, 4))
526*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the cpu count of the buffer option");
527*58e6ee5fSAndroid Build Coastguard Worker 
528*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS|FLYRECORD, "%d [CPUs]:\n", cpus);
529*58e6ee5fSAndroid Build Coastguard Worker 		for (i = 0; i < cpus; i++) {
530*58e6ee5fSAndroid Build Coastguard Worker 			if (read_file_number(fd, &id, 4))
531*58e6ee5fSAndroid Build Coastguard Worker 				die("cannot read the id of cpu %d from the buffer option", i);
532*58e6ee5fSAndroid Build Coastguard Worker 
533*58e6ee5fSAndroid Build Coastguard Worker 			if (read_file_number(fd, &offset, 8))
534*58e6ee5fSAndroid Build Coastguard Worker 				die("cannot read the offset of cpu %d from the buffer option", i);
535*58e6ee5fSAndroid Build Coastguard Worker 
536*58e6ee5fSAndroid Build Coastguard Worker 			if (read_file_number(fd, &data_size, 8))
537*58e6ee5fSAndroid Build Coastguard Worker 				die("cannot read the data size of cpu %d from the buffer option", i);
538*58e6ee5fSAndroid Build Coastguard Worker 
539*58e6ee5fSAndroid Build Coastguard Worker 			total_size += data_size;
540*58e6ee5fSAndroid Build Coastguard Worker 			do_print(OPTIONS|FLYRECORD, "   %d %lld\t%lld\t[id, data offset and size]\n",
541*58e6ee5fSAndroid Build Coastguard Worker 				 id, offset, data_size);
542*58e6ee5fSAndroid Build Coastguard Worker 		}
543*58e6ee5fSAndroid Build Coastguard Worker 		do_print(SUMMARY, "\t\[buffer \"%s\", \"%s\" clock, %d page size, "
544*58e6ee5fSAndroid Build Coastguard Worker 			 "%d cpus, %lld bytes flyrecord data]\n",
545*58e6ee5fSAndroid Build Coastguard Worker 			 name, clock, page_size, cpus, total_size);
546*58e6ee5fSAndroid Build Coastguard Worker 	} else {
547*58e6ee5fSAndroid Build Coastguard Worker 		do_print(SUMMARY, "\t\[buffer \"%s\", \"%s\" clock, latency data]\n", name, clock);
548*58e6ee5fSAndroid Build Coastguard Worker 	}
549*58e6ee5fSAndroid Build Coastguard Worker 
550*58e6ee5fSAndroid Build Coastguard Worker }
551*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_int(int fd,int size,char * desc)552*58e6ee5fSAndroid Build Coastguard Worker static void dump_option_int(int fd, int size, char *desc)
553*58e6ee5fSAndroid Build Coastguard Worker {
554*58e6ee5fSAndroid Build Coastguard Worker 	int val;
555*58e6ee5fSAndroid Build Coastguard Worker 
556*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option %s, %d bytes]\n", desc, size);
557*58e6ee5fSAndroid Build Coastguard Worker 	read_file_number(fd, &val, size);
558*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "%d\n", val);
559*58e6ee5fSAndroid Build Coastguard Worker }
560*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_xlong(int fd,int size,char * desc)561*58e6ee5fSAndroid Build Coastguard Worker static void dump_option_xlong(int fd, int size, char *desc)
562*58e6ee5fSAndroid Build Coastguard Worker {
563*58e6ee5fSAndroid Build Coastguard Worker 	long long val;
564*58e6ee5fSAndroid Build Coastguard Worker 
565*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option %s, %d bytes]\n", desc, size);
566*58e6ee5fSAndroid Build Coastguard Worker 	read_file_number(fd, &val, size);
567*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "0x%llX\n", val);
568*58e6ee5fSAndroid Build Coastguard Worker }
569*58e6ee5fSAndroid Build Coastguard Worker 
570*58e6ee5fSAndroid Build Coastguard Worker struct time_shift_cpu {
571*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int count;
572*58e6ee5fSAndroid Build Coastguard Worker 	long long *scalings;
573*58e6ee5fSAndroid Build Coastguard Worker 	long long *frac;
574*58e6ee5fSAndroid Build Coastguard Worker 	long long *offsets;
575*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long *times;
576*58e6ee5fSAndroid Build Coastguard Worker };
577*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_timeshift(int fd,int size)578*58e6ee5fSAndroid Build Coastguard Worker static void dump_option_timeshift(int fd, int size)
579*58e6ee5fSAndroid Build Coastguard Worker {
580*58e6ee5fSAndroid Build Coastguard Worker 	struct time_shift_cpu *cpus_data;
581*58e6ee5fSAndroid Build Coastguard Worker 	long long trace_id;
582*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int flags;
583*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int cpus;
584*58e6ee5fSAndroid Build Coastguard Worker 	int i, j;
585*58e6ee5fSAndroid Build Coastguard Worker 
586*58e6ee5fSAndroid Build Coastguard Worker 	/*
587*58e6ee5fSAndroid Build Coastguard Worker 	 * long long int (8 bytes) trace session ID
588*58e6ee5fSAndroid Build Coastguard Worker 	 * int (4 bytes) count of timestamp offsets.
589*58e6ee5fSAndroid Build Coastguard Worker 	 * long long array of size [count] of times,
590*58e6ee5fSAndroid Build Coastguard Worker 	 *      when the offsets were calculated.
591*58e6ee5fSAndroid Build Coastguard Worker 	 * long long array of size [count] of timestamp offsets.
592*58e6ee5fSAndroid Build Coastguard Worker 	 */
593*58e6ee5fSAndroid Build Coastguard Worker 	if (size < 12) {
594*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS, "Broken time shift option, size %s", size);
595*58e6ee5fSAndroid Build Coastguard Worker 		return;
596*58e6ee5fSAndroid Build Coastguard Worker 	}
597*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option TimeShift, %d bytes]\n", size);
598*58e6ee5fSAndroid Build Coastguard Worker 	read_file_number(fd, &trace_id, 8);
599*58e6ee5fSAndroid Build Coastguard Worker 	size -= 8;
600*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "0x%llX [peer's trace id]\n", trace_id);
601*58e6ee5fSAndroid Build Coastguard Worker 	read_file_number(fd, &flags, 4);
602*58e6ee5fSAndroid Build Coastguard Worker 	size -= 4;
603*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "0x%llX [peer's protocol flags]\n", flags);
604*58e6ee5fSAndroid Build Coastguard Worker 	read_file_number(fd, &cpus, 4);
605*58e6ee5fSAndroid Build Coastguard Worker 	size -= 4;
606*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "0x%llX [peer's CPU count]\n", cpus);
607*58e6ee5fSAndroid Build Coastguard Worker 	cpus_data = calloc(cpus, sizeof(struct time_shift_cpu));
608*58e6ee5fSAndroid Build Coastguard Worker 	if (!cpus_data)
609*58e6ee5fSAndroid Build Coastguard Worker 		return;
610*58e6ee5fSAndroid Build Coastguard Worker 	for (j = 0; j < cpus; j++) {
611*58e6ee5fSAndroid Build Coastguard Worker 		if (size < 4)
612*58e6ee5fSAndroid Build Coastguard Worker 			goto out;
613*58e6ee5fSAndroid Build Coastguard Worker 		read_file_number(fd, &cpus_data[j].count, 4);
614*58e6ee5fSAndroid Build Coastguard Worker 		size -= 4;
615*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS, "%lld [samples count for CPU %d]\n", cpus_data[j].count, j);
616*58e6ee5fSAndroid Build Coastguard Worker 		cpus_data[j].times = calloc(cpus_data[j].count, sizeof(long long));
617*58e6ee5fSAndroid Build Coastguard Worker 		cpus_data[j].offsets = calloc(cpus_data[j].count, sizeof(long long));
618*58e6ee5fSAndroid Build Coastguard Worker 		cpus_data[j].scalings = calloc(cpus_data[j].count, sizeof(long long));
619*58e6ee5fSAndroid Build Coastguard Worker 		cpus_data[j].frac = calloc(cpus_data[j].count, sizeof(long long));
620*58e6ee5fSAndroid Build Coastguard Worker 		if (!cpus_data[j].times || !cpus_data[j].offsets ||
621*58e6ee5fSAndroid Build Coastguard Worker 		    !cpus_data[j].scalings || !cpus_data[j].frac)
622*58e6ee5fSAndroid Build Coastguard Worker 			goto out;
623*58e6ee5fSAndroid Build Coastguard Worker 		for (i = 0; i < cpus_data[j].count; i++) {
624*58e6ee5fSAndroid Build Coastguard Worker 			if (size < 8)
625*58e6ee5fSAndroid Build Coastguard Worker 				goto out;
626*58e6ee5fSAndroid Build Coastguard Worker 			read_file_number(fd, cpus_data[j].times + i, 8);
627*58e6ee5fSAndroid Build Coastguard Worker 			size -= 8;
628*58e6ee5fSAndroid Build Coastguard Worker 		}
629*58e6ee5fSAndroid Build Coastguard Worker 		for (i = 0; i < cpus_data[j].count; i++) {
630*58e6ee5fSAndroid Build Coastguard Worker 			if (size < 8)
631*58e6ee5fSAndroid Build Coastguard Worker 				goto out;
632*58e6ee5fSAndroid Build Coastguard Worker 			read_file_number(fd, cpus_data[j].offsets + i, 8);
633*58e6ee5fSAndroid Build Coastguard Worker 			size -= 8;
634*58e6ee5fSAndroid Build Coastguard Worker 		}
635*58e6ee5fSAndroid Build Coastguard Worker 		for (i = 0; i < cpus_data[j].count; i++) {
636*58e6ee5fSAndroid Build Coastguard Worker 			if (size < 8)
637*58e6ee5fSAndroid Build Coastguard Worker 				goto out;
638*58e6ee5fSAndroid Build Coastguard Worker 			read_file_number(fd, cpus_data[j].scalings + i, 8);
639*58e6ee5fSAndroid Build Coastguard Worker 			size -= 8;
640*58e6ee5fSAndroid Build Coastguard Worker 		}
641*58e6ee5fSAndroid Build Coastguard Worker 	}
642*58e6ee5fSAndroid Build Coastguard Worker 
643*58e6ee5fSAndroid Build Coastguard Worker 	if (size > 0) {
644*58e6ee5fSAndroid Build Coastguard Worker 		for (j = 0; j < cpus; j++) {
645*58e6ee5fSAndroid Build Coastguard Worker 			if (!cpus_data[j].frac)
646*58e6ee5fSAndroid Build Coastguard Worker 				goto out;
647*58e6ee5fSAndroid Build Coastguard Worker 			for (i = 0; i < cpus_data[j].count; i++) {
648*58e6ee5fSAndroid Build Coastguard Worker 				if (size < 8)
649*58e6ee5fSAndroid Build Coastguard Worker 					goto out;
650*58e6ee5fSAndroid Build Coastguard Worker 				read_file_number(fd, cpus_data[j].frac + i, 8);
651*58e6ee5fSAndroid Build Coastguard Worker 				size -= 8;
652*58e6ee5fSAndroid Build Coastguard Worker 			}
653*58e6ee5fSAndroid Build Coastguard Worker 		}
654*58e6ee5fSAndroid Build Coastguard Worker 	}
655*58e6ee5fSAndroid Build Coastguard Worker 
656*58e6ee5fSAndroid Build Coastguard Worker 	for (j = 0; j < cpus; j++) {
657*58e6ee5fSAndroid Build Coastguard Worker 		for (i = 0; i < cpus_data[j].count; i++)
658*58e6ee5fSAndroid Build Coastguard Worker 			do_print(OPTIONS, "\t%lld %lld %llu %llu[offset * scaling >> fraction @ time]\n",
659*58e6ee5fSAndroid Build Coastguard Worker 				 cpus_data[j].offsets[i], cpus_data[j].scalings[i],
660*58e6ee5fSAndroid Build Coastguard Worker 				 cpus_data[j].frac[i], cpus_data[j].times[i]);
661*58e6ee5fSAndroid Build Coastguard Worker 
662*58e6ee5fSAndroid Build Coastguard Worker 	}
663*58e6ee5fSAndroid Build Coastguard Worker 
664*58e6ee5fSAndroid Build Coastguard Worker out:
665*58e6ee5fSAndroid Build Coastguard Worker 	if (j < cpus)
666*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS, "Broken time shift option\n");
667*58e6ee5fSAndroid Build Coastguard Worker 	for (j = 0; j < cpus; j++) {
668*58e6ee5fSAndroid Build Coastguard Worker 		free(cpus_data[j].times);
669*58e6ee5fSAndroid Build Coastguard Worker 		free(cpus_data[j].offsets);
670*58e6ee5fSAndroid Build Coastguard Worker 		free(cpus_data[j].scalings);
671*58e6ee5fSAndroid Build Coastguard Worker 		free(cpus_data[j].frac);
672*58e6ee5fSAndroid Build Coastguard Worker 	}
673*58e6ee5fSAndroid Build Coastguard Worker 	free(cpus_data);
674*58e6ee5fSAndroid Build Coastguard Worker }
675*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_guest(int fd,int size)676*58e6ee5fSAndroid Build Coastguard Worker void dump_option_guest(int fd, int size)
677*58e6ee5fSAndroid Build Coastguard Worker {
678*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long trace_id;
679*58e6ee5fSAndroid Build Coastguard Worker 	char *buf, *p;
680*58e6ee5fSAndroid Build Coastguard Worker 	int cpu, pid;
681*58e6ee5fSAndroid Build Coastguard Worker 	int cpus;
682*58e6ee5fSAndroid Build Coastguard Worker 	int i;
683*58e6ee5fSAndroid Build Coastguard Worker 
684*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option GUEST, %d bytes]\n", size);
685*58e6ee5fSAndroid Build Coastguard Worker 
686*58e6ee5fSAndroid Build Coastguard Worker 	/*
687*58e6ee5fSAndroid Build Coastguard Worker 	 * Guest name, null terminated string
688*58e6ee5fSAndroid Build Coastguard Worker 	 * long long (8 bytes) trace-id
689*58e6ee5fSAndroid Build Coastguard Worker 	 * int (4 bytes) number of guest CPUs
690*58e6ee5fSAndroid Build Coastguard Worker 	 * array of size number of guest CPUs:
691*58e6ee5fSAndroid Build Coastguard Worker 	 *	int (4 bytes) Guest CPU id
692*58e6ee5fSAndroid Build Coastguard Worker 	 *	int (4 bytes) Host PID, running the guest CPU
693*58e6ee5fSAndroid Build Coastguard Worker 	 */
694*58e6ee5fSAndroid Build Coastguard Worker 	buf = calloc(1, size);
695*58e6ee5fSAndroid Build Coastguard Worker 	if (!buf)
696*58e6ee5fSAndroid Build Coastguard Worker 		return;
697*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, buf, size))
698*58e6ee5fSAndroid Build Coastguard Worker 		goto out;
699*58e6ee5fSAndroid Build Coastguard Worker 
700*58e6ee5fSAndroid Build Coastguard Worker 	p = buf;
701*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "%s [Guest name]\n", p);
702*58e6ee5fSAndroid Build Coastguard Worker 	size -= strlen(buf) + 1;
703*58e6ee5fSAndroid Build Coastguard Worker 	p += strlen(buf) + 1;
704*58e6ee5fSAndroid Build Coastguard Worker 
705*58e6ee5fSAndroid Build Coastguard Worker 	if (size < sizeof(long long))
706*58e6ee5fSAndroid Build Coastguard Worker 		goto out;
707*58e6ee5fSAndroid Build Coastguard Worker 	trace_id = tep_read_number(tep, p, sizeof(long long));
708*58e6ee5fSAndroid Build Coastguard Worker 	size -= sizeof(long long);
709*58e6ee5fSAndroid Build Coastguard Worker 	p += sizeof(long long);
710*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "0x%llX [trace id]\n", trace_id);
711*58e6ee5fSAndroid Build Coastguard Worker 
712*58e6ee5fSAndroid Build Coastguard Worker 	if (size < sizeof(int))
713*58e6ee5fSAndroid Build Coastguard Worker 		goto out;
714*58e6ee5fSAndroid Build Coastguard Worker 	cpus = tep_read_number(tep, p, sizeof(int));
715*58e6ee5fSAndroid Build Coastguard Worker 	size -= sizeof(int);
716*58e6ee5fSAndroid Build Coastguard Worker 	p += sizeof(int);
717*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "%d [Guest CPUs]\n", cpus);
718*58e6ee5fSAndroid Build Coastguard Worker 
719*58e6ee5fSAndroid Build Coastguard Worker 	for (i = 0; i < cpus; i++) {
720*58e6ee5fSAndroid Build Coastguard Worker 		if (size < 2 * sizeof(int))
721*58e6ee5fSAndroid Build Coastguard Worker 			goto out;
722*58e6ee5fSAndroid Build Coastguard Worker 		cpu = tep_read_number(tep, p, sizeof(int));
723*58e6ee5fSAndroid Build Coastguard Worker 		size -= sizeof(int);
724*58e6ee5fSAndroid Build Coastguard Worker 		p += sizeof(int);
725*58e6ee5fSAndroid Build Coastguard Worker 		pid = tep_read_number(tep, p, sizeof(int));
726*58e6ee5fSAndroid Build Coastguard Worker 		size -= sizeof(int);
727*58e6ee5fSAndroid Build Coastguard Worker 		p += sizeof(int);
728*58e6ee5fSAndroid Build Coastguard Worker 		do_print(OPTIONS, "  %d %d [guest cpu, host pid]\n", cpu, pid);
729*58e6ee5fSAndroid Build Coastguard Worker 	}
730*58e6ee5fSAndroid Build Coastguard Worker 
731*58e6ee5fSAndroid Build Coastguard Worker out:
732*58e6ee5fSAndroid Build Coastguard Worker 	free(buf);
733*58e6ee5fSAndroid Build Coastguard Worker }
734*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_tsc2nsec(int fd,int size)735*58e6ee5fSAndroid Build Coastguard Worker void dump_option_tsc2nsec(int fd, int size)
736*58e6ee5fSAndroid Build Coastguard Worker {
737*58e6ee5fSAndroid Build Coastguard Worker 	int mult, shift;
738*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset;
739*58e6ee5fSAndroid Build Coastguard Worker 
740*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\n\t\t[Option TSC2NSEC, %d bytes]\n", size);
741*58e6ee5fSAndroid Build Coastguard Worker 
742*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &mult, 4))
743*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read tsc2nsec multiplier");
744*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &shift, 4))
745*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read tsc2nsec shift");
746*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &offset, 8))
747*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read tsc2nsec offset");
748*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "%d %d %llu [multiplier, shift, offset]\n", mult, shift, offset);
749*58e6ee5fSAndroid Build Coastguard Worker }
750*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_section(int fd,unsigned int size,unsigned short id,char * desc,enum dump_items v)751*58e6ee5fSAndroid Build Coastguard Worker static void dump_option_section(int fd, unsigned int size,
752*58e6ee5fSAndroid Build Coastguard Worker 				unsigned short id, char *desc, enum dump_items v)
753*58e6ee5fSAndroid Build Coastguard Worker {
754*58e6ee5fSAndroid Build Coastguard Worker 	struct file_section *sec;
755*58e6ee5fSAndroid Build Coastguard Worker 
756*58e6ee5fSAndroid Build Coastguard Worker 	sec = calloc(1, sizeof(struct file_section));
757*58e6ee5fSAndroid Build Coastguard Worker 	if (!sec)
758*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot allocate new section");
759*58e6ee5fSAndroid Build Coastguard Worker 
760*58e6ee5fSAndroid Build Coastguard Worker 	sec->next = sections;
761*58e6ee5fSAndroid Build Coastguard Worker 	sections = sec;
762*58e6ee5fSAndroid Build Coastguard Worker 	sec->id = id;
763*58e6ee5fSAndroid Build Coastguard Worker 	sec->verbosity = v;
764*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &sec->offset, 8))
765*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the option %d offset", id);
766*58e6ee5fSAndroid Build Coastguard Worker 
767*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option %s, %d bytes] @ %lld\n", desc, size, sec->offset);
768*58e6ee5fSAndroid Build Coastguard Worker }
769*58e6ee5fSAndroid Build Coastguard Worker 
dump_sections(int fd,int count)770*58e6ee5fSAndroid Build Coastguard Worker static void dump_sections(int fd, int count)
771*58e6ee5fSAndroid Build Coastguard Worker {
772*58e6ee5fSAndroid Build Coastguard Worker 	struct file_section *sec = sections;
773*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short flags;
774*58e6ee5fSAndroid Build Coastguard Worker 
775*58e6ee5fSAndroid Build Coastguard Worker 	while (sec) {
776*58e6ee5fSAndroid Build Coastguard Worker 		if (lseek64(fd, sec->offset, SEEK_SET) == (off_t)-1)
777*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot goto option offset %lld", sec->offset);
778*58e6ee5fSAndroid Build Coastguard Worker 
779*58e6ee5fSAndroid Build Coastguard Worker 		dump_section_header(fd, sec->verbosity, &flags);
780*58e6ee5fSAndroid Build Coastguard Worker 
781*58e6ee5fSAndroid Build Coastguard Worker 		if ((flags & TRACECMD_SEC_FL_COMPRESS) && uncompress_block())
782*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot uncompress section block");
783*58e6ee5fSAndroid Build Coastguard Worker 
784*58e6ee5fSAndroid Build Coastguard Worker 		switch (sec->id) {
785*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_HEADER_INFO:
786*58e6ee5fSAndroid Build Coastguard Worker 			dump_header_page(fd);
787*58e6ee5fSAndroid Build Coastguard Worker 			dump_header_event(fd);
788*58e6ee5fSAndroid Build Coastguard Worker 			break;
789*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_FTRACE_EVENTS:
790*58e6ee5fSAndroid Build Coastguard Worker 			dump_ftrace_events_format(fd);
791*58e6ee5fSAndroid Build Coastguard Worker 			break;
792*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_EVENT_FORMATS:
793*58e6ee5fSAndroid Build Coastguard Worker 			dump_events_format(fd);
794*58e6ee5fSAndroid Build Coastguard Worker 			break;
795*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_KALLSYMS:
796*58e6ee5fSAndroid Build Coastguard Worker 			dump_kallsyms(fd);
797*58e6ee5fSAndroid Build Coastguard Worker 			break;
798*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_PRINTK:
799*58e6ee5fSAndroid Build Coastguard Worker 			dump_printk(fd);
800*58e6ee5fSAndroid Build Coastguard Worker 			break;
801*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_CMDLINES:
802*58e6ee5fSAndroid Build Coastguard Worker 			dump_cmdlines(fd);
803*58e6ee5fSAndroid Build Coastguard Worker 			break;
804*58e6ee5fSAndroid Build Coastguard Worker 		}
805*58e6ee5fSAndroid Build Coastguard Worker 		uncompress_reset();
806*58e6ee5fSAndroid Build Coastguard Worker 		sec = sec->next;
807*58e6ee5fSAndroid Build Coastguard Worker 	}
808*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY|SECTIONS, "\t[%d sections]\n", count);
809*58e6ee5fSAndroid Build Coastguard Worker }
810*58e6ee5fSAndroid Build Coastguard Worker 
811*58e6ee5fSAndroid Build Coastguard Worker static int dump_options_read(int fd);
812*58e6ee5fSAndroid Build Coastguard Worker 
dump_option_done(int fd,int size)813*58e6ee5fSAndroid Build Coastguard Worker static int dump_option_done(int fd, int size)
814*58e6ee5fSAndroid Build Coastguard Worker {
815*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset;
816*58e6ee5fSAndroid Build Coastguard Worker 
817*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\t\t[Option DONE, %d bytes]\n", size);
818*58e6ee5fSAndroid Build Coastguard Worker 
819*58e6ee5fSAndroid Build Coastguard Worker 	if (file_version < FILE_VERSION_SECTIONS || size < 8)
820*58e6ee5fSAndroid Build Coastguard Worker 		return 0;
821*58e6ee5fSAndroid Build Coastguard Worker 
822*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &offset, 8))
823*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read the next options offset");
824*58e6ee5fSAndroid Build Coastguard Worker 
825*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "%lld\n", offset);
826*58e6ee5fSAndroid Build Coastguard Worker 	if (!offset)
827*58e6ee5fSAndroid Build Coastguard Worker 		return 0;
828*58e6ee5fSAndroid Build Coastguard Worker 
829*58e6ee5fSAndroid Build Coastguard Worker 	if (lseek64(fd, offset, SEEK_SET) == (off_t)-1)
830*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot goto next options offset %lld", offset);
831*58e6ee5fSAndroid Build Coastguard Worker 
832*58e6ee5fSAndroid Build Coastguard Worker 	do_print(OPTIONS, "\n\n");
833*58e6ee5fSAndroid Build Coastguard Worker 
834*58e6ee5fSAndroid Build Coastguard Worker 	return dump_options_read(fd);
835*58e6ee5fSAndroid Build Coastguard Worker }
836*58e6ee5fSAndroid Build Coastguard Worker 
dump_options_read(int fd)837*58e6ee5fSAndroid Build Coastguard Worker static int dump_options_read(int fd)
838*58e6ee5fSAndroid Build Coastguard Worker {
839*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short flags = 0;
840*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short option;
841*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int size;
842*58e6ee5fSAndroid Build Coastguard Worker 	int count = 0;
843*58e6ee5fSAndroid Build Coastguard Worker 
844*58e6ee5fSAndroid Build Coastguard Worker 	if (file_version >= FILE_VERSION_SECTIONS)
845*58e6ee5fSAndroid Build Coastguard Worker 		dump_section_header(fd, OPTIONS, &flags);
846*58e6ee5fSAndroid Build Coastguard Worker 
847*58e6ee5fSAndroid Build Coastguard Worker 	if ((flags & TRACECMD_SEC_FL_COMPRESS) && uncompress_block())
848*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot uncompress file block");
849*58e6ee5fSAndroid Build Coastguard Worker 
850*58e6ee5fSAndroid Build Coastguard Worker 	for (;;) {
851*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &option, 2))
852*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the option id");
853*58e6ee5fSAndroid Build Coastguard Worker 		if (option == TRACECMD_OPTION_DONE && file_version < FILE_VERSION_SECTIONS)
854*58e6ee5fSAndroid Build Coastguard Worker 			break;
855*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &size, 4))
856*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the option size");
857*58e6ee5fSAndroid Build Coastguard Worker 
858*58e6ee5fSAndroid Build Coastguard Worker 		count++;
859*58e6ee5fSAndroid Build Coastguard Worker 		switch (option) {
860*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_DATE:
861*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "DATE");
862*58e6ee5fSAndroid Build Coastguard Worker 			break;
863*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_CPUSTAT:
864*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "CPUSTAT");
865*58e6ee5fSAndroid Build Coastguard Worker 			break;
866*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_BUFFER:
867*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_BUFFER_TEXT:
868*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_buffer(fd, option, size);
869*58e6ee5fSAndroid Build Coastguard Worker 			break;
870*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_TRACECLOCK:
871*58e6ee5fSAndroid Build Coastguard Worker 			do_print(OPTIONS, "\t\t[Option TRACECLOCK, %d bytes]\n", size);
872*58e6ee5fSAndroid Build Coastguard Worker 			read_dump_string(fd, size, OPTIONS | CLOCK);
873*58e6ee5fSAndroid Build Coastguard Worker 			has_clock = 1;
874*58e6ee5fSAndroid Build Coastguard Worker 			break;
875*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_UNAME:
876*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "UNAME");
877*58e6ee5fSAndroid Build Coastguard Worker 			break;
878*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_HOOK:
879*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "HOOK");
880*58e6ee5fSAndroid Build Coastguard Worker 			break;
881*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_OFFSET:
882*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "OFFSET");
883*58e6ee5fSAndroid Build Coastguard Worker 			break;
884*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_CPUCOUNT:
885*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_int(fd, size, "CPUCOUNT");
886*58e6ee5fSAndroid Build Coastguard Worker 			break;
887*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_VERSION:
888*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "VERSION");
889*58e6ee5fSAndroid Build Coastguard Worker 			break;
890*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_PROCMAPS:
891*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_string(fd, size, "PROCMAPS");
892*58e6ee5fSAndroid Build Coastguard Worker 			break;
893*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_TRACEID:
894*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_xlong(fd, size, "TRACEID");
895*58e6ee5fSAndroid Build Coastguard Worker 			break;
896*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_TIME_SHIFT:
897*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_timeshift(fd, size);
898*58e6ee5fSAndroid Build Coastguard Worker 			break;
899*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_GUEST:
900*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_guest(fd, size);
901*58e6ee5fSAndroid Build Coastguard Worker 			break;
902*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_TSC2NSEC:
903*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_tsc2nsec(fd, size);
904*58e6ee5fSAndroid Build Coastguard Worker 			break;
905*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_HEADER_INFO:
906*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_section(fd, size, option, "HEADERS", HEAD_PAGE | HEAD_EVENT);
907*58e6ee5fSAndroid Build Coastguard Worker 			break;
908*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_FTRACE_EVENTS:
909*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_section(fd, size, option, "FTRACE EVENTS", FTRACE_FORMAT);
910*58e6ee5fSAndroid Build Coastguard Worker 			break;
911*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_EVENT_FORMATS:
912*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_section(fd, size, option,
913*58e6ee5fSAndroid Build Coastguard Worker 					    "EVENT FORMATS", EVENT_SYSTEMS | EVENT_FORMAT);
914*58e6ee5fSAndroid Build Coastguard Worker 			break;
915*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_KALLSYMS:
916*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_section(fd, size, option, "KALLSYMS", KALLSYMS);
917*58e6ee5fSAndroid Build Coastguard Worker 			break;
918*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_PRINTK:
919*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_section(fd, size, option, "PRINTK", TRACE_PRINTK);
920*58e6ee5fSAndroid Build Coastguard Worker 			break;
921*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_CMDLINES:
922*58e6ee5fSAndroid Build Coastguard Worker 			dump_option_section(fd, size, option, "CMDLINES", CMDLINES);
923*58e6ee5fSAndroid Build Coastguard Worker 			break;
924*58e6ee5fSAndroid Build Coastguard Worker 		case TRACECMD_OPTION_DONE:
925*58e6ee5fSAndroid Build Coastguard Worker 			uncompress_reset();
926*58e6ee5fSAndroid Build Coastguard Worker 			count += dump_option_done(fd, size);
927*58e6ee5fSAndroid Build Coastguard Worker 			return count;
928*58e6ee5fSAndroid Build Coastguard Worker 		default:
929*58e6ee5fSAndroid Build Coastguard Worker 			do_print(OPTIONS, " %d %d\t[Unknown option, size - skipping]\n",
930*58e6ee5fSAndroid Build Coastguard Worker 				 option, size);
931*58e6ee5fSAndroid Build Coastguard Worker 			do_lseek(fd, size, SEEK_CUR);
932*58e6ee5fSAndroid Build Coastguard Worker 			break;
933*58e6ee5fSAndroid Build Coastguard Worker 		}
934*58e6ee5fSAndroid Build Coastguard Worker 	}
935*58e6ee5fSAndroid Build Coastguard Worker 	uncompress_reset();
936*58e6ee5fSAndroid Build Coastguard Worker 	return count;
937*58e6ee5fSAndroid Build Coastguard Worker }
938*58e6ee5fSAndroid Build Coastguard Worker 
dump_options(int fd)939*58e6ee5fSAndroid Build Coastguard Worker static void dump_options(int fd)
940*58e6ee5fSAndroid Build Coastguard Worker {
941*58e6ee5fSAndroid Build Coastguard Worker 	int count;
942*58e6ee5fSAndroid Build Coastguard Worker 
943*58e6ee5fSAndroid Build Coastguard Worker 	count = dump_options_read(fd);
944*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY|OPTIONS, "\t[%d options]\n", count);
945*58e6ee5fSAndroid Build Coastguard Worker }
946*58e6ee5fSAndroid Build Coastguard Worker 
dump_latency(int fd)947*58e6ee5fSAndroid Build Coastguard Worker static void dump_latency(int fd)
948*58e6ee5fSAndroid Build Coastguard Worker {
949*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\t[Latency tracing data]\n");
950*58e6ee5fSAndroid Build Coastguard Worker }
951*58e6ee5fSAndroid Build Coastguard Worker 
dump_clock(int fd)952*58e6ee5fSAndroid Build Coastguard Worker static void dump_clock(int fd)
953*58e6ee5fSAndroid Build Coastguard Worker {
954*58e6ee5fSAndroid Build Coastguard Worker 	long long size;
955*58e6ee5fSAndroid Build Coastguard Worker 	char *clock;
956*58e6ee5fSAndroid Build Coastguard Worker 
957*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | CLOCK), "\t[Tracing clock]\n");
958*58e6ee5fSAndroid Build Coastguard Worker 	if (!has_clock) {
959*58e6ee5fSAndroid Build Coastguard Worker 		do_print((SUMMARY | CLOCK), "\t\t No tracing clock saved in the file\n");
960*58e6ee5fSAndroid Build Coastguard Worker 		return;
961*58e6ee5fSAndroid Build Coastguard Worker 	}
962*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &size, 8))
963*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read clock size");
964*58e6ee5fSAndroid Build Coastguard Worker 	clock = calloc(1, size);
965*58e6ee5fSAndroid Build Coastguard Worker 	if (!clock)
966*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot allocate clock %lld bytes", size);
967*58e6ee5fSAndroid Build Coastguard Worker 
968*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_bytes(fd, clock, size))
969*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read clock %lld bytes", size);
970*58e6ee5fSAndroid Build Coastguard Worker 	clock[size] = 0;
971*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | CLOCK), "\t\t%s\n", clock);
972*58e6ee5fSAndroid Build Coastguard Worker 	free(clock);
973*58e6ee5fSAndroid Build Coastguard Worker }
974*58e6ee5fSAndroid Build Coastguard Worker 
dump_flyrecord(int fd)975*58e6ee5fSAndroid Build Coastguard Worker static void dump_flyrecord(int fd)
976*58e6ee5fSAndroid Build Coastguard Worker {
977*58e6ee5fSAndroid Build Coastguard Worker 	long long cpu_offset;
978*58e6ee5fSAndroid Build Coastguard Worker 	long long cpu_size;
979*58e6ee5fSAndroid Build Coastguard Worker 	int i;
980*58e6ee5fSAndroid Build Coastguard Worker 
981*58e6ee5fSAndroid Build Coastguard Worker 	do_print((SUMMARY | FLYRECORD), "\t[Flyrecord tracing data]\n");
982*58e6ee5fSAndroid Build Coastguard Worker 
983*58e6ee5fSAndroid Build Coastguard Worker 	for (i = 0; i < trace_cpus; i++) {
984*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &cpu_offset, 8))
985*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the cpu %d offset", i);
986*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &cpu_size, 8))
987*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the cpu %d size", i);
988*58e6ee5fSAndroid Build Coastguard Worker 		do_print(FLYRECORD, "\t %10.lld %10.lld\t[offset, size of cpu %d]\n",
989*58e6ee5fSAndroid Build Coastguard Worker 			 cpu_offset, cpu_size, i);
990*58e6ee5fSAndroid Build Coastguard Worker 	}
991*58e6ee5fSAndroid Build Coastguard Worker 	dump_clock(fd);
992*58e6ee5fSAndroid Build Coastguard Worker }
993*58e6ee5fSAndroid Build Coastguard Worker 
dump_therest(int fd)994*58e6ee5fSAndroid Build Coastguard Worker static void dump_therest(int fd)
995*58e6ee5fSAndroid Build Coastguard Worker {
996*58e6ee5fSAndroid Build Coastguard Worker 	char str[10];
997*58e6ee5fSAndroid Build Coastguard Worker 
998*58e6ee5fSAndroid Build Coastguard Worker 	for (;;) {
999*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_bytes(fd, str, 10))
1000*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read the rest of the header");
1001*58e6ee5fSAndroid Build Coastguard Worker 
1002*58e6ee5fSAndroid Build Coastguard Worker 		if (strncmp(str, HEAD_OPTIONS, 10) == 0)
1003*58e6ee5fSAndroid Build Coastguard Worker 			dump_options(fd);
1004*58e6ee5fSAndroid Build Coastguard Worker 		else if (strncmp(str, HEAD_LATENCY, 10) == 0)
1005*58e6ee5fSAndroid Build Coastguard Worker 			dump_latency(fd);
1006*58e6ee5fSAndroid Build Coastguard Worker 		else if (strncmp(str, HEAD_FLYRECORD, 10) == 0)
1007*58e6ee5fSAndroid Build Coastguard Worker 			dump_flyrecord(fd);
1008*58e6ee5fSAndroid Build Coastguard Worker 		else {
1009*58e6ee5fSAndroid Build Coastguard Worker 			lseek64(fd, -10, SEEK_CUR);
1010*58e6ee5fSAndroid Build Coastguard Worker 			break;
1011*58e6ee5fSAndroid Build Coastguard Worker 		}
1012*58e6ee5fSAndroid Build Coastguard Worker 	}
1013*58e6ee5fSAndroid Build Coastguard Worker }
1014*58e6ee5fSAndroid Build Coastguard Worker 
dump_v6_file(int fd)1015*58e6ee5fSAndroid Build Coastguard Worker static void dump_v6_file(int fd)
1016*58e6ee5fSAndroid Build Coastguard Worker {
1017*58e6ee5fSAndroid Build Coastguard Worker 	dump_header_page(fd);
1018*58e6ee5fSAndroid Build Coastguard Worker 	dump_header_event(fd);
1019*58e6ee5fSAndroid Build Coastguard Worker 	dump_ftrace_events_format(fd);
1020*58e6ee5fSAndroid Build Coastguard Worker 	dump_events_format(fd);
1021*58e6ee5fSAndroid Build Coastguard Worker 	dump_kallsyms(fd);
1022*58e6ee5fSAndroid Build Coastguard Worker 	dump_printk(fd);
1023*58e6ee5fSAndroid Build Coastguard Worker 	dump_cmdlines(fd);
1024*58e6ee5fSAndroid Build Coastguard Worker 	dump_cpus_count(fd);
1025*58e6ee5fSAndroid Build Coastguard Worker 	dump_therest(fd);
1026*58e6ee5fSAndroid Build Coastguard Worker }
1027*58e6ee5fSAndroid Build Coastguard Worker 
read_metadata_strings(int fd,unsigned long long size)1028*58e6ee5fSAndroid Build Coastguard Worker static int read_metadata_strings(int fd, unsigned long long size)
1029*58e6ee5fSAndroid Build Coastguard Worker {
1030*58e6ee5fSAndroid Build Coastguard Worker 	char *str, *strings;
1031*58e6ee5fSAndroid Build Coastguard Worker 	int psize;
1032*58e6ee5fSAndroid Build Coastguard Worker 	int ret;
1033*58e6ee5fSAndroid Build Coastguard Worker 
1034*58e6ee5fSAndroid Build Coastguard Worker 	strings = realloc(meta_strings, meta_strings_size + size);
1035*58e6ee5fSAndroid Build Coastguard Worker 	if (!strings)
1036*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
1037*58e6ee5fSAndroid Build Coastguard Worker 	meta_strings = strings;
1038*58e6ee5fSAndroid Build Coastguard Worker 
1039*58e6ee5fSAndroid Build Coastguard Worker 	ret = read_file_bytes(fd, meta_strings + meta_strings_size, size);
1040*58e6ee5fSAndroid Build Coastguard Worker 	if (ret < 0)
1041*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
1042*58e6ee5fSAndroid Build Coastguard Worker 
1043*58e6ee5fSAndroid Build Coastguard Worker 	do_print(STRINGS, "\t[String @ offset]\n");
1044*58e6ee5fSAndroid Build Coastguard Worker 	psize = 0;
1045*58e6ee5fSAndroid Build Coastguard Worker 	while (psize < size) {
1046*58e6ee5fSAndroid Build Coastguard Worker 		str = meta_strings + meta_strings_size + psize;
1047*58e6ee5fSAndroid Build Coastguard Worker 		do_print(STRINGS, "\t\t\"%s\" @ %d\n", str, meta_strings_size + psize);
1048*58e6ee5fSAndroid Build Coastguard Worker 		psize += strlen(str) + 1;
1049*58e6ee5fSAndroid Build Coastguard Worker 	}
1050*58e6ee5fSAndroid Build Coastguard Worker 
1051*58e6ee5fSAndroid Build Coastguard Worker 	meta_strings_size += size;
1052*58e6ee5fSAndroid Build Coastguard Worker 
1053*58e6ee5fSAndroid Build Coastguard Worker 	return 0;
1054*58e6ee5fSAndroid Build Coastguard Worker }
1055*58e6ee5fSAndroid Build Coastguard Worker 
get_meta_strings(int fd)1056*58e6ee5fSAndroid Build Coastguard Worker static void get_meta_strings(int fd)
1057*58e6ee5fSAndroid Build Coastguard Worker {
1058*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset, size;
1059*58e6ee5fSAndroid Build Coastguard Worker 	unsigned int csize, rsize;
1060*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short fl, id;
1061*58e6ee5fSAndroid Build Coastguard Worker 	int desc_id;
1062*58e6ee5fSAndroid Build Coastguard Worker 
1063*58e6ee5fSAndroid Build Coastguard Worker 	offset = lseek64(fd, 0, SEEK_CUR);
1064*58e6ee5fSAndroid Build Coastguard Worker 	do {
1065*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &id, 2))
1066*58e6ee5fSAndroid Build Coastguard Worker 			break;
1067*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &fl, 2))
1068*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read section flags");
1069*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &desc_id, 4))
1070*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read section description");
1071*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &size, 8))
1072*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read section size");
1073*58e6ee5fSAndroid Build Coastguard Worker 		if (id == TRACECMD_OPTION_STRINGS) {
1074*58e6ee5fSAndroid Build Coastguard Worker 			if ((fl & TRACECMD_SEC_FL_COMPRESS)) {
1075*58e6ee5fSAndroid Build Coastguard Worker 				read_file_number(fd, &csize, 4);
1076*58e6ee5fSAndroid Build Coastguard Worker 				read_file_number(fd, &rsize, 4);
1077*58e6ee5fSAndroid Build Coastguard Worker 				lseek64(fd, -8, SEEK_CUR);
1078*58e6ee5fSAndroid Build Coastguard Worker 				if (uncompress_block())
1079*58e6ee5fSAndroid Build Coastguard Worker 					break;
1080*58e6ee5fSAndroid Build Coastguard Worker 			} else {
1081*58e6ee5fSAndroid Build Coastguard Worker 				rsize = size;
1082*58e6ee5fSAndroid Build Coastguard Worker 			}
1083*58e6ee5fSAndroid Build Coastguard Worker 			read_metadata_strings(fd, rsize);
1084*58e6ee5fSAndroid Build Coastguard Worker 			uncompress_reset();
1085*58e6ee5fSAndroid Build Coastguard Worker 		} else {
1086*58e6ee5fSAndroid Build Coastguard Worker 			if (lseek64(fd, size, SEEK_CUR) == (off_t)-1)
1087*58e6ee5fSAndroid Build Coastguard Worker 				break;
1088*58e6ee5fSAndroid Build Coastguard Worker 		}
1089*58e6ee5fSAndroid Build Coastguard Worker 	} while (1);
1090*58e6ee5fSAndroid Build Coastguard Worker 
1091*58e6ee5fSAndroid Build Coastguard Worker 	if (lseek64(fd, offset, SEEK_SET) == (off_t)-1)
1092*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot restore the original file location");
1093*58e6ee5fSAndroid Build Coastguard Worker }
1094*58e6ee5fSAndroid Build Coastguard Worker 
walk_v7_sections(int fd)1095*58e6ee5fSAndroid Build Coastguard Worker static int walk_v7_sections(int fd)
1096*58e6ee5fSAndroid Build Coastguard Worker {
1097*58e6ee5fSAndroid Build Coastguard Worker 	unsigned long long offset, soffset, size;
1098*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short fl;
1099*58e6ee5fSAndroid Build Coastguard Worker 	unsigned short id;
1100*58e6ee5fSAndroid Build Coastguard Worker 	int csize, rsize;
1101*58e6ee5fSAndroid Build Coastguard Worker 	int count = 0;
1102*58e6ee5fSAndroid Build Coastguard Worker 	int desc_id;
1103*58e6ee5fSAndroid Build Coastguard Worker 	const char *desc;
1104*58e6ee5fSAndroid Build Coastguard Worker 
1105*58e6ee5fSAndroid Build Coastguard Worker 	offset = lseek64(fd, 0, SEEK_CUR);
1106*58e6ee5fSAndroid Build Coastguard Worker 	do {
1107*58e6ee5fSAndroid Build Coastguard Worker 		soffset = lseek64(fd, 0, SEEK_CUR);
1108*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &id, 2))
1109*58e6ee5fSAndroid Build Coastguard Worker 			break;
1110*58e6ee5fSAndroid Build Coastguard Worker 
1111*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &fl, 2))
1112*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read section flags");
1113*58e6ee5fSAndroid Build Coastguard Worker 
1114*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &desc_id, 4))
1115*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read section description");
1116*58e6ee5fSAndroid Build Coastguard Worker 
1117*58e6ee5fSAndroid Build Coastguard Worker 		desc = get_metadata_string(desc_id);
1118*58e6ee5fSAndroid Build Coastguard Worker 		if (!desc)
1119*58e6ee5fSAndroid Build Coastguard Worker 			desc = "Unknown";
1120*58e6ee5fSAndroid Build Coastguard Worker 
1121*58e6ee5fSAndroid Build Coastguard Worker 		if (read_file_number(fd, &size, 8))
1122*58e6ee5fSAndroid Build Coastguard Worker 			die("cannot read section size");
1123*58e6ee5fSAndroid Build Coastguard Worker 
1124*58e6ee5fSAndroid Build Coastguard Worker 		if (id >= TRACECMD_OPTION_MAX)
1125*58e6ee5fSAndroid Build Coastguard Worker 			do_print(SECTIONS, "Unknown section id %d: %s", id, desc);
1126*58e6ee5fSAndroid Build Coastguard Worker 
1127*58e6ee5fSAndroid Build Coastguard Worker 		count++;
1128*58e6ee5fSAndroid Build Coastguard Worker 		if (fl & TRACECMD_SEC_FL_COMPRESS) {
1129*58e6ee5fSAndroid Build Coastguard Worker 			if (id == TRACECMD_OPTION_BUFFER ||
1130*58e6ee5fSAndroid Build Coastguard Worker 			    id == TRACECMD_OPTION_BUFFER_TEXT) {
1131*58e6ee5fSAndroid Build Coastguard Worker 				do_print(SECTIONS,
1132*58e6ee5fSAndroid Build Coastguard Worker 					"\t[Section %2d @ %-16lld\t\"%s\", flags 0x%X, "
1133*58e6ee5fSAndroid Build Coastguard Worker 					"%lld compressed bytes]\n",
1134*58e6ee5fSAndroid Build Coastguard Worker 					 id, soffset, desc, fl, size);
1135*58e6ee5fSAndroid Build Coastguard Worker 			} else {
1136*58e6ee5fSAndroid Build Coastguard Worker 				if (read_file_number(fd, &csize, 4))
1137*58e6ee5fSAndroid Build Coastguard Worker 					die("cannot read section size");
1138*58e6ee5fSAndroid Build Coastguard Worker 
1139*58e6ee5fSAndroid Build Coastguard Worker 				if (read_file_number(fd, &rsize, 4))
1140*58e6ee5fSAndroid Build Coastguard Worker 					die("cannot read section size");
1141*58e6ee5fSAndroid Build Coastguard Worker 
1142*58e6ee5fSAndroid Build Coastguard Worker 				do_print(SECTIONS, "\t[Section %2d @ %-16lld\t\"%s\", flags 0x%X, "
1143*58e6ee5fSAndroid Build Coastguard Worker 					 "%d compressed, %d uncompressed]\n",
1144*58e6ee5fSAndroid Build Coastguard Worker 					 id, soffset, desc, fl, csize, rsize);
1145*58e6ee5fSAndroid Build Coastguard Worker 				size -= 8;
1146*58e6ee5fSAndroid Build Coastguard Worker 			}
1147*58e6ee5fSAndroid Build Coastguard Worker 		} else {
1148*58e6ee5fSAndroid Build Coastguard Worker 			do_print(SECTIONS, "\t[Section %2d @ %-16lld\t\"%s\", flags 0x%X, %lld bytes]\n",
1149*58e6ee5fSAndroid Build Coastguard Worker 				 id, soffset, desc, fl, size);
1150*58e6ee5fSAndroid Build Coastguard Worker 		}
1151*58e6ee5fSAndroid Build Coastguard Worker 
1152*58e6ee5fSAndroid Build Coastguard Worker 		if (lseek64(fd, size, SEEK_CUR) == (off_t)-1)
1153*58e6ee5fSAndroid Build Coastguard Worker 			break;
1154*58e6ee5fSAndroid Build Coastguard Worker 	} while (1);
1155*58e6ee5fSAndroid Build Coastguard Worker 
1156*58e6ee5fSAndroid Build Coastguard Worker 	if (lseek64(fd, offset, SEEK_SET) == (off_t)-1)
1157*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot restore the original file location");
1158*58e6ee5fSAndroid Build Coastguard Worker 
1159*58e6ee5fSAndroid Build Coastguard Worker 	return count;
1160*58e6ee5fSAndroid Build Coastguard Worker }
1161*58e6ee5fSAndroid Build Coastguard Worker 
dump_v7_file(int fd)1162*58e6ee5fSAndroid Build Coastguard Worker static void dump_v7_file(int fd)
1163*58e6ee5fSAndroid Build Coastguard Worker {
1164*58e6ee5fSAndroid Build Coastguard Worker 	long long offset;
1165*58e6ee5fSAndroid Build Coastguard Worker 	int sections;
1166*58e6ee5fSAndroid Build Coastguard Worker 
1167*58e6ee5fSAndroid Build Coastguard Worker 	if (read_file_number(fd, &offset, 8))
1168*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot read offset of the first option section");
1169*58e6ee5fSAndroid Build Coastguard Worker 
1170*58e6ee5fSAndroid Build Coastguard Worker 	get_meta_strings(fd);
1171*58e6ee5fSAndroid Build Coastguard Worker 	sections = walk_v7_sections(fd);
1172*58e6ee5fSAndroid Build Coastguard Worker 
1173*58e6ee5fSAndroid Build Coastguard Worker 	if (lseek64(fd, offset, SEEK_SET) == (off_t)-1)
1174*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot goto options offset %lld", offset);
1175*58e6ee5fSAndroid Build Coastguard Worker 
1176*58e6ee5fSAndroid Build Coastguard Worker 	dump_options(fd);
1177*58e6ee5fSAndroid Build Coastguard Worker 	dump_sections(fd, sections);
1178*58e6ee5fSAndroid Build Coastguard Worker }
1179*58e6ee5fSAndroid Build Coastguard Worker 
free_sections(void)1180*58e6ee5fSAndroid Build Coastguard Worker static void free_sections(void)
1181*58e6ee5fSAndroid Build Coastguard Worker {
1182*58e6ee5fSAndroid Build Coastguard Worker 	struct file_section *del;
1183*58e6ee5fSAndroid Build Coastguard Worker 
1184*58e6ee5fSAndroid Build Coastguard Worker 	while (sections) {
1185*58e6ee5fSAndroid Build Coastguard Worker 		del = sections;
1186*58e6ee5fSAndroid Build Coastguard Worker 		sections = sections->next;
1187*58e6ee5fSAndroid Build Coastguard Worker 		free(del);
1188*58e6ee5fSAndroid Build Coastguard Worker 	}
1189*58e6ee5fSAndroid Build Coastguard Worker }
1190*58e6ee5fSAndroid Build Coastguard Worker 
dump_file(const char * file)1191*58e6ee5fSAndroid Build Coastguard Worker static void dump_file(const char *file)
1192*58e6ee5fSAndroid Build Coastguard Worker {
1193*58e6ee5fSAndroid Build Coastguard Worker 	int fd;
1194*58e6ee5fSAndroid Build Coastguard Worker 
1195*58e6ee5fSAndroid Build Coastguard Worker 	tep = tep_alloc();
1196*58e6ee5fSAndroid Build Coastguard Worker 	if (!tep)
1197*58e6ee5fSAndroid Build Coastguard Worker 		return;
1198*58e6ee5fSAndroid Build Coastguard Worker 
1199*58e6ee5fSAndroid Build Coastguard Worker 	fd = open(file, O_RDONLY);
1200*58e6ee5fSAndroid Build Coastguard Worker 	if (fd < 0)
1201*58e6ee5fSAndroid Build Coastguard Worker 		die("cannot open '%s'\n", file);
1202*58e6ee5fSAndroid Build Coastguard Worker 
1203*58e6ee5fSAndroid Build Coastguard Worker 	do_print(SUMMARY, "\n Tracing meta data in file %s:\n", file);
1204*58e6ee5fSAndroid Build Coastguard Worker 
1205*58e6ee5fSAndroid Build Coastguard Worker 	dump_initial_format(fd);
1206*58e6ee5fSAndroid Build Coastguard Worker 	dump_compress(fd);
1207*58e6ee5fSAndroid Build Coastguard Worker 	if (file_version < FILE_VERSION_SECTIONS)
1208*58e6ee5fSAndroid Build Coastguard Worker 		dump_v6_file(fd);
1209*58e6ee5fSAndroid Build Coastguard Worker 	else
1210*58e6ee5fSAndroid Build Coastguard Worker 		dump_v7_file(fd);
1211*58e6ee5fSAndroid Build Coastguard Worker 	free_sections();
1212*58e6ee5fSAndroid Build Coastguard Worker 	tep_free(tep);
1213*58e6ee5fSAndroid Build Coastguard Worker 	tep = NULL;
1214*58e6ee5fSAndroid Build Coastguard Worker 	close(fd);
1215*58e6ee5fSAndroid Build Coastguard Worker }
1216*58e6ee5fSAndroid Build Coastguard Worker 
1217*58e6ee5fSAndroid Build Coastguard Worker enum {
1218*58e6ee5fSAndroid Build Coastguard Worker 	OPT_sections	= 240,
1219*58e6ee5fSAndroid Build Coastguard Worker 	OPT_strings	= 241,
1220*58e6ee5fSAndroid Build Coastguard Worker 	OPT_verbose	= 242,
1221*58e6ee5fSAndroid Build Coastguard Worker 	OPT_clock	= 243,
1222*58e6ee5fSAndroid Build Coastguard Worker 	OPT_all		= 244,
1223*58e6ee5fSAndroid Build Coastguard Worker 	OPT_summary	= 245,
1224*58e6ee5fSAndroid Build Coastguard Worker 	OPT_flyrecord	= 246,
1225*58e6ee5fSAndroid Build Coastguard Worker 	OPT_options	= 247,
1226*58e6ee5fSAndroid Build Coastguard Worker 	OPT_cmd_lines	= 248,
1227*58e6ee5fSAndroid Build Coastguard Worker 	OPT_printk	= 249,
1228*58e6ee5fSAndroid Build Coastguard Worker 	OPT_kallsyms	= 250,
1229*58e6ee5fSAndroid Build Coastguard Worker 	OPT_events	= 251,
1230*58e6ee5fSAndroid Build Coastguard Worker 	OPT_systems	= 252,
1231*58e6ee5fSAndroid Build Coastguard Worker 	OPT_ftrace	= 253,
1232*58e6ee5fSAndroid Build Coastguard Worker 	OPT_head_event	= 254,
1233*58e6ee5fSAndroid Build Coastguard Worker 	OPT_head_page	= 255,
1234*58e6ee5fSAndroid Build Coastguard Worker };
1235*58e6ee5fSAndroid Build Coastguard Worker 
trace_dump(int argc,char ** argv)1236*58e6ee5fSAndroid Build Coastguard Worker void trace_dump(int argc, char **argv)
1237*58e6ee5fSAndroid Build Coastguard Worker {
1238*58e6ee5fSAndroid Build Coastguard Worker 	char *input_file = NULL;
1239*58e6ee5fSAndroid Build Coastguard Worker 	bool validate = false;
1240*58e6ee5fSAndroid Build Coastguard Worker 	int c;
1241*58e6ee5fSAndroid Build Coastguard Worker 
1242*58e6ee5fSAndroid Build Coastguard Worker 	if (argc < 2)
1243*58e6ee5fSAndroid Build Coastguard Worker 		usage(argv);
1244*58e6ee5fSAndroid Build Coastguard Worker 
1245*58e6ee5fSAndroid Build Coastguard Worker 	if (strcmp(argv[1], "dump") != 0)
1246*58e6ee5fSAndroid Build Coastguard Worker 		usage(argv);
1247*58e6ee5fSAndroid Build Coastguard Worker 	for (;;) {
1248*58e6ee5fSAndroid Build Coastguard Worker 		int option_index = 0;
1249*58e6ee5fSAndroid Build Coastguard Worker 		static struct option long_options[] = {
1250*58e6ee5fSAndroid Build Coastguard Worker 			{"all", no_argument, NULL, OPT_all},
1251*58e6ee5fSAndroid Build Coastguard Worker 			{"summary", no_argument, NULL, OPT_summary},
1252*58e6ee5fSAndroid Build Coastguard Worker 			{"head-page", no_argument, NULL, OPT_head_page},
1253*58e6ee5fSAndroid Build Coastguard Worker 			{"head-event", no_argument, NULL, OPT_head_event},
1254*58e6ee5fSAndroid Build Coastguard Worker 			{"ftrace-events", no_argument, NULL, OPT_ftrace},
1255*58e6ee5fSAndroid Build Coastguard Worker 			{"systems", no_argument, NULL, OPT_systems},
1256*58e6ee5fSAndroid Build Coastguard Worker 			{"events", no_argument, NULL, OPT_events},
1257*58e6ee5fSAndroid Build Coastguard Worker 			{"kallsyms", no_argument, NULL, OPT_kallsyms},
1258*58e6ee5fSAndroid Build Coastguard Worker 			{"printk", no_argument, NULL, OPT_printk},
1259*58e6ee5fSAndroid Build Coastguard Worker 			{"cmd-lines", no_argument, NULL, OPT_cmd_lines},
1260*58e6ee5fSAndroid Build Coastguard Worker 			{"options", no_argument, NULL, OPT_options},
1261*58e6ee5fSAndroid Build Coastguard Worker 			{"flyrecord", no_argument, NULL, OPT_flyrecord},
1262*58e6ee5fSAndroid Build Coastguard Worker 			{"clock", no_argument, NULL, OPT_clock},
1263*58e6ee5fSAndroid Build Coastguard Worker 			{"strings", no_argument, NULL, OPT_strings},
1264*58e6ee5fSAndroid Build Coastguard Worker 			{"sections", no_argument, NULL, OPT_sections},
1265*58e6ee5fSAndroid Build Coastguard Worker 			{"validate", no_argument, NULL, 'v'},
1266*58e6ee5fSAndroid Build Coastguard Worker 			{"help", no_argument, NULL, '?'},
1267*58e6ee5fSAndroid Build Coastguard Worker 			{"verbose", optional_argument, NULL, OPT_verbose},
1268*58e6ee5fSAndroid Build Coastguard Worker 			{NULL, 0, NULL, 0}
1269*58e6ee5fSAndroid Build Coastguard Worker 		};
1270*58e6ee5fSAndroid Build Coastguard Worker 
1271*58e6ee5fSAndroid Build Coastguard Worker 		c = getopt_long (argc-1, argv+1, "+hvai:",
1272*58e6ee5fSAndroid Build Coastguard Worker 				long_options, &option_index);
1273*58e6ee5fSAndroid Build Coastguard Worker 		if (c == -1)
1274*58e6ee5fSAndroid Build Coastguard Worker 			break;
1275*58e6ee5fSAndroid Build Coastguard Worker 		switch (c) {
1276*58e6ee5fSAndroid Build Coastguard Worker 		case 'h':
1277*58e6ee5fSAndroid Build Coastguard Worker 			usage(argv);
1278*58e6ee5fSAndroid Build Coastguard Worker 			break;
1279*58e6ee5fSAndroid Build Coastguard Worker 		case 'i':
1280*58e6ee5fSAndroid Build Coastguard Worker 			input_file = optarg;
1281*58e6ee5fSAndroid Build Coastguard Worker 			break;
1282*58e6ee5fSAndroid Build Coastguard Worker 		case 'v':
1283*58e6ee5fSAndroid Build Coastguard Worker 			validate = true;
1284*58e6ee5fSAndroid Build Coastguard Worker 			break;
1285*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_all:
1286*58e6ee5fSAndroid Build Coastguard Worker 			verbosity = 0xFFFFFFFF;
1287*58e6ee5fSAndroid Build Coastguard Worker 			break;
1288*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_summary:
1289*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= SUMMARY;
1290*58e6ee5fSAndroid Build Coastguard Worker 			break;
1291*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_flyrecord:
1292*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= FLYRECORD;
1293*58e6ee5fSAndroid Build Coastguard Worker 			break;
1294*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_options:
1295*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= OPTIONS;
1296*58e6ee5fSAndroid Build Coastguard Worker 			break;
1297*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_cmd_lines:
1298*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= CMDLINES;
1299*58e6ee5fSAndroid Build Coastguard Worker 			break;
1300*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_printk:
1301*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= TRACE_PRINTK;
1302*58e6ee5fSAndroid Build Coastguard Worker 			break;
1303*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_kallsyms:
1304*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= KALLSYMS;
1305*58e6ee5fSAndroid Build Coastguard Worker 			break;
1306*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_events:
1307*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= EVENT_FORMAT;
1308*58e6ee5fSAndroid Build Coastguard Worker 			break;
1309*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_systems:
1310*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= EVENT_SYSTEMS;
1311*58e6ee5fSAndroid Build Coastguard Worker 			break;
1312*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_ftrace:
1313*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= FTRACE_FORMAT;
1314*58e6ee5fSAndroid Build Coastguard Worker 			break;
1315*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_head_event:
1316*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= HEAD_EVENT;
1317*58e6ee5fSAndroid Build Coastguard Worker 			break;
1318*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_head_page:
1319*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= HEAD_PAGE;
1320*58e6ee5fSAndroid Build Coastguard Worker 			break;
1321*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_clock:
1322*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= CLOCK;
1323*58e6ee5fSAndroid Build Coastguard Worker 			break;
1324*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_verbose:
1325*58e6ee5fSAndroid Build Coastguard Worker 			if (trace_set_verbose(optarg) < 0)
1326*58e6ee5fSAndroid Build Coastguard Worker 				die("invalid verbose level %s", optarg);
1327*58e6ee5fSAndroid Build Coastguard Worker 			break;
1328*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_strings:
1329*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= STRINGS;
1330*58e6ee5fSAndroid Build Coastguard Worker 			break;
1331*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_sections:
1332*58e6ee5fSAndroid Build Coastguard Worker 			verbosity |= SECTIONS;
1333*58e6ee5fSAndroid Build Coastguard Worker 			break;
1334*58e6ee5fSAndroid Build Coastguard Worker 		default:
1335*58e6ee5fSAndroid Build Coastguard Worker 			usage(argv);
1336*58e6ee5fSAndroid Build Coastguard Worker 		}
1337*58e6ee5fSAndroid Build Coastguard Worker 	}
1338*58e6ee5fSAndroid Build Coastguard Worker 
1339*58e6ee5fSAndroid Build Coastguard Worker 	if ((argc - optind) >= 2) {
1340*58e6ee5fSAndroid Build Coastguard Worker 		if (input_file)
1341*58e6ee5fSAndroid Build Coastguard Worker 			usage(argv);
1342*58e6ee5fSAndroid Build Coastguard Worker 		input_file = argv[optind + 1];
1343*58e6ee5fSAndroid Build Coastguard Worker 	}
1344*58e6ee5fSAndroid Build Coastguard Worker 
1345*58e6ee5fSAndroid Build Coastguard Worker 	if (!input_file)
1346*58e6ee5fSAndroid Build Coastguard Worker 		input_file = DEFAULT_INPUT_FILE;
1347*58e6ee5fSAndroid Build Coastguard Worker 
1348*58e6ee5fSAndroid Build Coastguard Worker 	if (!verbosity && !validate)
1349*58e6ee5fSAndroid Build Coastguard Worker 		verbosity = SUMMARY;
1350*58e6ee5fSAndroid Build Coastguard Worker 
1351*58e6ee5fSAndroid Build Coastguard Worker 	dump_file(input_file);
1352*58e6ee5fSAndroid Build Coastguard Worker 
1353*58e6ee5fSAndroid Build Coastguard Worker 	if (validate)
1354*58e6ee5fSAndroid Build Coastguard Worker 		tracecmd_plog("File %s is a valid trace-cmd file\n", input_file);
1355*58e6ee5fSAndroid Build Coastguard Worker }
1356