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_tracing_on = 255,
15*58e6ee5fSAndroid Build Coastguard Worker OPT_current_tracer = 254,
16*58e6ee5fSAndroid Build Coastguard Worker OPT_buffer_size_kb = 253,
17*58e6ee5fSAndroid Build Coastguard Worker OPT_buffer_total_size_kb = 252,
18*58e6ee5fSAndroid Build Coastguard Worker OPT_ftrace_filter = 251,
19*58e6ee5fSAndroid Build Coastguard Worker OPT_ftrace_notrace = 250,
20*58e6ee5fSAndroid Build Coastguard Worker OPT_ftrace_pid = 249,
21*58e6ee5fSAndroid Build Coastguard Worker OPT_graph_function = 248,
22*58e6ee5fSAndroid Build Coastguard Worker OPT_graph_notrace = 247,
23*58e6ee5fSAndroid Build Coastguard Worker OPT_cpumask = 246,
24*58e6ee5fSAndroid Build Coastguard Worker };
25*58e6ee5fSAndroid Build Coastguard Worker
trace_show(int argc,char ** argv)26*58e6ee5fSAndroid Build Coastguard Worker void trace_show(int argc, char **argv)
27*58e6ee5fSAndroid Build Coastguard Worker {
28*58e6ee5fSAndroid Build Coastguard Worker const char *buffer = NULL;
29*58e6ee5fSAndroid Build Coastguard Worker const char *file = "trace";
30*58e6ee5fSAndroid Build Coastguard Worker const char *cpu = NULL;
31*58e6ee5fSAndroid Build Coastguard Worker struct buffer_instance *instance = &top_instance;
32*58e6ee5fSAndroid Build Coastguard Worker char cpu_path[128];
33*58e6ee5fSAndroid Build Coastguard Worker char *path;
34*58e6ee5fSAndroid Build Coastguard Worker int snap = 0;
35*58e6ee5fSAndroid Build Coastguard Worker int pipe = 0;
36*58e6ee5fSAndroid Build Coastguard Worker int show_name = 0;
37*58e6ee5fSAndroid Build Coastguard Worker int option_index = 0;
38*58e6ee5fSAndroid Build Coastguard Worker int stop = 0;
39*58e6ee5fSAndroid Build Coastguard Worker int c;
40*58e6ee5fSAndroid Build Coastguard Worker static struct option long_options[] = {
41*58e6ee5fSAndroid Build Coastguard Worker {"tracing_on", no_argument, NULL, OPT_tracing_on},
42*58e6ee5fSAndroid Build Coastguard Worker {"current_tracer", no_argument, NULL, OPT_current_tracer},
43*58e6ee5fSAndroid Build Coastguard Worker {"buffer_size", no_argument, NULL, OPT_buffer_size_kb},
44*58e6ee5fSAndroid Build Coastguard Worker {"buffer_total_size", no_argument, NULL, OPT_buffer_total_size_kb},
45*58e6ee5fSAndroid Build Coastguard Worker {"ftrace_filter", no_argument, NULL, OPT_ftrace_filter},
46*58e6ee5fSAndroid Build Coastguard Worker {"ftrace_notrace", no_argument, NULL, OPT_ftrace_notrace},
47*58e6ee5fSAndroid Build Coastguard Worker {"ftrace_pid", no_argument, NULL, OPT_ftrace_pid},
48*58e6ee5fSAndroid Build Coastguard Worker {"graph_function", no_argument, NULL, OPT_graph_function},
49*58e6ee5fSAndroid Build Coastguard Worker {"graph_notrace", no_argument, NULL, OPT_graph_notrace},
50*58e6ee5fSAndroid Build Coastguard Worker {"cpumask", no_argument, NULL, OPT_cpumask},
51*58e6ee5fSAndroid Build Coastguard Worker {"help", no_argument, NULL, '?'},
52*58e6ee5fSAndroid Build Coastguard Worker {NULL, 0, NULL, 0}
53*58e6ee5fSAndroid Build Coastguard Worker };
54*58e6ee5fSAndroid Build Coastguard Worker
55*58e6ee5fSAndroid Build Coastguard Worker init_top_instance();
56*58e6ee5fSAndroid Build Coastguard Worker
57*58e6ee5fSAndroid Build Coastguard Worker while ((c = getopt_long(argc-1, argv+1, "B:c:fsp",
58*58e6ee5fSAndroid Build Coastguard Worker long_options, &option_index)) >= 0) {
59*58e6ee5fSAndroid Build Coastguard Worker switch (c) {
60*58e6ee5fSAndroid Build Coastguard Worker case 'h':
61*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
62*58e6ee5fSAndroid Build Coastguard Worker break;
63*58e6ee5fSAndroid Build Coastguard Worker case 'B':
64*58e6ee5fSAndroid Build Coastguard Worker if (buffer)
65*58e6ee5fSAndroid Build Coastguard Worker die("Can only show one buffer at a time");
66*58e6ee5fSAndroid Build Coastguard Worker buffer = optarg;
67*58e6ee5fSAndroid Build Coastguard Worker instance = allocate_instance(optarg);
68*58e6ee5fSAndroid Build Coastguard Worker if (!instance)
69*58e6ee5fSAndroid Build Coastguard Worker die("Failed to create instance");
70*58e6ee5fSAndroid Build Coastguard Worker break;
71*58e6ee5fSAndroid Build Coastguard Worker case 'c':
72*58e6ee5fSAndroid Build Coastguard Worker if (cpu)
73*58e6ee5fSAndroid Build Coastguard Worker die("Can only show one CPU at a time");
74*58e6ee5fSAndroid Build Coastguard Worker cpu = optarg;
75*58e6ee5fSAndroid Build Coastguard Worker break;
76*58e6ee5fSAndroid Build Coastguard Worker case 'f':
77*58e6ee5fSAndroid Build Coastguard Worker show_name = 1;
78*58e6ee5fSAndroid Build Coastguard Worker break;
79*58e6ee5fSAndroid Build Coastguard Worker case 's':
80*58e6ee5fSAndroid Build Coastguard Worker snap = 1;
81*58e6ee5fSAndroid Build Coastguard Worker if (pipe)
82*58e6ee5fSAndroid Build Coastguard Worker die("Can not have -s and -p together");
83*58e6ee5fSAndroid Build Coastguard Worker break;
84*58e6ee5fSAndroid Build Coastguard Worker case 'p':
85*58e6ee5fSAndroid Build Coastguard Worker pipe = 1;
86*58e6ee5fSAndroid Build Coastguard Worker if (snap)
87*58e6ee5fSAndroid Build Coastguard Worker die("Can not have -s and -p together");
88*58e6ee5fSAndroid Build Coastguard Worker break;
89*58e6ee5fSAndroid Build Coastguard Worker case OPT_tracing_on:
90*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "tracing_on");
91*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
92*58e6ee5fSAndroid Build Coastguard Worker break;
93*58e6ee5fSAndroid Build Coastguard Worker case OPT_current_tracer:
94*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "current_tracer");
95*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
96*58e6ee5fSAndroid Build Coastguard Worker break;
97*58e6ee5fSAndroid Build Coastguard Worker case OPT_buffer_size_kb:
98*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "buffer_size_kb");
99*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
100*58e6ee5fSAndroid Build Coastguard Worker break;
101*58e6ee5fSAndroid Build Coastguard Worker case OPT_buffer_total_size_kb:
102*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "buffer_total_size_kb");
103*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
104*58e6ee5fSAndroid Build Coastguard Worker break;
105*58e6ee5fSAndroid Build Coastguard Worker case OPT_ftrace_filter:
106*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "set_ftrace_filter");
107*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
108*58e6ee5fSAndroid Build Coastguard Worker break;
109*58e6ee5fSAndroid Build Coastguard Worker case OPT_ftrace_notrace:
110*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "set_ftrace_notrace");
111*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
112*58e6ee5fSAndroid Build Coastguard Worker break;
113*58e6ee5fSAndroid Build Coastguard Worker case OPT_ftrace_pid:
114*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "set_ftrace_pid");
115*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
116*58e6ee5fSAndroid Build Coastguard Worker break;
117*58e6ee5fSAndroid Build Coastguard Worker case OPT_graph_function:
118*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "set_graph_function");
119*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
120*58e6ee5fSAndroid Build Coastguard Worker break;
121*58e6ee5fSAndroid Build Coastguard Worker case OPT_graph_notrace:
122*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "set_graph_notrace");
123*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
124*58e6ee5fSAndroid Build Coastguard Worker break;
125*58e6ee5fSAndroid Build Coastguard Worker case OPT_cpumask:
126*58e6ee5fSAndroid Build Coastguard Worker show_instance_file(instance, "tracing_cpumask");
127*58e6ee5fSAndroid Build Coastguard Worker stop = 1;
128*58e6ee5fSAndroid Build Coastguard Worker break;
129*58e6ee5fSAndroid Build Coastguard Worker default:
130*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
131*58e6ee5fSAndroid Build Coastguard Worker }
132*58e6ee5fSAndroid Build Coastguard Worker }
133*58e6ee5fSAndroid Build Coastguard Worker if (stop)
134*58e6ee5fSAndroid Build Coastguard Worker exit(0);
135*58e6ee5fSAndroid Build Coastguard Worker if (pipe)
136*58e6ee5fSAndroid Build Coastguard Worker file = "trace_pipe";
137*58e6ee5fSAndroid Build Coastguard Worker else if (snap)
138*58e6ee5fSAndroid Build Coastguard Worker file = "snapshot";
139*58e6ee5fSAndroid Build Coastguard Worker
140*58e6ee5fSAndroid Build Coastguard Worker if (cpu) {
141*58e6ee5fSAndroid Build Coastguard Worker char *endptr;
142*58e6ee5fSAndroid Build Coastguard Worker long val;
143*58e6ee5fSAndroid Build Coastguard Worker
144*58e6ee5fSAndroid Build Coastguard Worker errno = 0;
145*58e6ee5fSAndroid Build Coastguard Worker val = strtol(cpu, &endptr, 0);
146*58e6ee5fSAndroid Build Coastguard Worker if (errno || cpu == endptr)
147*58e6ee5fSAndroid Build Coastguard Worker die("Invalid CPU index '%s'", cpu);
148*58e6ee5fSAndroid Build Coastguard Worker snprintf(cpu_path, 128, "per_cpu/cpu%ld/%s", val, file);
149*58e6ee5fSAndroid Build Coastguard Worker file = cpu_path;
150*58e6ee5fSAndroid Build Coastguard Worker }
151*58e6ee5fSAndroid Build Coastguard Worker
152*58e6ee5fSAndroid Build Coastguard Worker if (buffer) {
153*58e6ee5fSAndroid Build Coastguard Worker int ret;
154*58e6ee5fSAndroid Build Coastguard Worker
155*58e6ee5fSAndroid Build Coastguard Worker ret = asprintf(&path, "instances/%s/%s", buffer, file);
156*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
157*58e6ee5fSAndroid Build Coastguard Worker die("Failed to allocate instance path %s", file);
158*58e6ee5fSAndroid Build Coastguard Worker file = path;
159*58e6ee5fSAndroid Build Coastguard Worker }
160*58e6ee5fSAndroid Build Coastguard Worker
161*58e6ee5fSAndroid Build Coastguard Worker if (show_name) {
162*58e6ee5fSAndroid Build Coastguard Worker char *name;
163*58e6ee5fSAndroid Build Coastguard Worker name = tracefs_get_tracing_file(file);
164*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", name);
165*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(name);
166*58e6ee5fSAndroid Build Coastguard Worker }
167*58e6ee5fSAndroid Build Coastguard Worker show_file(file);
168*58e6ee5fSAndroid Build Coastguard Worker if (buffer)
169*58e6ee5fSAndroid Build Coastguard Worker free(path);
170*58e6ee5fSAndroid Build Coastguard Worker
171*58e6ee5fSAndroid Build Coastguard Worker return;
172*58e6ee5fSAndroid Build Coastguard Worker }
173