18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci#include <dirent.h>
68c2ecf20Sopenharmony_ci#include <stdio.h>
78c2ecf20Sopenharmony_ci#include <stdlib.h>
88c2ecf20Sopenharmony_ci#include <string.h>
98c2ecf20Sopenharmony_ci#include <stdarg.h>
108c2ecf20Sopenharmony_ci#include <sys/types.h>
118c2ecf20Sopenharmony_ci#include <sys/stat.h>
128c2ecf20Sopenharmony_ci#include <sys/wait.h>
138c2ecf20Sopenharmony_ci#include <sys/mman.h>
148c2ecf20Sopenharmony_ci#include <fcntl.h>
158c2ecf20Sopenharmony_ci#include <unistd.h>
168c2ecf20Sopenharmony_ci#include <errno.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include "trace-event.h"
198c2ecf20Sopenharmony_ci#include "debug.h"
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic int input_fd;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistatic ssize_t trace_data_size;
248c2ecf20Sopenharmony_cistatic bool repipe;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic int __do_read(int fd, void *buf, int size)
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	int rsize = size;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	while (size) {
318c2ecf20Sopenharmony_ci		int ret = read(fd, buf, size);
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci		if (ret <= 0)
348c2ecf20Sopenharmony_ci			return -1;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci		if (repipe) {
378c2ecf20Sopenharmony_ci			int retw = write(STDOUT_FILENO, buf, ret);
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci			if (retw <= 0 || retw != ret) {
408c2ecf20Sopenharmony_ci				pr_debug("repiping input file");
418c2ecf20Sopenharmony_ci				return -1;
428c2ecf20Sopenharmony_ci			}
438c2ecf20Sopenharmony_ci		}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci		size -= ret;
468c2ecf20Sopenharmony_ci		buf += ret;
478c2ecf20Sopenharmony_ci	}
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	return rsize;
508c2ecf20Sopenharmony_ci}
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic int do_read(void *data, int size)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	int r;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	r = __do_read(input_fd, data, size);
578c2ecf20Sopenharmony_ci	if (r <= 0) {
588c2ecf20Sopenharmony_ci		pr_debug("reading input file (size expected=%d received=%d)",
598c2ecf20Sopenharmony_ci			 size, r);
608c2ecf20Sopenharmony_ci		return -1;
618c2ecf20Sopenharmony_ci	}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	trace_data_size += r;
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	return r;
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci/* If it fails, the next read will report it */
698c2ecf20Sopenharmony_cistatic void skip(int size)
708c2ecf20Sopenharmony_ci{
718c2ecf20Sopenharmony_ci	char buf[BUFSIZ];
728c2ecf20Sopenharmony_ci	int r;
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	while (size) {
758c2ecf20Sopenharmony_ci		r = size > BUFSIZ ? BUFSIZ : size;
768c2ecf20Sopenharmony_ci		do_read(buf, r);
778c2ecf20Sopenharmony_ci		size -= r;
788c2ecf20Sopenharmony_ci	}
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic unsigned int read4(struct tep_handle *pevent)
828c2ecf20Sopenharmony_ci{
838c2ecf20Sopenharmony_ci	unsigned int data;
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci	if (do_read(&data, 4) < 0)
868c2ecf20Sopenharmony_ci		return 0;
878c2ecf20Sopenharmony_ci	return tep_read_number(pevent, &data, 4);
888c2ecf20Sopenharmony_ci}
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cistatic unsigned long long read8(struct tep_handle *pevent)
918c2ecf20Sopenharmony_ci{
928c2ecf20Sopenharmony_ci	unsigned long long data;
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	if (do_read(&data, 8) < 0)
958c2ecf20Sopenharmony_ci		return 0;
968c2ecf20Sopenharmony_ci	return tep_read_number(pevent, &data, 8);
978c2ecf20Sopenharmony_ci}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic char *read_string(void)
1008c2ecf20Sopenharmony_ci{
1018c2ecf20Sopenharmony_ci	char buf[BUFSIZ];
1028c2ecf20Sopenharmony_ci	char *str = NULL;
1038c2ecf20Sopenharmony_ci	int size = 0;
1048c2ecf20Sopenharmony_ci	off_t r;
1058c2ecf20Sopenharmony_ci	char c;
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	for (;;) {
1088c2ecf20Sopenharmony_ci		r = read(input_fd, &c, 1);
1098c2ecf20Sopenharmony_ci		if (r < 0) {
1108c2ecf20Sopenharmony_ci			pr_debug("reading input file");
1118c2ecf20Sopenharmony_ci			goto out;
1128c2ecf20Sopenharmony_ci		}
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci		if (!r) {
1158c2ecf20Sopenharmony_ci			pr_debug("no data");
1168c2ecf20Sopenharmony_ci			goto out;
1178c2ecf20Sopenharmony_ci		}
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci		if (repipe) {
1208c2ecf20Sopenharmony_ci			int retw = write(STDOUT_FILENO, &c, 1);
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci			if (retw <= 0 || retw != r) {
1238c2ecf20Sopenharmony_ci				pr_debug("repiping input file string");
1248c2ecf20Sopenharmony_ci				goto out;
1258c2ecf20Sopenharmony_ci			}
1268c2ecf20Sopenharmony_ci		}
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci		buf[size++] = c;
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci		if (!c)
1318c2ecf20Sopenharmony_ci			break;
1328c2ecf20Sopenharmony_ci	}
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci	trace_data_size += size;
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	str = malloc(size);
1378c2ecf20Sopenharmony_ci	if (str)
1388c2ecf20Sopenharmony_ci		memcpy(str, buf, size);
1398c2ecf20Sopenharmony_ciout:
1408c2ecf20Sopenharmony_ci	return str;
1418c2ecf20Sopenharmony_ci}
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_cistatic int read_proc_kallsyms(struct tep_handle *pevent)
1448c2ecf20Sopenharmony_ci{
1458c2ecf20Sopenharmony_ci	unsigned int size;
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	size = read4(pevent);
1488c2ecf20Sopenharmony_ci	if (!size)
1498c2ecf20Sopenharmony_ci		return 0;
1508c2ecf20Sopenharmony_ci	/*
1518c2ecf20Sopenharmony_ci	 * Just skip it, now that we configure libtraceevent to use the
1528c2ecf20Sopenharmony_ci	 * tools/perf/ symbol resolver.
1538c2ecf20Sopenharmony_ci	 *
1548c2ecf20Sopenharmony_ci	 * We need to skip it so that we can continue parsing old perf.data
1558c2ecf20Sopenharmony_ci	 * files, that contains this /proc/kallsyms payload.
1568c2ecf20Sopenharmony_ci	 *
1578c2ecf20Sopenharmony_ci	 * Newer perf.data files will have just the 4-bytes zeros "kallsyms
1588c2ecf20Sopenharmony_ci	 * payload", so that older tools can continue reading it and interpret
1598c2ecf20Sopenharmony_ci	 * it as "no kallsyms payload is present".
1608c2ecf20Sopenharmony_ci	 */
1618c2ecf20Sopenharmony_ci	lseek(input_fd, size, SEEK_CUR);
1628c2ecf20Sopenharmony_ci	trace_data_size += size;
1638c2ecf20Sopenharmony_ci	return 0;
1648c2ecf20Sopenharmony_ci}
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_cistatic int read_ftrace_printk(struct tep_handle *pevent)
1678c2ecf20Sopenharmony_ci{
1688c2ecf20Sopenharmony_ci	unsigned int size;
1698c2ecf20Sopenharmony_ci	char *buf;
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci	/* it can have 0 size */
1728c2ecf20Sopenharmony_ci	size = read4(pevent);
1738c2ecf20Sopenharmony_ci	if (!size)
1748c2ecf20Sopenharmony_ci		return 0;
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci	buf = malloc(size + 1);
1778c2ecf20Sopenharmony_ci	if (buf == NULL)
1788c2ecf20Sopenharmony_ci		return -1;
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci	if (do_read(buf, size) < 0) {
1818c2ecf20Sopenharmony_ci		free(buf);
1828c2ecf20Sopenharmony_ci		return -1;
1838c2ecf20Sopenharmony_ci	}
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	buf[size] = '\0';
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	parse_ftrace_printk(pevent, buf, size);
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	free(buf);
1908c2ecf20Sopenharmony_ci	return 0;
1918c2ecf20Sopenharmony_ci}
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_cistatic int read_header_files(struct tep_handle *pevent)
1948c2ecf20Sopenharmony_ci{
1958c2ecf20Sopenharmony_ci	unsigned long long size;
1968c2ecf20Sopenharmony_ci	char *header_page;
1978c2ecf20Sopenharmony_ci	char buf[BUFSIZ];
1988c2ecf20Sopenharmony_ci	int ret = 0;
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci	if (do_read(buf, 12) < 0)
2018c2ecf20Sopenharmony_ci		return -1;
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	if (memcmp(buf, "header_page", 12) != 0) {
2048c2ecf20Sopenharmony_ci		pr_debug("did not read header page");
2058c2ecf20Sopenharmony_ci		return -1;
2068c2ecf20Sopenharmony_ci	}
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci	size = read8(pevent);
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	header_page = malloc(size);
2118c2ecf20Sopenharmony_ci	if (header_page == NULL)
2128c2ecf20Sopenharmony_ci		return -1;
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci	if (do_read(header_page, size) < 0) {
2158c2ecf20Sopenharmony_ci		pr_debug("did not read header page");
2168c2ecf20Sopenharmony_ci		free(header_page);
2178c2ecf20Sopenharmony_ci		return -1;
2188c2ecf20Sopenharmony_ci	}
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	if (!tep_parse_header_page(pevent, header_page, size,
2218c2ecf20Sopenharmony_ci				   tep_get_long_size(pevent))) {
2228c2ecf20Sopenharmony_ci		/*
2238c2ecf20Sopenharmony_ci		 * The commit field in the page is of type long,
2248c2ecf20Sopenharmony_ci		 * use that instead, since it represents the kernel.
2258c2ecf20Sopenharmony_ci		 */
2268c2ecf20Sopenharmony_ci		tep_set_long_size(pevent, tep_get_header_page_size(pevent));
2278c2ecf20Sopenharmony_ci	}
2288c2ecf20Sopenharmony_ci	free(header_page);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	if (do_read(buf, 13) < 0)
2318c2ecf20Sopenharmony_ci		return -1;
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	if (memcmp(buf, "header_event", 13) != 0) {
2348c2ecf20Sopenharmony_ci		pr_debug("did not read header event");
2358c2ecf20Sopenharmony_ci		return -1;
2368c2ecf20Sopenharmony_ci	}
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci	size = read8(pevent);
2398c2ecf20Sopenharmony_ci	skip(size);
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	return ret;
2428c2ecf20Sopenharmony_ci}
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_cistatic int read_ftrace_file(struct tep_handle *pevent, unsigned long long size)
2458c2ecf20Sopenharmony_ci{
2468c2ecf20Sopenharmony_ci	int ret;
2478c2ecf20Sopenharmony_ci	char *buf;
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci	buf = malloc(size);
2508c2ecf20Sopenharmony_ci	if (buf == NULL) {
2518c2ecf20Sopenharmony_ci		pr_debug("memory allocation failure\n");
2528c2ecf20Sopenharmony_ci		return -1;
2538c2ecf20Sopenharmony_ci	}
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci	ret = do_read(buf, size);
2568c2ecf20Sopenharmony_ci	if (ret < 0) {
2578c2ecf20Sopenharmony_ci		pr_debug("error reading ftrace file.\n");
2588c2ecf20Sopenharmony_ci		goto out;
2598c2ecf20Sopenharmony_ci	}
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	ret = parse_ftrace_file(pevent, buf, size);
2628c2ecf20Sopenharmony_ci	if (ret < 0)
2638c2ecf20Sopenharmony_ci		pr_debug("error parsing ftrace file.\n");
2648c2ecf20Sopenharmony_ciout:
2658c2ecf20Sopenharmony_ci	free(buf);
2668c2ecf20Sopenharmony_ci	return ret;
2678c2ecf20Sopenharmony_ci}
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_cistatic int read_event_file(struct tep_handle *pevent, char *sys,
2708c2ecf20Sopenharmony_ci			   unsigned long long size)
2718c2ecf20Sopenharmony_ci{
2728c2ecf20Sopenharmony_ci	int ret;
2738c2ecf20Sopenharmony_ci	char *buf;
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	buf = malloc(size);
2768c2ecf20Sopenharmony_ci	if (buf == NULL) {
2778c2ecf20Sopenharmony_ci		pr_debug("memory allocation failure\n");
2788c2ecf20Sopenharmony_ci		return -1;
2798c2ecf20Sopenharmony_ci	}
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	ret = do_read(buf, size);
2828c2ecf20Sopenharmony_ci	if (ret < 0)
2838c2ecf20Sopenharmony_ci		goto out;
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	ret = parse_event_file(pevent, buf, size, sys);
2868c2ecf20Sopenharmony_ci	if (ret < 0)
2878c2ecf20Sopenharmony_ci		pr_debug("error parsing event file.\n");
2888c2ecf20Sopenharmony_ciout:
2898c2ecf20Sopenharmony_ci	free(buf);
2908c2ecf20Sopenharmony_ci	return ret;
2918c2ecf20Sopenharmony_ci}
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_cistatic int read_ftrace_files(struct tep_handle *pevent)
2948c2ecf20Sopenharmony_ci{
2958c2ecf20Sopenharmony_ci	unsigned long long size;
2968c2ecf20Sopenharmony_ci	int count;
2978c2ecf20Sopenharmony_ci	int i;
2988c2ecf20Sopenharmony_ci	int ret;
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci	count = read4(pevent);
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci	for (i = 0; i < count; i++) {
3038c2ecf20Sopenharmony_ci		size = read8(pevent);
3048c2ecf20Sopenharmony_ci		ret = read_ftrace_file(pevent, size);
3058c2ecf20Sopenharmony_ci		if (ret)
3068c2ecf20Sopenharmony_ci			return ret;
3078c2ecf20Sopenharmony_ci	}
3088c2ecf20Sopenharmony_ci	return 0;
3098c2ecf20Sopenharmony_ci}
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_cistatic int read_event_files(struct tep_handle *pevent)
3128c2ecf20Sopenharmony_ci{
3138c2ecf20Sopenharmony_ci	unsigned long long size;
3148c2ecf20Sopenharmony_ci	char *sys;
3158c2ecf20Sopenharmony_ci	int systems;
3168c2ecf20Sopenharmony_ci	int count;
3178c2ecf20Sopenharmony_ci	int i,x;
3188c2ecf20Sopenharmony_ci	int ret;
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	systems = read4(pevent);
3218c2ecf20Sopenharmony_ci
3228c2ecf20Sopenharmony_ci	for (i = 0; i < systems; i++) {
3238c2ecf20Sopenharmony_ci		sys = read_string();
3248c2ecf20Sopenharmony_ci		if (sys == NULL)
3258c2ecf20Sopenharmony_ci			return -1;
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_ci		count = read4(pevent);
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ci		for (x=0; x < count; x++) {
3308c2ecf20Sopenharmony_ci			size = read8(pevent);
3318c2ecf20Sopenharmony_ci			ret = read_event_file(pevent, sys, size);
3328c2ecf20Sopenharmony_ci			if (ret) {
3338c2ecf20Sopenharmony_ci				free(sys);
3348c2ecf20Sopenharmony_ci				return ret;
3358c2ecf20Sopenharmony_ci			}
3368c2ecf20Sopenharmony_ci		}
3378c2ecf20Sopenharmony_ci		free(sys);
3388c2ecf20Sopenharmony_ci	}
3398c2ecf20Sopenharmony_ci	return 0;
3408c2ecf20Sopenharmony_ci}
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_cistatic int read_saved_cmdline(struct tep_handle *pevent)
3438c2ecf20Sopenharmony_ci{
3448c2ecf20Sopenharmony_ci	unsigned long long size;
3458c2ecf20Sopenharmony_ci	char *buf;
3468c2ecf20Sopenharmony_ci	int ret;
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci	/* it can have 0 size */
3498c2ecf20Sopenharmony_ci	size = read8(pevent);
3508c2ecf20Sopenharmony_ci	if (!size)
3518c2ecf20Sopenharmony_ci		return 0;
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci	buf = malloc(size + 1);
3548c2ecf20Sopenharmony_ci	if (buf == NULL) {
3558c2ecf20Sopenharmony_ci		pr_debug("memory allocation failure\n");
3568c2ecf20Sopenharmony_ci		return -1;
3578c2ecf20Sopenharmony_ci	}
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	ret = do_read(buf, size);
3608c2ecf20Sopenharmony_ci	if (ret < 0) {
3618c2ecf20Sopenharmony_ci		pr_debug("error reading saved cmdlines\n");
3628c2ecf20Sopenharmony_ci		goto out;
3638c2ecf20Sopenharmony_ci	}
3648c2ecf20Sopenharmony_ci	buf[ret] = '\0';
3658c2ecf20Sopenharmony_ci
3668c2ecf20Sopenharmony_ci	parse_saved_cmdline(pevent, buf, size);
3678c2ecf20Sopenharmony_ci	ret = 0;
3688c2ecf20Sopenharmony_ciout:
3698c2ecf20Sopenharmony_ci	free(buf);
3708c2ecf20Sopenharmony_ci	return ret;
3718c2ecf20Sopenharmony_ci}
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_cissize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
3748c2ecf20Sopenharmony_ci{
3758c2ecf20Sopenharmony_ci	char buf[BUFSIZ];
3768c2ecf20Sopenharmony_ci	char test[] = { 23, 8, 68 };
3778c2ecf20Sopenharmony_ci	char *version;
3788c2ecf20Sopenharmony_ci	int show_version = 0;
3798c2ecf20Sopenharmony_ci	int show_funcs = 0;
3808c2ecf20Sopenharmony_ci	int show_printk = 0;
3818c2ecf20Sopenharmony_ci	ssize_t size = -1;
3828c2ecf20Sopenharmony_ci	int file_bigendian;
3838c2ecf20Sopenharmony_ci	int host_bigendian;
3848c2ecf20Sopenharmony_ci	int file_long_size;
3858c2ecf20Sopenharmony_ci	int file_page_size;
3868c2ecf20Sopenharmony_ci	struct tep_handle *pevent = NULL;
3878c2ecf20Sopenharmony_ci	int err;
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	repipe = __repipe;
3908c2ecf20Sopenharmony_ci	input_fd = fd;
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci	if (do_read(buf, 3) < 0)
3938c2ecf20Sopenharmony_ci		return -1;
3948c2ecf20Sopenharmony_ci	if (memcmp(buf, test, 3) != 0) {
3958c2ecf20Sopenharmony_ci		pr_debug("no trace data in the file");
3968c2ecf20Sopenharmony_ci		return -1;
3978c2ecf20Sopenharmony_ci	}
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci	if (do_read(buf, 7) < 0)
4008c2ecf20Sopenharmony_ci		return -1;
4018c2ecf20Sopenharmony_ci	if (memcmp(buf, "tracing", 7) != 0) {
4028c2ecf20Sopenharmony_ci		pr_debug("not a trace file (missing 'tracing' tag)");
4038c2ecf20Sopenharmony_ci		return -1;
4048c2ecf20Sopenharmony_ci	}
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci	version = read_string();
4078c2ecf20Sopenharmony_ci	if (version == NULL)
4088c2ecf20Sopenharmony_ci		return -1;
4098c2ecf20Sopenharmony_ci	if (show_version)
4108c2ecf20Sopenharmony_ci		printf("version = %s\n", version);
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_ci	if (do_read(buf, 1) < 0) {
4138c2ecf20Sopenharmony_ci		free(version);
4148c2ecf20Sopenharmony_ci		return -1;
4158c2ecf20Sopenharmony_ci	}
4168c2ecf20Sopenharmony_ci	file_bigendian = buf[0];
4178c2ecf20Sopenharmony_ci	host_bigendian = bigendian();
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci	if (trace_event__init(tevent)) {
4208c2ecf20Sopenharmony_ci		pr_debug("trace_event__init failed");
4218c2ecf20Sopenharmony_ci		goto out;
4228c2ecf20Sopenharmony_ci	}
4238c2ecf20Sopenharmony_ci
4248c2ecf20Sopenharmony_ci	pevent = tevent->pevent;
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	tep_set_flag(pevent, TEP_NSEC_OUTPUT);
4278c2ecf20Sopenharmony_ci	tep_set_file_bigendian(pevent, file_bigendian);
4288c2ecf20Sopenharmony_ci	tep_set_local_bigendian(pevent, host_bigendian);
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci	if (do_read(buf, 1) < 0)
4318c2ecf20Sopenharmony_ci		goto out;
4328c2ecf20Sopenharmony_ci	file_long_size = buf[0];
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	file_page_size = read4(pevent);
4358c2ecf20Sopenharmony_ci	if (!file_page_size)
4368c2ecf20Sopenharmony_ci		goto out;
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	tep_set_long_size(pevent, file_long_size);
4398c2ecf20Sopenharmony_ci	tep_set_page_size(pevent, file_page_size);
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_ci	err = read_header_files(pevent);
4428c2ecf20Sopenharmony_ci	if (err)
4438c2ecf20Sopenharmony_ci		goto out;
4448c2ecf20Sopenharmony_ci	err = read_ftrace_files(pevent);
4458c2ecf20Sopenharmony_ci	if (err)
4468c2ecf20Sopenharmony_ci		goto out;
4478c2ecf20Sopenharmony_ci	err = read_event_files(pevent);
4488c2ecf20Sopenharmony_ci	if (err)
4498c2ecf20Sopenharmony_ci		goto out;
4508c2ecf20Sopenharmony_ci	err = read_proc_kallsyms(pevent);
4518c2ecf20Sopenharmony_ci	if (err)
4528c2ecf20Sopenharmony_ci		goto out;
4538c2ecf20Sopenharmony_ci	err = read_ftrace_printk(pevent);
4548c2ecf20Sopenharmony_ci	if (err)
4558c2ecf20Sopenharmony_ci		goto out;
4568c2ecf20Sopenharmony_ci	if (atof(version) >= 0.6) {
4578c2ecf20Sopenharmony_ci		err = read_saved_cmdline(pevent);
4588c2ecf20Sopenharmony_ci		if (err)
4598c2ecf20Sopenharmony_ci			goto out;
4608c2ecf20Sopenharmony_ci	}
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci	size = trace_data_size;
4638c2ecf20Sopenharmony_ci	repipe = false;
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	if (show_funcs) {
4668c2ecf20Sopenharmony_ci		tep_print_funcs(pevent);
4678c2ecf20Sopenharmony_ci	} else if (show_printk) {
4688c2ecf20Sopenharmony_ci		tep_print_printk(pevent);
4698c2ecf20Sopenharmony_ci	}
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ci	pevent = NULL;
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ciout:
4748c2ecf20Sopenharmony_ci	if (pevent)
4758c2ecf20Sopenharmony_ci		trace_event__cleanup(tevent);
4768c2ecf20Sopenharmony_ci	free(version);
4778c2ecf20Sopenharmony_ci	return size;
4788c2ecf20Sopenharmony_ci}
479