18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/compiler.h>
38c2ecf20Sopenharmony_ci#include <stdio.h>
48c2ecf20Sopenharmony_ci#include <string.h>
58c2ecf20Sopenharmony_ci#include "builtin.h"
68c2ecf20Sopenharmony_ci#include "perf.h"
78c2ecf20Sopenharmony_ci#include "debug.h"
88c2ecf20Sopenharmony_ci#include <subcmd/parse-options.h>
98c2ecf20Sopenharmony_ci#include "data-convert.h"
108c2ecf20Sopenharmony_ci#include "data-convert-bt.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_citypedef int (*data_cmd_fn_t)(int argc, const char **argv);
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistruct data_cmd {
158c2ecf20Sopenharmony_ci	const char	*name;
168c2ecf20Sopenharmony_ci	const char	*summary;
178c2ecf20Sopenharmony_ci	data_cmd_fn_t	fn;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistatic struct data_cmd data_cmds[];
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#define for_each_cmd(cmd) \
238c2ecf20Sopenharmony_ci	for (cmd = data_cmds; cmd && cmd->name; cmd++)
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistatic const struct option data_options[] = {
268c2ecf20Sopenharmony_ci	OPT_END()
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistatic const char * const data_subcommands[] = { "convert", NULL };
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic const char *data_usage[] = {
328c2ecf20Sopenharmony_ci	"perf data [<common options>] <command> [<options>]",
338c2ecf20Sopenharmony_ci	NULL
348c2ecf20Sopenharmony_ci};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistatic void print_usage(void)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	struct data_cmd *cmd;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	printf("Usage:\n");
418c2ecf20Sopenharmony_ci	printf("\t%s\n\n", data_usage[0]);
428c2ecf20Sopenharmony_ci	printf("\tAvailable commands:\n");
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	for_each_cmd(cmd) {
458c2ecf20Sopenharmony_ci		printf("\t %s\t- %s\n", cmd->name, cmd->summary);
468c2ecf20Sopenharmony_ci	}
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	printf("\n");
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic const char * const data_convert_usage[] = {
528c2ecf20Sopenharmony_ci	"perf data convert [<options>]",
538c2ecf20Sopenharmony_ci	NULL
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_cistatic int cmd_data_convert(int argc, const char **argv)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	const char *to_ctf     = NULL;
598c2ecf20Sopenharmony_ci	struct perf_data_convert_opts opts = {
608c2ecf20Sopenharmony_ci		.force = false,
618c2ecf20Sopenharmony_ci		.all = false,
628c2ecf20Sopenharmony_ci	};
638c2ecf20Sopenharmony_ci	const struct option options[] = {
648c2ecf20Sopenharmony_ci		OPT_INCR('v', "verbose", &verbose, "be more verbose"),
658c2ecf20Sopenharmony_ci		OPT_STRING('i', "input", &input_name, "file", "input file name"),
668c2ecf20Sopenharmony_ci#ifdef HAVE_LIBBABELTRACE_SUPPORT
678c2ecf20Sopenharmony_ci		OPT_STRING(0, "to-ctf", &to_ctf, NULL, "Convert to CTF format"),
688c2ecf20Sopenharmony_ci		OPT_BOOLEAN(0, "tod", &opts.tod, "Convert time to wall clock time"),
698c2ecf20Sopenharmony_ci#endif
708c2ecf20Sopenharmony_ci		OPT_BOOLEAN('f', "force", &opts.force, "don't complain, do it"),
718c2ecf20Sopenharmony_ci		OPT_BOOLEAN(0, "all", &opts.all, "Convert all events"),
728c2ecf20Sopenharmony_ci		OPT_END()
738c2ecf20Sopenharmony_ci	};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#ifndef HAVE_LIBBABELTRACE_SUPPORT
768c2ecf20Sopenharmony_ci	pr_err("No conversion support compiled in. perf should be compiled with environment variables LIBBABELTRACE=1 and LIBBABELTRACE_DIR=/path/to/libbabeltrace/\n");
778c2ecf20Sopenharmony_ci	return -1;
788c2ecf20Sopenharmony_ci#endif
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	argc = parse_options(argc, argv, options,
818c2ecf20Sopenharmony_ci			     data_convert_usage, 0);
828c2ecf20Sopenharmony_ci	if (argc) {
838c2ecf20Sopenharmony_ci		usage_with_options(data_convert_usage, options);
848c2ecf20Sopenharmony_ci		return -1;
858c2ecf20Sopenharmony_ci	}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	if (to_ctf) {
888c2ecf20Sopenharmony_ci#ifdef HAVE_LIBBABELTRACE_SUPPORT
898c2ecf20Sopenharmony_ci		return bt_convert__perf2ctf(input_name, to_ctf, &opts);
908c2ecf20Sopenharmony_ci#else
918c2ecf20Sopenharmony_ci		pr_err("The libbabeltrace support is not compiled in.\n");
928c2ecf20Sopenharmony_ci		return -1;
938c2ecf20Sopenharmony_ci#endif
948c2ecf20Sopenharmony_ci	}
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci	return 0;
978c2ecf20Sopenharmony_ci}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic struct data_cmd data_cmds[] = {
1008c2ecf20Sopenharmony_ci	{ "convert", "converts data file between formats", cmd_data_convert },
1018c2ecf20Sopenharmony_ci	{ .name = NULL, },
1028c2ecf20Sopenharmony_ci};
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ciint cmd_data(int argc, const char **argv)
1058c2ecf20Sopenharmony_ci{
1068c2ecf20Sopenharmony_ci	struct data_cmd *cmd;
1078c2ecf20Sopenharmony_ci	const char *cmdstr;
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	/* No command specified. */
1108c2ecf20Sopenharmony_ci	if (argc < 2)
1118c2ecf20Sopenharmony_ci		goto usage;
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	argc = parse_options_subcommand(argc, argv, data_options, data_subcommands, data_usage,
1148c2ecf20Sopenharmony_ci			     PARSE_OPT_STOP_AT_NON_OPTION);
1158c2ecf20Sopenharmony_ci	if (argc < 1)
1168c2ecf20Sopenharmony_ci		goto usage;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	cmdstr = argv[0];
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	for_each_cmd(cmd) {
1218c2ecf20Sopenharmony_ci		if (strcmp(cmd->name, cmdstr))
1228c2ecf20Sopenharmony_ci			continue;
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci		return cmd->fn(argc, argv);
1258c2ecf20Sopenharmony_ci	}
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	pr_err("Unknown command: %s\n", cmdstr);
1288c2ecf20Sopenharmony_ciusage:
1298c2ecf20Sopenharmony_ci	print_usage();
1308c2ecf20Sopenharmony_ci	return -1;
1318c2ecf20Sopenharmony_ci}
132