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 */
6*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
7*58e6ee5fSAndroid Build Coastguard Worker #include <getopt.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <errno.h>
9*58e6ee5fSAndroid Build Coastguard Worker
10*58e6ee5fSAndroid Build Coastguard Worker #include "tracefs.h"
11*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
12*58e6ee5fSAndroid Build Coastguard Worker
13*58e6ee5fSAndroid Build Coastguard Worker enum {
14*58e6ee5fSAndroid Build Coastguard Worker OPT_verbose = 255,
15*58e6ee5fSAndroid Build Coastguard Worker };
16*58e6ee5fSAndroid Build Coastguard Worker
trace_check_events(int argc,char ** argv)17*58e6ee5fSAndroid Build Coastguard Worker void trace_check_events(int argc, char **argv)
18*58e6ee5fSAndroid Build Coastguard Worker {
19*58e6ee5fSAndroid Build Coastguard Worker const char *tracing;
20*58e6ee5fSAndroid Build Coastguard Worker int ret, c;
21*58e6ee5fSAndroid Build Coastguard Worker int parsing_failures = 0;
22*58e6ee5fSAndroid Build Coastguard Worker struct tep_handle *pevent = NULL;
23*58e6ee5fSAndroid Build Coastguard Worker struct tep_plugin_list *list = NULL;
24*58e6ee5fSAndroid Build Coastguard Worker int open_flags = 0;
25*58e6ee5fSAndroid Build Coastguard Worker int option_index = 0;
26*58e6ee5fSAndroid Build Coastguard Worker static struct option long_options[] = {
27*58e6ee5fSAndroid Build Coastguard Worker {"verbose", optional_argument, NULL, OPT_verbose},
28*58e6ee5fSAndroid Build Coastguard Worker {NULL, 0, NULL, 0}
29*58e6ee5fSAndroid Build Coastguard Worker };
30*58e6ee5fSAndroid Build Coastguard Worker
31*58e6ee5fSAndroid Build Coastguard Worker
32*58e6ee5fSAndroid Build Coastguard Worker while ((c = getopt_long(argc-1, argv+1, "+hN", long_options, &option_index)) >= 0) {
33*58e6ee5fSAndroid Build Coastguard Worker switch (c) {
34*58e6ee5fSAndroid Build Coastguard Worker case 'h':
35*58e6ee5fSAndroid Build Coastguard Worker default:
36*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
37*58e6ee5fSAndroid Build Coastguard Worker break;
38*58e6ee5fSAndroid Build Coastguard Worker case 'N':
39*58e6ee5fSAndroid Build Coastguard Worker open_flags |= TRACECMD_FL_LOAD_NO_PLUGINS;
40*58e6ee5fSAndroid Build Coastguard Worker break;
41*58e6ee5fSAndroid Build Coastguard Worker case OPT_verbose:
42*58e6ee5fSAndroid Build Coastguard Worker if (trace_set_verbose(optarg) < 0)
43*58e6ee5fSAndroid Build Coastguard Worker die("invalid verbose level %s", optarg);
44*58e6ee5fSAndroid Build Coastguard Worker break;
45*58e6ee5fSAndroid Build Coastguard Worker }
46*58e6ee5fSAndroid Build Coastguard Worker }
47*58e6ee5fSAndroid Build Coastguard Worker tracing = tracefs_tracing_dir();
48*58e6ee5fSAndroid Build Coastguard Worker
49*58e6ee5fSAndroid Build Coastguard Worker if (!tracing) {
50*58e6ee5fSAndroid Build Coastguard Worker printf("Can not find or mount tracing directory!\n"
51*58e6ee5fSAndroid Build Coastguard Worker "Either tracing is not configured for this "
52*58e6ee5fSAndroid Build Coastguard Worker "kernel\n"
53*58e6ee5fSAndroid Build Coastguard Worker "or you do not have the proper permissions to "
54*58e6ee5fSAndroid Build Coastguard Worker "mount the directory");
55*58e6ee5fSAndroid Build Coastguard Worker exit(EINVAL);
56*58e6ee5fSAndroid Build Coastguard Worker }
57*58e6ee5fSAndroid Build Coastguard Worker
58*58e6ee5fSAndroid Build Coastguard Worker pevent = tep_alloc();
59*58e6ee5fSAndroid Build Coastguard Worker if (!pevent)
60*58e6ee5fSAndroid Build Coastguard Worker exit(EINVAL);
61*58e6ee5fSAndroid Build Coastguard Worker
62*58e6ee5fSAndroid Build Coastguard Worker list = trace_load_plugins(pevent, open_flags);
63*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_fill_local_events(tracing, pevent, &parsing_failures);
64*58e6ee5fSAndroid Build Coastguard Worker if (ret || parsing_failures)
65*58e6ee5fSAndroid Build Coastguard Worker ret = EINVAL;
66*58e6ee5fSAndroid Build Coastguard Worker tep_unload_plugins(list, pevent);
67*58e6ee5fSAndroid Build Coastguard Worker tep_free(pevent);
68*58e6ee5fSAndroid Build Coastguard Worker
69*58e6ee5fSAndroid Build Coastguard Worker return;
70*58e6ee5fSAndroid Build Coastguard Worker }
71