1*58e6ee5fSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker * Copyright (C) 2014 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker *
5*58e6ee5fSAndroid Build Coastguard Worker */
6*58e6ee5fSAndroid Build Coastguard Worker #include <sys/types.h>
7*58e6ee5fSAndroid Build Coastguard Worker #include <sys/stat.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
9*58e6ee5fSAndroid Build Coastguard Worker #include <stdio.h>
10*58e6ee5fSAndroid Build Coastguard Worker #include <getopt.h>
11*58e6ee5fSAndroid Build Coastguard Worker #include <unistd.h>
12*58e6ee5fSAndroid Build Coastguard Worker #include <fcntl.h>
13*58e6ee5fSAndroid Build Coastguard Worker #include <ctype.h>
14*58e6ee5fSAndroid Build Coastguard Worker
15*58e6ee5fSAndroid Build Coastguard Worker #include "tracefs.h"
16*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
17*58e6ee5fSAndroid Build Coastguard Worker
18*58e6ee5fSAndroid Build Coastguard Worker #ifndef BUFSIZ
19*58e6ee5fSAndroid Build Coastguard Worker #define BUFSIZ 1024
20*58e6ee5fSAndroid Build Coastguard Worker #endif
21*58e6ee5fSAndroid Build Coastguard Worker
is_top_instance(struct buffer_instance * instance)22*58e6ee5fSAndroid Build Coastguard Worker static inline int is_top_instance(struct buffer_instance *instance)
23*58e6ee5fSAndroid Build Coastguard Worker {
24*58e6ee5fSAndroid Build Coastguard Worker return instance == &top_instance;
25*58e6ee5fSAndroid Build Coastguard Worker }
26*58e6ee5fSAndroid Build Coastguard Worker
get_instance_file_fd(struct buffer_instance * instance,const char * file)27*58e6ee5fSAndroid Build Coastguard Worker static int get_instance_file_fd(struct buffer_instance *instance,
28*58e6ee5fSAndroid Build Coastguard Worker const char *file)
29*58e6ee5fSAndroid Build Coastguard Worker {
30*58e6ee5fSAndroid Build Coastguard Worker char *path;
31*58e6ee5fSAndroid Build Coastguard Worker int fd;
32*58e6ee5fSAndroid Build Coastguard Worker
33*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, file);
34*58e6ee5fSAndroid Build Coastguard Worker fd = open(path, O_RDONLY);
35*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
36*58e6ee5fSAndroid Build Coastguard Worker
37*58e6ee5fSAndroid Build Coastguard Worker return fd;
38*58e6ee5fSAndroid Build Coastguard Worker }
39*58e6ee5fSAndroid Build Coastguard Worker
strstrip(char * str)40*58e6ee5fSAndroid Build Coastguard Worker char *strstrip(char *str)
41*58e6ee5fSAndroid Build Coastguard Worker {
42*58e6ee5fSAndroid Build Coastguard Worker char *s;
43*58e6ee5fSAndroid Build Coastguard Worker
44*58e6ee5fSAndroid Build Coastguard Worker if (!str)
45*58e6ee5fSAndroid Build Coastguard Worker return NULL;
46*58e6ee5fSAndroid Build Coastguard Worker
47*58e6ee5fSAndroid Build Coastguard Worker s = str + strlen(str) - 1;
48*58e6ee5fSAndroid Build Coastguard Worker while (s >= str && isspace(*s))
49*58e6ee5fSAndroid Build Coastguard Worker s--;
50*58e6ee5fSAndroid Build Coastguard Worker s++;
51*58e6ee5fSAndroid Build Coastguard Worker *s = '\0';
52*58e6ee5fSAndroid Build Coastguard Worker
53*58e6ee5fSAndroid Build Coastguard Worker for (s = str; *s && isspace(*s); s++)
54*58e6ee5fSAndroid Build Coastguard Worker ;
55*58e6ee5fSAndroid Build Coastguard Worker
56*58e6ee5fSAndroid Build Coastguard Worker return s;
57*58e6ee5fSAndroid Build Coastguard Worker }
58*58e6ee5fSAndroid Build Coastguard Worker
59*58e6ee5fSAndroid Build Coastguard Worker /* FIXME: append_file() is duplicated and could be consolidated */
append_file(const char * dir,const char * name)60*58e6ee5fSAndroid Build Coastguard Worker char *append_file(const char *dir, const char *name)
61*58e6ee5fSAndroid Build Coastguard Worker {
62*58e6ee5fSAndroid Build Coastguard Worker char *file;
63*58e6ee5fSAndroid Build Coastguard Worker int ret;
64*58e6ee5fSAndroid Build Coastguard Worker
65*58e6ee5fSAndroid Build Coastguard Worker ret = asprintf(&file, "%s/%s", dir, name);
66*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
67*58e6ee5fSAndroid Build Coastguard Worker die("Failed to allocate %s/%s", dir, name);
68*58e6ee5fSAndroid Build Coastguard Worker
69*58e6ee5fSAndroid Build Coastguard Worker return file;
70*58e6ee5fSAndroid Build Coastguard Worker }
71*58e6ee5fSAndroid Build Coastguard Worker
get_fd_content(int fd,const char * file)72*58e6ee5fSAndroid Build Coastguard Worker static char *get_fd_content(int fd, const char *file)
73*58e6ee5fSAndroid Build Coastguard Worker {
74*58e6ee5fSAndroid Build Coastguard Worker char *str = NULL;
75*58e6ee5fSAndroid Build Coastguard Worker int cnt = 0;
76*58e6ee5fSAndroid Build Coastguard Worker int ret;
77*58e6ee5fSAndroid Build Coastguard Worker
78*58e6ee5fSAndroid Build Coastguard Worker for (;;) {
79*58e6ee5fSAndroid Build Coastguard Worker str = realloc(str, BUFSIZ * ++cnt);
80*58e6ee5fSAndroid Build Coastguard Worker if (!str)
81*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
82*58e6ee5fSAndroid Build Coastguard Worker ret = read(fd, str + BUFSIZ * (cnt - 1), BUFSIZ);
83*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
84*58e6ee5fSAndroid Build Coastguard Worker die("reading %s\n", file);
85*58e6ee5fSAndroid Build Coastguard Worker if (ret < BUFSIZ)
86*58e6ee5fSAndroid Build Coastguard Worker break;
87*58e6ee5fSAndroid Build Coastguard Worker }
88*58e6ee5fSAndroid Build Coastguard Worker str[BUFSIZ * (cnt-1) + ret] = 0;
89*58e6ee5fSAndroid Build Coastguard Worker
90*58e6ee5fSAndroid Build Coastguard Worker return str;
91*58e6ee5fSAndroid Build Coastguard Worker }
92*58e6ee5fSAndroid Build Coastguard Worker
get_file_content(const char * file)93*58e6ee5fSAndroid Build Coastguard Worker char *get_file_content(const char *file)
94*58e6ee5fSAndroid Build Coastguard Worker {
95*58e6ee5fSAndroid Build Coastguard Worker char *str;
96*58e6ee5fSAndroid Build Coastguard Worker int fd;
97*58e6ee5fSAndroid Build Coastguard Worker
98*58e6ee5fSAndroid Build Coastguard Worker fd = open(file, O_RDONLY);
99*58e6ee5fSAndroid Build Coastguard Worker if (fd < 0)
100*58e6ee5fSAndroid Build Coastguard Worker return NULL;
101*58e6ee5fSAndroid Build Coastguard Worker
102*58e6ee5fSAndroid Build Coastguard Worker str = get_fd_content(fd, file);
103*58e6ee5fSAndroid Build Coastguard Worker close(fd);
104*58e6ee5fSAndroid Build Coastguard Worker
105*58e6ee5fSAndroid Build Coastguard Worker return str;
106*58e6ee5fSAndroid Build Coastguard Worker }
107*58e6ee5fSAndroid Build Coastguard Worker
get_instance_file_content(struct buffer_instance * instance,const char * file)108*58e6ee5fSAndroid Build Coastguard Worker static char *get_instance_file_content(struct buffer_instance *instance,
109*58e6ee5fSAndroid Build Coastguard Worker const char *file)
110*58e6ee5fSAndroid Build Coastguard Worker {
111*58e6ee5fSAndroid Build Coastguard Worker char *str = NULL;
112*58e6ee5fSAndroid Build Coastguard Worker int fd;
113*58e6ee5fSAndroid Build Coastguard Worker
114*58e6ee5fSAndroid Build Coastguard Worker fd = get_instance_file_fd(instance, file);
115*58e6ee5fSAndroid Build Coastguard Worker if (fd < 0)
116*58e6ee5fSAndroid Build Coastguard Worker return NULL;
117*58e6ee5fSAndroid Build Coastguard Worker
118*58e6ee5fSAndroid Build Coastguard Worker str = get_fd_content(fd, file);
119*58e6ee5fSAndroid Build Coastguard Worker
120*58e6ee5fSAndroid Build Coastguard Worker close(fd);
121*58e6ee5fSAndroid Build Coastguard Worker return str;
122*58e6ee5fSAndroid Build Coastguard Worker }
123*58e6ee5fSAndroid Build Coastguard Worker
report_file(struct buffer_instance * instance,char * name,char * def_value,char * description)124*58e6ee5fSAndroid Build Coastguard Worker static void report_file(struct buffer_instance *instance,
125*58e6ee5fSAndroid Build Coastguard Worker char *name, char *def_value, char *description)
126*58e6ee5fSAndroid Build Coastguard Worker {
127*58e6ee5fSAndroid Build Coastguard Worker char *str;
128*58e6ee5fSAndroid Build Coastguard Worker char *cont;
129*58e6ee5fSAndroid Build Coastguard Worker
130*58e6ee5fSAndroid Build Coastguard Worker if (!tracefs_file_exists(instance->tracefs, name))
131*58e6ee5fSAndroid Build Coastguard Worker return;
132*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, name);
133*58e6ee5fSAndroid Build Coastguard Worker if (!str)
134*58e6ee5fSAndroid Build Coastguard Worker return;
135*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
136*58e6ee5fSAndroid Build Coastguard Worker if (cont[0] && strcmp(cont, def_value) != 0)
137*58e6ee5fSAndroid Build Coastguard Worker printf("\n%s%s\n", description, cont);
138*58e6ee5fSAndroid Build Coastguard Worker
139*58e6ee5fSAndroid Build Coastguard Worker free(str);
140*58e6ee5fSAndroid Build Coastguard Worker }
141*58e6ee5fSAndroid Build Coastguard Worker
report_instance(const char * name,void * data)142*58e6ee5fSAndroid Build Coastguard Worker static int report_instance(const char *name, void *data)
143*58e6ee5fSAndroid Build Coastguard Worker {
144*58e6ee5fSAndroid Build Coastguard Worker bool *first = (bool *)data;
145*58e6ee5fSAndroid Build Coastguard Worker
146*58e6ee5fSAndroid Build Coastguard Worker if (*first) {
147*58e6ee5fSAndroid Build Coastguard Worker *first = false;
148*58e6ee5fSAndroid Build Coastguard Worker printf("\nInstances:\n");
149*58e6ee5fSAndroid Build Coastguard Worker }
150*58e6ee5fSAndroid Build Coastguard Worker printf(" %s\n", name);
151*58e6ee5fSAndroid Build Coastguard Worker return 0;
152*58e6ee5fSAndroid Build Coastguard Worker }
153*58e6ee5fSAndroid Build Coastguard Worker
report_instances(void)154*58e6ee5fSAndroid Build Coastguard Worker static void report_instances(void)
155*58e6ee5fSAndroid Build Coastguard Worker {
156*58e6ee5fSAndroid Build Coastguard Worker bool first = true;
157*58e6ee5fSAndroid Build Coastguard Worker
158*58e6ee5fSAndroid Build Coastguard Worker tracefs_instances_walk(report_instance, &first);
159*58e6ee5fSAndroid Build Coastguard Worker }
160*58e6ee5fSAndroid Build Coastguard Worker
trace_event_iter_alloc(const char * path)161*58e6ee5fSAndroid Build Coastguard Worker struct event_iter *trace_event_iter_alloc(const char *path)
162*58e6ee5fSAndroid Build Coastguard Worker {
163*58e6ee5fSAndroid Build Coastguard Worker struct event_iter *iter;
164*58e6ee5fSAndroid Build Coastguard Worker
165*58e6ee5fSAndroid Build Coastguard Worker iter = malloc(sizeof(*iter));
166*58e6ee5fSAndroid Build Coastguard Worker if (!iter)
167*58e6ee5fSAndroid Build Coastguard Worker die("Failed to allocate event_iter for path %s", path);
168*58e6ee5fSAndroid Build Coastguard Worker memset(iter, 0, sizeof(*iter));
169*58e6ee5fSAndroid Build Coastguard Worker
170*58e6ee5fSAndroid Build Coastguard Worker iter->system_dir = opendir(path);
171*58e6ee5fSAndroid Build Coastguard Worker if (!iter->system_dir)
172*58e6ee5fSAndroid Build Coastguard Worker die("opendir");
173*58e6ee5fSAndroid Build Coastguard Worker
174*58e6ee5fSAndroid Build Coastguard Worker return iter;
175*58e6ee5fSAndroid Build Coastguard Worker }
176*58e6ee5fSAndroid Build Coastguard Worker
177*58e6ee5fSAndroid Build Coastguard Worker enum event_iter_type
trace_event_iter_next(struct event_iter * iter,const char * path,const char * system)178*58e6ee5fSAndroid Build Coastguard Worker trace_event_iter_next(struct event_iter *iter, const char *path, const char *system)
179*58e6ee5fSAndroid Build Coastguard Worker {
180*58e6ee5fSAndroid Build Coastguard Worker struct dirent *dent;
181*58e6ee5fSAndroid Build Coastguard Worker
182*58e6ee5fSAndroid Build Coastguard Worker if (system && !iter->event_dir) {
183*58e6ee5fSAndroid Build Coastguard Worker char *event;
184*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
185*58e6ee5fSAndroid Build Coastguard Worker
186*58e6ee5fSAndroid Build Coastguard Worker event = append_file(path, system);
187*58e6ee5fSAndroid Build Coastguard Worker
188*58e6ee5fSAndroid Build Coastguard Worker stat(event, &st);
189*58e6ee5fSAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode)) {
190*58e6ee5fSAndroid Build Coastguard Worker free(event);
191*58e6ee5fSAndroid Build Coastguard Worker goto do_system;
192*58e6ee5fSAndroid Build Coastguard Worker }
193*58e6ee5fSAndroid Build Coastguard Worker
194*58e6ee5fSAndroid Build Coastguard Worker iter->event_dir = opendir(event);
195*58e6ee5fSAndroid Build Coastguard Worker if (!iter->event_dir)
196*58e6ee5fSAndroid Build Coastguard Worker die("opendir %s", event);
197*58e6ee5fSAndroid Build Coastguard Worker free(event);
198*58e6ee5fSAndroid Build Coastguard Worker }
199*58e6ee5fSAndroid Build Coastguard Worker
200*58e6ee5fSAndroid Build Coastguard Worker if (iter->event_dir) {
201*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(iter->event_dir))) {
202*58e6ee5fSAndroid Build Coastguard Worker const char *name = dent->d_name;
203*58e6ee5fSAndroid Build Coastguard Worker
204*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(name, ".") == 0 ||
205*58e6ee5fSAndroid Build Coastguard Worker strcmp(name, "..") == 0)
206*58e6ee5fSAndroid Build Coastguard Worker continue;
207*58e6ee5fSAndroid Build Coastguard Worker
208*58e6ee5fSAndroid Build Coastguard Worker iter->event_dent = dent;
209*58e6ee5fSAndroid Build Coastguard Worker return EVENT_ITER_EVENT;
210*58e6ee5fSAndroid Build Coastguard Worker }
211*58e6ee5fSAndroid Build Coastguard Worker closedir(iter->event_dir);
212*58e6ee5fSAndroid Build Coastguard Worker iter->event_dir = NULL;
213*58e6ee5fSAndroid Build Coastguard Worker }
214*58e6ee5fSAndroid Build Coastguard Worker
215*58e6ee5fSAndroid Build Coastguard Worker do_system:
216*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(iter->system_dir))) {
217*58e6ee5fSAndroid Build Coastguard Worker const char *name = dent->d_name;
218*58e6ee5fSAndroid Build Coastguard Worker
219*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(name, ".") == 0 ||
220*58e6ee5fSAndroid Build Coastguard Worker strcmp(name, "..") == 0)
221*58e6ee5fSAndroid Build Coastguard Worker continue;
222*58e6ee5fSAndroid Build Coastguard Worker
223*58e6ee5fSAndroid Build Coastguard Worker iter->system_dent = dent;
224*58e6ee5fSAndroid Build Coastguard Worker
225*58e6ee5fSAndroid Build Coastguard Worker return EVENT_ITER_SYSTEM;
226*58e6ee5fSAndroid Build Coastguard Worker }
227*58e6ee5fSAndroid Build Coastguard Worker
228*58e6ee5fSAndroid Build Coastguard Worker return EVENT_ITER_NONE;
229*58e6ee5fSAndroid Build Coastguard Worker }
230*58e6ee5fSAndroid Build Coastguard Worker
trace_event_iter_free(struct event_iter * iter)231*58e6ee5fSAndroid Build Coastguard Worker void trace_event_iter_free(struct event_iter *iter)
232*58e6ee5fSAndroid Build Coastguard Worker {
233*58e6ee5fSAndroid Build Coastguard Worker if (!iter)
234*58e6ee5fSAndroid Build Coastguard Worker return;
235*58e6ee5fSAndroid Build Coastguard Worker
236*58e6ee5fSAndroid Build Coastguard Worker if (iter->event_dir)
237*58e6ee5fSAndroid Build Coastguard Worker closedir(iter->event_dir);
238*58e6ee5fSAndroid Build Coastguard Worker
239*58e6ee5fSAndroid Build Coastguard Worker closedir(iter->system_dir);
240*58e6ee5fSAndroid Build Coastguard Worker free(iter);
241*58e6ee5fSAndroid Build Coastguard Worker }
242*58e6ee5fSAndroid Build Coastguard Worker
reset_event_iter(struct event_iter * iter)243*58e6ee5fSAndroid Build Coastguard Worker static void reset_event_iter(struct event_iter *iter)
244*58e6ee5fSAndroid Build Coastguard Worker {
245*58e6ee5fSAndroid Build Coastguard Worker if (iter->event_dir) {
246*58e6ee5fSAndroid Build Coastguard Worker closedir(iter->event_dir);
247*58e6ee5fSAndroid Build Coastguard Worker iter->event_dir = NULL;
248*58e6ee5fSAndroid Build Coastguard Worker }
249*58e6ee5fSAndroid Build Coastguard Worker
250*58e6ee5fSAndroid Build Coastguard Worker rewinddir(iter->system_dir);
251*58e6ee5fSAndroid Build Coastguard Worker }
252*58e6ee5fSAndroid Build Coastguard Worker
process_individual_events(const char * path,struct event_iter * iter)253*58e6ee5fSAndroid Build Coastguard Worker static int process_individual_events(const char *path, struct event_iter *iter)
254*58e6ee5fSAndroid Build Coastguard Worker {
255*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
256*58e6ee5fSAndroid Build Coastguard Worker const char *system = iter->system_dent->d_name;
257*58e6ee5fSAndroid Build Coastguard Worker char *file;
258*58e6ee5fSAndroid Build Coastguard Worker char *enable = NULL;
259*58e6ee5fSAndroid Build Coastguard Worker char *str;
260*58e6ee5fSAndroid Build Coastguard Worker int ret = 0;
261*58e6ee5fSAndroid Build Coastguard Worker
262*58e6ee5fSAndroid Build Coastguard Worker file = append_file(path, system);
263*58e6ee5fSAndroid Build Coastguard Worker
264*58e6ee5fSAndroid Build Coastguard Worker stat(file, &st);
265*58e6ee5fSAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode))
266*58e6ee5fSAndroid Build Coastguard Worker goto out;
267*58e6ee5fSAndroid Build Coastguard Worker
268*58e6ee5fSAndroid Build Coastguard Worker enable = append_file(file, "enable");
269*58e6ee5fSAndroid Build Coastguard Worker str = get_file_content(enable);
270*58e6ee5fSAndroid Build Coastguard Worker if (!str)
271*58e6ee5fSAndroid Build Coastguard Worker goto out;
272*58e6ee5fSAndroid Build Coastguard Worker
273*58e6ee5fSAndroid Build Coastguard Worker if (*str != '1' && *str != '0')
274*58e6ee5fSAndroid Build Coastguard Worker ret = 1;
275*58e6ee5fSAndroid Build Coastguard Worker free(str);
276*58e6ee5fSAndroid Build Coastguard Worker
277*58e6ee5fSAndroid Build Coastguard Worker out:
278*58e6ee5fSAndroid Build Coastguard Worker free(enable);
279*58e6ee5fSAndroid Build Coastguard Worker free(file);
280*58e6ee5fSAndroid Build Coastguard Worker
281*58e6ee5fSAndroid Build Coastguard Worker return ret;
282*58e6ee5fSAndroid Build Coastguard Worker }
283*58e6ee5fSAndroid Build Coastguard Worker
284*58e6ee5fSAndroid Build Coastguard Worker static void
process_event_enable(char * path,const char * system,const char * name,enum event_process * processed)285*58e6ee5fSAndroid Build Coastguard Worker process_event_enable(char *path, const char *system, const char *name,
286*58e6ee5fSAndroid Build Coastguard Worker enum event_process *processed)
287*58e6ee5fSAndroid Build Coastguard Worker {
288*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
289*58e6ee5fSAndroid Build Coastguard Worker char *enable = NULL;
290*58e6ee5fSAndroid Build Coastguard Worker char *file;
291*58e6ee5fSAndroid Build Coastguard Worker char *str;
292*58e6ee5fSAndroid Build Coastguard Worker
293*58e6ee5fSAndroid Build Coastguard Worker if (system)
294*58e6ee5fSAndroid Build Coastguard Worker path = append_file(path, system);
295*58e6ee5fSAndroid Build Coastguard Worker
296*58e6ee5fSAndroid Build Coastguard Worker file = append_file(path, name);
297*58e6ee5fSAndroid Build Coastguard Worker
298*58e6ee5fSAndroid Build Coastguard Worker if (system)
299*58e6ee5fSAndroid Build Coastguard Worker free(path);
300*58e6ee5fSAndroid Build Coastguard Worker
301*58e6ee5fSAndroid Build Coastguard Worker stat(file, &st);
302*58e6ee5fSAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode))
303*58e6ee5fSAndroid Build Coastguard Worker goto out;
304*58e6ee5fSAndroid Build Coastguard Worker
305*58e6ee5fSAndroid Build Coastguard Worker enable = append_file(file, "enable");
306*58e6ee5fSAndroid Build Coastguard Worker str = get_file_content(enable);
307*58e6ee5fSAndroid Build Coastguard Worker if (!str)
308*58e6ee5fSAndroid Build Coastguard Worker goto out;
309*58e6ee5fSAndroid Build Coastguard Worker
310*58e6ee5fSAndroid Build Coastguard Worker if (*str == '1') {
311*58e6ee5fSAndroid Build Coastguard Worker if (!system) {
312*58e6ee5fSAndroid Build Coastguard Worker if (!*processed)
313*58e6ee5fSAndroid Build Coastguard Worker printf(" Individual systems:\n");
314*58e6ee5fSAndroid Build Coastguard Worker printf( " %s\n", name);
315*58e6ee5fSAndroid Build Coastguard Worker *processed = PROCESSED_SYSTEM;
316*58e6ee5fSAndroid Build Coastguard Worker } else {
317*58e6ee5fSAndroid Build Coastguard Worker if (!*processed) {
318*58e6ee5fSAndroid Build Coastguard Worker printf(" Individual events:\n");
319*58e6ee5fSAndroid Build Coastguard Worker *processed = PROCESSED_SYSTEM;
320*58e6ee5fSAndroid Build Coastguard Worker }
321*58e6ee5fSAndroid Build Coastguard Worker if (*processed == PROCESSED_SYSTEM) {
322*58e6ee5fSAndroid Build Coastguard Worker printf(" %s\n", system);
323*58e6ee5fSAndroid Build Coastguard Worker *processed = PROCESSED_EVENT;
324*58e6ee5fSAndroid Build Coastguard Worker }
325*58e6ee5fSAndroid Build Coastguard Worker printf( " %s\n", name);
326*58e6ee5fSAndroid Build Coastguard Worker }
327*58e6ee5fSAndroid Build Coastguard Worker }
328*58e6ee5fSAndroid Build Coastguard Worker free(str);
329*58e6ee5fSAndroid Build Coastguard Worker
330*58e6ee5fSAndroid Build Coastguard Worker out:
331*58e6ee5fSAndroid Build Coastguard Worker free(enable);
332*58e6ee5fSAndroid Build Coastguard Worker free(file);
333*58e6ee5fSAndroid Build Coastguard Worker }
334*58e6ee5fSAndroid Build Coastguard Worker
report_events(struct buffer_instance * instance)335*58e6ee5fSAndroid Build Coastguard Worker static void report_events(struct buffer_instance *instance)
336*58e6ee5fSAndroid Build Coastguard Worker {
337*58e6ee5fSAndroid Build Coastguard Worker struct event_iter *iter;
338*58e6ee5fSAndroid Build Coastguard Worker char *str;
339*58e6ee5fSAndroid Build Coastguard Worker char *cont;
340*58e6ee5fSAndroid Build Coastguard Worker char *path;
341*58e6ee5fSAndroid Build Coastguard Worker char *system;
342*58e6ee5fSAndroid Build Coastguard Worker enum event_iter_type type;
343*58e6ee5fSAndroid Build Coastguard Worker enum event_process processed = PROCESSED_NONE;
344*58e6ee5fSAndroid Build Coastguard Worker enum event_process processed_part = PROCESSED_NONE;
345*58e6ee5fSAndroid Build Coastguard Worker
346*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, "events/enable");
347*58e6ee5fSAndroid Build Coastguard Worker if (!str)
348*58e6ee5fSAndroid Build Coastguard Worker return;
349*58e6ee5fSAndroid Build Coastguard Worker
350*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
351*58e6ee5fSAndroid Build Coastguard Worker
352*58e6ee5fSAndroid Build Coastguard Worker printf("\nEvents:\n");
353*58e6ee5fSAndroid Build Coastguard Worker
354*58e6ee5fSAndroid Build Coastguard Worker switch(*cont) {
355*58e6ee5fSAndroid Build Coastguard Worker case '1':
356*58e6ee5fSAndroid Build Coastguard Worker printf(" All enabled\n");
357*58e6ee5fSAndroid Build Coastguard Worker free(str);
358*58e6ee5fSAndroid Build Coastguard Worker return;
359*58e6ee5fSAndroid Build Coastguard Worker case '0':
360*58e6ee5fSAndroid Build Coastguard Worker printf(" All disabled\n");
361*58e6ee5fSAndroid Build Coastguard Worker free(str);
362*58e6ee5fSAndroid Build Coastguard Worker return;
363*58e6ee5fSAndroid Build Coastguard Worker }
364*58e6ee5fSAndroid Build Coastguard Worker
365*58e6ee5fSAndroid Build Coastguard Worker free(str);
366*58e6ee5fSAndroid Build Coastguard Worker
367*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "events");
368*58e6ee5fSAndroid Build Coastguard Worker if (!path)
369*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
370*58e6ee5fSAndroid Build Coastguard Worker
371*58e6ee5fSAndroid Build Coastguard Worker iter = trace_event_iter_alloc(path);
372*58e6ee5fSAndroid Build Coastguard Worker
373*58e6ee5fSAndroid Build Coastguard Worker while (trace_event_iter_next(iter, path, NULL)) {
374*58e6ee5fSAndroid Build Coastguard Worker process_event_enable(path, NULL, iter->system_dent->d_name, &processed);
375*58e6ee5fSAndroid Build Coastguard Worker }
376*58e6ee5fSAndroid Build Coastguard Worker
377*58e6ee5fSAndroid Build Coastguard Worker reset_event_iter(iter);
378*58e6ee5fSAndroid Build Coastguard Worker
379*58e6ee5fSAndroid Build Coastguard Worker system = NULL;
380*58e6ee5fSAndroid Build Coastguard Worker while ((type = trace_event_iter_next(iter, path, system))) {
381*58e6ee5fSAndroid Build Coastguard Worker
382*58e6ee5fSAndroid Build Coastguard Worker if (type == EVENT_ITER_SYSTEM) {
383*58e6ee5fSAndroid Build Coastguard Worker
384*58e6ee5fSAndroid Build Coastguard Worker /* Only process systems that are not fully enabled */
385*58e6ee5fSAndroid Build Coastguard Worker if (!process_individual_events(path, iter))
386*58e6ee5fSAndroid Build Coastguard Worker continue;
387*58e6ee5fSAndroid Build Coastguard Worker
388*58e6ee5fSAndroid Build Coastguard Worker system = iter->system_dent->d_name;
389*58e6ee5fSAndroid Build Coastguard Worker if (processed_part)
390*58e6ee5fSAndroid Build Coastguard Worker processed_part = PROCESSED_SYSTEM;
391*58e6ee5fSAndroid Build Coastguard Worker continue;
392*58e6ee5fSAndroid Build Coastguard Worker }
393*58e6ee5fSAndroid Build Coastguard Worker
394*58e6ee5fSAndroid Build Coastguard Worker process_event_enable(path, iter->system_dent->d_name,
395*58e6ee5fSAndroid Build Coastguard Worker iter->event_dent->d_name, &processed_part);
396*58e6ee5fSAndroid Build Coastguard Worker }
397*58e6ee5fSAndroid Build Coastguard Worker
398*58e6ee5fSAndroid Build Coastguard Worker trace_event_iter_free(iter);
399*58e6ee5fSAndroid Build Coastguard Worker
400*58e6ee5fSAndroid Build Coastguard Worker if (!processed && !processed_part)
401*58e6ee5fSAndroid Build Coastguard Worker printf(" (none enabled)\n");
402*58e6ee5fSAndroid Build Coastguard Worker
403*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
404*58e6ee5fSAndroid Build Coastguard Worker }
405*58e6ee5fSAndroid Build Coastguard Worker
406*58e6ee5fSAndroid Build Coastguard Worker static void
process_event_filter(char * path,struct event_iter * iter,enum event_process * processed)407*58e6ee5fSAndroid Build Coastguard Worker process_event_filter(char *path, struct event_iter *iter, enum event_process *processed)
408*58e6ee5fSAndroid Build Coastguard Worker {
409*58e6ee5fSAndroid Build Coastguard Worker const char *system = iter->system_dent->d_name;
410*58e6ee5fSAndroid Build Coastguard Worker const char *event = iter->event_dent->d_name;
411*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
412*58e6ee5fSAndroid Build Coastguard Worker char *filter = NULL;
413*58e6ee5fSAndroid Build Coastguard Worker char *file;
414*58e6ee5fSAndroid Build Coastguard Worker char *str;
415*58e6ee5fSAndroid Build Coastguard Worker char *cont;
416*58e6ee5fSAndroid Build Coastguard Worker
417*58e6ee5fSAndroid Build Coastguard Worker path = append_file(path, system);
418*58e6ee5fSAndroid Build Coastguard Worker file = append_file(path, event);
419*58e6ee5fSAndroid Build Coastguard Worker free(path);
420*58e6ee5fSAndroid Build Coastguard Worker
421*58e6ee5fSAndroid Build Coastguard Worker stat(file, &st);
422*58e6ee5fSAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode))
423*58e6ee5fSAndroid Build Coastguard Worker goto out;
424*58e6ee5fSAndroid Build Coastguard Worker
425*58e6ee5fSAndroid Build Coastguard Worker filter = append_file(file, "filter");
426*58e6ee5fSAndroid Build Coastguard Worker str = get_file_content(filter);
427*58e6ee5fSAndroid Build Coastguard Worker if (!str)
428*58e6ee5fSAndroid Build Coastguard Worker goto out;
429*58e6ee5fSAndroid Build Coastguard Worker
430*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
431*58e6ee5fSAndroid Build Coastguard Worker
432*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(cont, "none") == 0) {
433*58e6ee5fSAndroid Build Coastguard Worker free(str);
434*58e6ee5fSAndroid Build Coastguard Worker goto out;
435*58e6ee5fSAndroid Build Coastguard Worker }
436*58e6ee5fSAndroid Build Coastguard Worker
437*58e6ee5fSAndroid Build Coastguard Worker if (!*processed)
438*58e6ee5fSAndroid Build Coastguard Worker printf("\nFilters:\n");
439*58e6ee5fSAndroid Build Coastguard Worker printf( " %s:%s \"%s\"\n", system, event, cont);
440*58e6ee5fSAndroid Build Coastguard Worker *processed = PROCESSED_SYSTEM;
441*58e6ee5fSAndroid Build Coastguard Worker free(str);
442*58e6ee5fSAndroid Build Coastguard Worker
443*58e6ee5fSAndroid Build Coastguard Worker out:
444*58e6ee5fSAndroid Build Coastguard Worker free(filter);
445*58e6ee5fSAndroid Build Coastguard Worker free(file);
446*58e6ee5fSAndroid Build Coastguard Worker }
447*58e6ee5fSAndroid Build Coastguard Worker
report_event_filters(struct buffer_instance * instance)448*58e6ee5fSAndroid Build Coastguard Worker static void report_event_filters(struct buffer_instance *instance)
449*58e6ee5fSAndroid Build Coastguard Worker {
450*58e6ee5fSAndroid Build Coastguard Worker struct event_iter *iter;
451*58e6ee5fSAndroid Build Coastguard Worker char *path;
452*58e6ee5fSAndroid Build Coastguard Worker char *system;
453*58e6ee5fSAndroid Build Coastguard Worker enum event_iter_type type;
454*58e6ee5fSAndroid Build Coastguard Worker enum event_process processed = PROCESSED_NONE;
455*58e6ee5fSAndroid Build Coastguard Worker
456*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "events");
457*58e6ee5fSAndroid Build Coastguard Worker if (!path)
458*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
459*58e6ee5fSAndroid Build Coastguard Worker
460*58e6ee5fSAndroid Build Coastguard Worker iter = trace_event_iter_alloc(path);
461*58e6ee5fSAndroid Build Coastguard Worker
462*58e6ee5fSAndroid Build Coastguard Worker processed = PROCESSED_NONE;
463*58e6ee5fSAndroid Build Coastguard Worker system = NULL;
464*58e6ee5fSAndroid Build Coastguard Worker while ((type = trace_event_iter_next(iter, path, system))) {
465*58e6ee5fSAndroid Build Coastguard Worker
466*58e6ee5fSAndroid Build Coastguard Worker if (type == EVENT_ITER_SYSTEM) {
467*58e6ee5fSAndroid Build Coastguard Worker system = iter->system_dent->d_name;
468*58e6ee5fSAndroid Build Coastguard Worker continue;
469*58e6ee5fSAndroid Build Coastguard Worker }
470*58e6ee5fSAndroid Build Coastguard Worker
471*58e6ee5fSAndroid Build Coastguard Worker process_event_filter(path, iter, &processed);
472*58e6ee5fSAndroid Build Coastguard Worker }
473*58e6ee5fSAndroid Build Coastguard Worker
474*58e6ee5fSAndroid Build Coastguard Worker trace_event_iter_free(iter);
475*58e6ee5fSAndroid Build Coastguard Worker
476*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
477*58e6ee5fSAndroid Build Coastguard Worker }
478*58e6ee5fSAndroid Build Coastguard Worker
479*58e6ee5fSAndroid Build Coastguard Worker static void
process_event_trigger(char * path,struct event_iter * iter,enum event_process * processed)480*58e6ee5fSAndroid Build Coastguard Worker process_event_trigger(char *path, struct event_iter *iter, enum event_process *processed)
481*58e6ee5fSAndroid Build Coastguard Worker {
482*58e6ee5fSAndroid Build Coastguard Worker const char *system = iter->system_dent->d_name;
483*58e6ee5fSAndroid Build Coastguard Worker const char *event = iter->event_dent->d_name;
484*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
485*58e6ee5fSAndroid Build Coastguard Worker char *trigger = NULL;
486*58e6ee5fSAndroid Build Coastguard Worker char *file;
487*58e6ee5fSAndroid Build Coastguard Worker char *str;
488*58e6ee5fSAndroid Build Coastguard Worker char *cont;
489*58e6ee5fSAndroid Build Coastguard Worker
490*58e6ee5fSAndroid Build Coastguard Worker path = append_file(path, system);
491*58e6ee5fSAndroid Build Coastguard Worker file = append_file(path, event);
492*58e6ee5fSAndroid Build Coastguard Worker free(path);
493*58e6ee5fSAndroid Build Coastguard Worker
494*58e6ee5fSAndroid Build Coastguard Worker stat(file, &st);
495*58e6ee5fSAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode))
496*58e6ee5fSAndroid Build Coastguard Worker goto out;
497*58e6ee5fSAndroid Build Coastguard Worker
498*58e6ee5fSAndroid Build Coastguard Worker trigger = append_file(file, "trigger");
499*58e6ee5fSAndroid Build Coastguard Worker str = get_file_content(trigger);
500*58e6ee5fSAndroid Build Coastguard Worker if (!str)
501*58e6ee5fSAndroid Build Coastguard Worker goto out;
502*58e6ee5fSAndroid Build Coastguard Worker
503*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
504*58e6ee5fSAndroid Build Coastguard Worker
505*58e6ee5fSAndroid Build Coastguard Worker if (cont[0] == '#') {
506*58e6ee5fSAndroid Build Coastguard Worker free(str);
507*58e6ee5fSAndroid Build Coastguard Worker goto out;
508*58e6ee5fSAndroid Build Coastguard Worker }
509*58e6ee5fSAndroid Build Coastguard Worker
510*58e6ee5fSAndroid Build Coastguard Worker if (!*processed)
511*58e6ee5fSAndroid Build Coastguard Worker printf("\nTriggers:\n");
512*58e6ee5fSAndroid Build Coastguard Worker printf( " %s:%s \"%s\"\n", system, event, cont);
513*58e6ee5fSAndroid Build Coastguard Worker *processed = PROCESSED_SYSTEM;
514*58e6ee5fSAndroid Build Coastguard Worker free(str);
515*58e6ee5fSAndroid Build Coastguard Worker
516*58e6ee5fSAndroid Build Coastguard Worker out:
517*58e6ee5fSAndroid Build Coastguard Worker free(trigger);
518*58e6ee5fSAndroid Build Coastguard Worker free(file);
519*58e6ee5fSAndroid Build Coastguard Worker }
520*58e6ee5fSAndroid Build Coastguard Worker
report_event_triggers(struct buffer_instance * instance)521*58e6ee5fSAndroid Build Coastguard Worker static void report_event_triggers(struct buffer_instance *instance)
522*58e6ee5fSAndroid Build Coastguard Worker {
523*58e6ee5fSAndroid Build Coastguard Worker struct event_iter *iter;
524*58e6ee5fSAndroid Build Coastguard Worker char *path;
525*58e6ee5fSAndroid Build Coastguard Worker char *system;
526*58e6ee5fSAndroid Build Coastguard Worker enum event_iter_type type;
527*58e6ee5fSAndroid Build Coastguard Worker enum event_process processed = PROCESSED_NONE;
528*58e6ee5fSAndroid Build Coastguard Worker
529*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "events");
530*58e6ee5fSAndroid Build Coastguard Worker if (!path)
531*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
532*58e6ee5fSAndroid Build Coastguard Worker
533*58e6ee5fSAndroid Build Coastguard Worker iter = trace_event_iter_alloc(path);
534*58e6ee5fSAndroid Build Coastguard Worker
535*58e6ee5fSAndroid Build Coastguard Worker processed = PROCESSED_NONE;
536*58e6ee5fSAndroid Build Coastguard Worker system = NULL;
537*58e6ee5fSAndroid Build Coastguard Worker while ((type = trace_event_iter_next(iter, path, system))) {
538*58e6ee5fSAndroid Build Coastguard Worker
539*58e6ee5fSAndroid Build Coastguard Worker if (type == EVENT_ITER_SYSTEM) {
540*58e6ee5fSAndroid Build Coastguard Worker system = iter->system_dent->d_name;
541*58e6ee5fSAndroid Build Coastguard Worker continue;
542*58e6ee5fSAndroid Build Coastguard Worker }
543*58e6ee5fSAndroid Build Coastguard Worker
544*58e6ee5fSAndroid Build Coastguard Worker process_event_trigger(path, iter, &processed);
545*58e6ee5fSAndroid Build Coastguard Worker }
546*58e6ee5fSAndroid Build Coastguard Worker
547*58e6ee5fSAndroid Build Coastguard Worker trace_event_iter_free(iter);
548*58e6ee5fSAndroid Build Coastguard Worker
549*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
550*58e6ee5fSAndroid Build Coastguard Worker }
551*58e6ee5fSAndroid Build Coastguard Worker
552*58e6ee5fSAndroid Build Coastguard Worker enum func_states {
553*58e6ee5fSAndroid Build Coastguard Worker FUNC_STATE_START,
554*58e6ee5fSAndroid Build Coastguard Worker FUNC_STATE_SKIP,
555*58e6ee5fSAndroid Build Coastguard Worker FUNC_STATE_PRINT,
556*58e6ee5fSAndroid Build Coastguard Worker };
557*58e6ee5fSAndroid Build Coastguard Worker
list_functions(const char * path,char * string)558*58e6ee5fSAndroid Build Coastguard Worker static void list_functions(const char *path, char *string)
559*58e6ee5fSAndroid Build Coastguard Worker {
560*58e6ee5fSAndroid Build Coastguard Worker enum func_states state;
561*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
562*58e6ee5fSAndroid Build Coastguard Worker char *str;
563*58e6ee5fSAndroid Build Coastguard Worker int ret = 0;
564*58e6ee5fSAndroid Build Coastguard Worker int len;
565*58e6ee5fSAndroid Build Coastguard Worker int i;
566*58e6ee5fSAndroid Build Coastguard Worker int first = 0;
567*58e6ee5fSAndroid Build Coastguard Worker
568*58e6ee5fSAndroid Build Coastguard Worker /* Ignore if it does not exist. */
569*58e6ee5fSAndroid Build Coastguard Worker ret = stat(path, &st);
570*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
571*58e6ee5fSAndroid Build Coastguard Worker return;
572*58e6ee5fSAndroid Build Coastguard Worker
573*58e6ee5fSAndroid Build Coastguard Worker str = get_file_content(path);
574*58e6ee5fSAndroid Build Coastguard Worker if (!str)
575*58e6ee5fSAndroid Build Coastguard Worker return;
576*58e6ee5fSAndroid Build Coastguard Worker
577*58e6ee5fSAndroid Build Coastguard Worker len = strlen(str);
578*58e6ee5fSAndroid Build Coastguard Worker
579*58e6ee5fSAndroid Build Coastguard Worker state = FUNC_STATE_START;
580*58e6ee5fSAndroid Build Coastguard Worker
581*58e6ee5fSAndroid Build Coastguard Worker /* Skip all lines that start with '#' */
582*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < len; i++) {
583*58e6ee5fSAndroid Build Coastguard Worker
584*58e6ee5fSAndroid Build Coastguard Worker if (state == FUNC_STATE_PRINT)
585*58e6ee5fSAndroid Build Coastguard Worker putchar(str[i]);
586*58e6ee5fSAndroid Build Coastguard Worker
587*58e6ee5fSAndroid Build Coastguard Worker if (str[i] == '\n') {
588*58e6ee5fSAndroid Build Coastguard Worker state = FUNC_STATE_START;
589*58e6ee5fSAndroid Build Coastguard Worker continue;
590*58e6ee5fSAndroid Build Coastguard Worker }
591*58e6ee5fSAndroid Build Coastguard Worker
592*58e6ee5fSAndroid Build Coastguard Worker if (state == FUNC_STATE_SKIP)
593*58e6ee5fSAndroid Build Coastguard Worker continue;
594*58e6ee5fSAndroid Build Coastguard Worker
595*58e6ee5fSAndroid Build Coastguard Worker if (state == FUNC_STATE_START && str[i] == '#') {
596*58e6ee5fSAndroid Build Coastguard Worker state = FUNC_STATE_SKIP;
597*58e6ee5fSAndroid Build Coastguard Worker continue;
598*58e6ee5fSAndroid Build Coastguard Worker }
599*58e6ee5fSAndroid Build Coastguard Worker
600*58e6ee5fSAndroid Build Coastguard Worker if (!first) {
601*58e6ee5fSAndroid Build Coastguard Worker printf("\n%s:\n", string);
602*58e6ee5fSAndroid Build Coastguard Worker first = 1;
603*58e6ee5fSAndroid Build Coastguard Worker }
604*58e6ee5fSAndroid Build Coastguard Worker
605*58e6ee5fSAndroid Build Coastguard Worker if (state != FUNC_STATE_PRINT) {
606*58e6ee5fSAndroid Build Coastguard Worker state = FUNC_STATE_PRINT;
607*58e6ee5fSAndroid Build Coastguard Worker printf(" ");
608*58e6ee5fSAndroid Build Coastguard Worker putchar(str[i]);
609*58e6ee5fSAndroid Build Coastguard Worker }
610*58e6ee5fSAndroid Build Coastguard Worker }
611*58e6ee5fSAndroid Build Coastguard Worker free(str);
612*58e6ee5fSAndroid Build Coastguard Worker }
613*58e6ee5fSAndroid Build Coastguard Worker
report_graph_funcs(struct buffer_instance * instance)614*58e6ee5fSAndroid Build Coastguard Worker static void report_graph_funcs(struct buffer_instance *instance)
615*58e6ee5fSAndroid Build Coastguard Worker {
616*58e6ee5fSAndroid Build Coastguard Worker char *path;
617*58e6ee5fSAndroid Build Coastguard Worker
618*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "set_graph_function");
619*58e6ee5fSAndroid Build Coastguard Worker if (!path)
620*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
621*58e6ee5fSAndroid Build Coastguard Worker
622*58e6ee5fSAndroid Build Coastguard Worker list_functions(path, "Function Graph Filter");
623*58e6ee5fSAndroid Build Coastguard Worker
624*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
625*58e6ee5fSAndroid Build Coastguard Worker
626*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "set_graph_notrace");
627*58e6ee5fSAndroid Build Coastguard Worker if (!path)
628*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
629*58e6ee5fSAndroid Build Coastguard Worker
630*58e6ee5fSAndroid Build Coastguard Worker list_functions(path, "Function Graph No Trace");
631*58e6ee5fSAndroid Build Coastguard Worker
632*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
633*58e6ee5fSAndroid Build Coastguard Worker }
634*58e6ee5fSAndroid Build Coastguard Worker
report_ftrace_filters(struct buffer_instance * instance)635*58e6ee5fSAndroid Build Coastguard Worker static void report_ftrace_filters(struct buffer_instance *instance)
636*58e6ee5fSAndroid Build Coastguard Worker {
637*58e6ee5fSAndroid Build Coastguard Worker char *path;
638*58e6ee5fSAndroid Build Coastguard Worker
639*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "set_ftrace_filter");
640*58e6ee5fSAndroid Build Coastguard Worker if (!path)
641*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
642*58e6ee5fSAndroid Build Coastguard Worker
643*58e6ee5fSAndroid Build Coastguard Worker list_functions(path, "Function Filter");
644*58e6ee5fSAndroid Build Coastguard Worker
645*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
646*58e6ee5fSAndroid Build Coastguard Worker
647*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, "set_ftrace_notrace");
648*58e6ee5fSAndroid Build Coastguard Worker if (!path)
649*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
650*58e6ee5fSAndroid Build Coastguard Worker
651*58e6ee5fSAndroid Build Coastguard Worker list_functions(path, "Function No Trace");
652*58e6ee5fSAndroid Build Coastguard Worker
653*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
654*58e6ee5fSAndroid Build Coastguard Worker }
655*58e6ee5fSAndroid Build Coastguard Worker
report_buffers(struct buffer_instance * instance)656*58e6ee5fSAndroid Build Coastguard Worker static void report_buffers(struct buffer_instance *instance)
657*58e6ee5fSAndroid Build Coastguard Worker {
658*58e6ee5fSAndroid Build Coastguard Worker #define FILE_SIZE 100
659*58e6ee5fSAndroid Build Coastguard Worker char *str;
660*58e6ee5fSAndroid Build Coastguard Worker char *cont;
661*58e6ee5fSAndroid Build Coastguard Worker char file[FILE_SIZE];
662*58e6ee5fSAndroid Build Coastguard Worker int cpu;
663*58e6ee5fSAndroid Build Coastguard Worker
664*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, "buffer_size_kb");
665*58e6ee5fSAndroid Build Coastguard Worker if (!str)
666*58e6ee5fSAndroid Build Coastguard Worker return;
667*58e6ee5fSAndroid Build Coastguard Worker
668*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
669*58e6ee5fSAndroid Build Coastguard Worker
670*58e6ee5fSAndroid Build Coastguard Worker /* If it's not expanded yet, just skip */
671*58e6ee5fSAndroid Build Coastguard Worker if (strstr(cont, "expanded") != NULL)
672*58e6ee5fSAndroid Build Coastguard Worker goto out;
673*58e6ee5fSAndroid Build Coastguard Worker
674*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(cont, "X") != 0) {
675*58e6ee5fSAndroid Build Coastguard Worker printf("\nBuffer size in kilobytes (per cpu):\n");
676*58e6ee5fSAndroid Build Coastguard Worker printf(" %s\n", str);
677*58e6ee5fSAndroid Build Coastguard Worker goto total;
678*58e6ee5fSAndroid Build Coastguard Worker }
679*58e6ee5fSAndroid Build Coastguard Worker
680*58e6ee5fSAndroid Build Coastguard Worker /* Read the sizes of each CPU buffer */
681*58e6ee5fSAndroid Build Coastguard Worker for (cpu = 0; ; cpu++) {
682*58e6ee5fSAndroid Build Coastguard Worker
683*58e6ee5fSAndroid Build Coastguard Worker snprintf(file, FILE_SIZE, "per_cpu/cpu%d/buffer_size_kb", cpu);
684*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, file);
685*58e6ee5fSAndroid Build Coastguard Worker if (!str)
686*58e6ee5fSAndroid Build Coastguard Worker break;
687*58e6ee5fSAndroid Build Coastguard Worker
688*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
689*58e6ee5fSAndroid Build Coastguard Worker if (!cpu)
690*58e6ee5fSAndroid Build Coastguard Worker putchar('\n');
691*58e6ee5fSAndroid Build Coastguard Worker
692*58e6ee5fSAndroid Build Coastguard Worker printf("CPU %d buffer size (kb): %s\n", cpu, cont);
693*58e6ee5fSAndroid Build Coastguard Worker free(str);
694*58e6ee5fSAndroid Build Coastguard Worker }
695*58e6ee5fSAndroid Build Coastguard Worker
696*58e6ee5fSAndroid Build Coastguard Worker total:
697*58e6ee5fSAndroid Build Coastguard Worker free(str);
698*58e6ee5fSAndroid Build Coastguard Worker
699*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, "buffer_total_size_kb");
700*58e6ee5fSAndroid Build Coastguard Worker if (!str)
701*58e6ee5fSAndroid Build Coastguard Worker return;
702*58e6ee5fSAndroid Build Coastguard Worker
703*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
704*58e6ee5fSAndroid Build Coastguard Worker printf("\nBuffer total size in kilobytes:\n");
705*58e6ee5fSAndroid Build Coastguard Worker printf(" %s\n", str);
706*58e6ee5fSAndroid Build Coastguard Worker
707*58e6ee5fSAndroid Build Coastguard Worker out:
708*58e6ee5fSAndroid Build Coastguard Worker free(str);
709*58e6ee5fSAndroid Build Coastguard Worker }
710*58e6ee5fSAndroid Build Coastguard Worker
report_clock(struct buffer_instance * instance)711*58e6ee5fSAndroid Build Coastguard Worker static void report_clock(struct buffer_instance *instance)
712*58e6ee5fSAndroid Build Coastguard Worker {
713*58e6ee5fSAndroid Build Coastguard Worker struct tracefs_instance *tracefs = instance ? instance->tracefs : NULL;
714*58e6ee5fSAndroid Build Coastguard Worker char *clock;
715*58e6ee5fSAndroid Build Coastguard Worker
716*58e6ee5fSAndroid Build Coastguard Worker clock = tracefs_get_clock(tracefs);
717*58e6ee5fSAndroid Build Coastguard Worker
718*58e6ee5fSAndroid Build Coastguard Worker /* Default clock is "local", only show others */
719*58e6ee5fSAndroid Build Coastguard Worker if (clock && strcmp(clock, "local") != 0)
720*58e6ee5fSAndroid Build Coastguard Worker printf("\nClock: %s\n", clock);
721*58e6ee5fSAndroid Build Coastguard Worker
722*58e6ee5fSAndroid Build Coastguard Worker free(clock);
723*58e6ee5fSAndroid Build Coastguard Worker }
724*58e6ee5fSAndroid Build Coastguard Worker
report_cpumask(struct buffer_instance * instance)725*58e6ee5fSAndroid Build Coastguard Worker static void report_cpumask(struct buffer_instance *instance)
726*58e6ee5fSAndroid Build Coastguard Worker {
727*58e6ee5fSAndroid Build Coastguard Worker char *str;
728*58e6ee5fSAndroid Build Coastguard Worker char *cont;
729*58e6ee5fSAndroid Build Coastguard Worker int cpus;
730*58e6ee5fSAndroid Build Coastguard Worker int n;
731*58e6ee5fSAndroid Build Coastguard Worker int i;
732*58e6ee5fSAndroid Build Coastguard Worker
733*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, "tracing_cpumask");
734*58e6ee5fSAndroid Build Coastguard Worker if (!str)
735*58e6ee5fSAndroid Build Coastguard Worker return;
736*58e6ee5fSAndroid Build Coastguard Worker
737*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
738*58e6ee5fSAndroid Build Coastguard Worker
739*58e6ee5fSAndroid Build Coastguard Worker /* check to make sure all CPUs on this machine are set */
740*58e6ee5fSAndroid Build Coastguard Worker cpus = tracecmd_count_cpus();
741*58e6ee5fSAndroid Build Coastguard Worker
742*58e6ee5fSAndroid Build Coastguard Worker for (i = strlen(cont) - 1; i >= 0 && cpus > 0; i--) {
743*58e6ee5fSAndroid Build Coastguard Worker if (cont[i] == ',')
744*58e6ee5fSAndroid Build Coastguard Worker continue;
745*58e6ee5fSAndroid Build Coastguard Worker
746*58e6ee5fSAndroid Build Coastguard Worker if (cont[i] == 'f') {
747*58e6ee5fSAndroid Build Coastguard Worker cpus -= 4;
748*58e6ee5fSAndroid Build Coastguard Worker continue;
749*58e6ee5fSAndroid Build Coastguard Worker }
750*58e6ee5fSAndroid Build Coastguard Worker
751*58e6ee5fSAndroid Build Coastguard Worker if (cpus >= 4)
752*58e6ee5fSAndroid Build Coastguard Worker break;
753*58e6ee5fSAndroid Build Coastguard Worker
754*58e6ee5fSAndroid Build Coastguard Worker if (cont[i] >= '0' && cont[i] <= '9')
755*58e6ee5fSAndroid Build Coastguard Worker n = cont[i] - '0';
756*58e6ee5fSAndroid Build Coastguard Worker else
757*58e6ee5fSAndroid Build Coastguard Worker n = 10 + (cont[i] - 'a');
758*58e6ee5fSAndroid Build Coastguard Worker
759*58e6ee5fSAndroid Build Coastguard Worker while (cpus > 0) {
760*58e6ee5fSAndroid Build Coastguard Worker if (!(n & 1))
761*58e6ee5fSAndroid Build Coastguard Worker break;
762*58e6ee5fSAndroid Build Coastguard Worker n >>= 1;
763*58e6ee5fSAndroid Build Coastguard Worker cpus--;
764*58e6ee5fSAndroid Build Coastguard Worker }
765*58e6ee5fSAndroid Build Coastguard Worker break;
766*58e6ee5fSAndroid Build Coastguard Worker }
767*58e6ee5fSAndroid Build Coastguard Worker
768*58e6ee5fSAndroid Build Coastguard Worker /* If cpus is greater than zero, one isn't set */
769*58e6ee5fSAndroid Build Coastguard Worker if (cpus > 0)
770*58e6ee5fSAndroid Build Coastguard Worker printf("\nCPU mask: %s\n", cont);
771*58e6ee5fSAndroid Build Coastguard Worker
772*58e6ee5fSAndroid Build Coastguard Worker free(str);
773*58e6ee5fSAndroid Build Coastguard Worker }
774*58e6ee5fSAndroid Build Coastguard Worker
report_probes(struct buffer_instance * instance,const char * file,const char * string)775*58e6ee5fSAndroid Build Coastguard Worker static void report_probes(struct buffer_instance *instance,
776*58e6ee5fSAndroid Build Coastguard Worker const char *file, const char *string)
777*58e6ee5fSAndroid Build Coastguard Worker {
778*58e6ee5fSAndroid Build Coastguard Worker char *str;
779*58e6ee5fSAndroid Build Coastguard Worker char *cont;
780*58e6ee5fSAndroid Build Coastguard Worker int newline;
781*58e6ee5fSAndroid Build Coastguard Worker int i;
782*58e6ee5fSAndroid Build Coastguard Worker
783*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, file);
784*58e6ee5fSAndroid Build Coastguard Worker if (!str)
785*58e6ee5fSAndroid Build Coastguard Worker return;
786*58e6ee5fSAndroid Build Coastguard Worker
787*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
788*58e6ee5fSAndroid Build Coastguard Worker if (strlen(cont) == 0)
789*58e6ee5fSAndroid Build Coastguard Worker goto out;
790*58e6ee5fSAndroid Build Coastguard Worker
791*58e6ee5fSAndroid Build Coastguard Worker printf("\n%s:\n", string);
792*58e6ee5fSAndroid Build Coastguard Worker
793*58e6ee5fSAndroid Build Coastguard Worker newline = 1;
794*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; cont[i]; i++) {
795*58e6ee5fSAndroid Build Coastguard Worker if (newline)
796*58e6ee5fSAndroid Build Coastguard Worker printf(" ");
797*58e6ee5fSAndroid Build Coastguard Worker putchar(cont[i]);
798*58e6ee5fSAndroid Build Coastguard Worker if (cont[i] == '\n')
799*58e6ee5fSAndroid Build Coastguard Worker newline = 1;
800*58e6ee5fSAndroid Build Coastguard Worker else
801*58e6ee5fSAndroid Build Coastguard Worker newline = 0;
802*58e6ee5fSAndroid Build Coastguard Worker }
803*58e6ee5fSAndroid Build Coastguard Worker putchar('\n');
804*58e6ee5fSAndroid Build Coastguard Worker out:
805*58e6ee5fSAndroid Build Coastguard Worker free(str);
806*58e6ee5fSAndroid Build Coastguard Worker }
807*58e6ee5fSAndroid Build Coastguard Worker
report_kprobes(struct buffer_instance * instance)808*58e6ee5fSAndroid Build Coastguard Worker static void report_kprobes(struct buffer_instance *instance)
809*58e6ee5fSAndroid Build Coastguard Worker {
810*58e6ee5fSAndroid Build Coastguard Worker report_probes(instance, "kprobe_events", "Kprobe events");
811*58e6ee5fSAndroid Build Coastguard Worker }
812*58e6ee5fSAndroid Build Coastguard Worker
report_uprobes(struct buffer_instance * instance)813*58e6ee5fSAndroid Build Coastguard Worker static void report_uprobes(struct buffer_instance *instance)
814*58e6ee5fSAndroid Build Coastguard Worker {
815*58e6ee5fSAndroid Build Coastguard Worker report_probes(instance, "uprobe_events", "Uprobe events");
816*58e6ee5fSAndroid Build Coastguard Worker }
817*58e6ee5fSAndroid Build Coastguard Worker
report_traceon(struct buffer_instance * instance)818*58e6ee5fSAndroid Build Coastguard Worker static void report_traceon(struct buffer_instance *instance)
819*58e6ee5fSAndroid Build Coastguard Worker {
820*58e6ee5fSAndroid Build Coastguard Worker char *str;
821*58e6ee5fSAndroid Build Coastguard Worker char *cont;
822*58e6ee5fSAndroid Build Coastguard Worker
823*58e6ee5fSAndroid Build Coastguard Worker str = get_instance_file_content(instance, "tracing_on");
824*58e6ee5fSAndroid Build Coastguard Worker if (!str)
825*58e6ee5fSAndroid Build Coastguard Worker return;
826*58e6ee5fSAndroid Build Coastguard Worker
827*58e6ee5fSAndroid Build Coastguard Worker cont = strstrip(str);
828*58e6ee5fSAndroid Build Coastguard Worker
829*58e6ee5fSAndroid Build Coastguard Worker /* double newline as this is the last thing printed */
830*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(cont, "0") == 0)
831*58e6ee5fSAndroid Build Coastguard Worker printf("\nTracing is disabled\n\n");
832*58e6ee5fSAndroid Build Coastguard Worker else
833*58e6ee5fSAndroid Build Coastguard Worker printf("\nTracing is enabled\n\n");
834*58e6ee5fSAndroid Build Coastguard Worker
835*58e6ee5fSAndroid Build Coastguard Worker free(str);
836*58e6ee5fSAndroid Build Coastguard Worker }
837*58e6ee5fSAndroid Build Coastguard Worker
stat_instance(struct buffer_instance * instance,bool opt)838*58e6ee5fSAndroid Build Coastguard Worker static void stat_instance(struct buffer_instance *instance, bool opt)
839*58e6ee5fSAndroid Build Coastguard Worker {
840*58e6ee5fSAndroid Build Coastguard Worker if (instance != &top_instance) {
841*58e6ee5fSAndroid Build Coastguard Worker if (instance != first_instance)
842*58e6ee5fSAndroid Build Coastguard Worker printf("---------------\n");
843*58e6ee5fSAndroid Build Coastguard Worker printf("Instance: %s\n",
844*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_get_name(instance->tracefs));
845*58e6ee5fSAndroid Build Coastguard Worker }
846*58e6ee5fSAndroid Build Coastguard Worker
847*58e6ee5fSAndroid Build Coastguard Worker report_file(instance, "current_tracer", "nop", "Tracer: ");
848*58e6ee5fSAndroid Build Coastguard Worker report_events(instance);
849*58e6ee5fSAndroid Build Coastguard Worker report_event_filters(instance);
850*58e6ee5fSAndroid Build Coastguard Worker report_event_triggers(instance);
851*58e6ee5fSAndroid Build Coastguard Worker report_ftrace_filters(instance);
852*58e6ee5fSAndroid Build Coastguard Worker report_graph_funcs(instance);
853*58e6ee5fSAndroid Build Coastguard Worker report_buffers(instance);
854*58e6ee5fSAndroid Build Coastguard Worker report_clock(instance);
855*58e6ee5fSAndroid Build Coastguard Worker report_cpumask(instance);
856*58e6ee5fSAndroid Build Coastguard Worker report_file(instance, "tracing_max_latency", "0", "Max Latency: ");
857*58e6ee5fSAndroid Build Coastguard Worker report_kprobes(instance);
858*58e6ee5fSAndroid Build Coastguard Worker report_uprobes(instance);
859*58e6ee5fSAndroid Build Coastguard Worker report_file(instance, "set_event_pid", "", "Filtered event PIDs:\n");
860*58e6ee5fSAndroid Build Coastguard Worker report_file(instance, "set_ftrace_pid", "no pid",
861*58e6ee5fSAndroid Build Coastguard Worker "Filtered function tracer PIDs:\n");
862*58e6ee5fSAndroid Build Coastguard Worker if (opt) {
863*58e6ee5fSAndroid Build Coastguard Worker printf("\nOptions:\n");
864*58e6ee5fSAndroid Build Coastguard Worker show_options(" ", instance);
865*58e6ee5fSAndroid Build Coastguard Worker }
866*58e6ee5fSAndroid Build Coastguard Worker report_traceon(instance);
867*58e6ee5fSAndroid Build Coastguard Worker report_file(instance, "error_log", "", "Error log:\n");
868*58e6ee5fSAndroid Build Coastguard Worker if (instance == &top_instance)
869*58e6ee5fSAndroid Build Coastguard Worker report_instances();
870*58e6ee5fSAndroid Build Coastguard Worker }
871*58e6ee5fSAndroid Build Coastguard Worker
trace_stat(int argc,char ** argv)872*58e6ee5fSAndroid Build Coastguard Worker void trace_stat (int argc, char **argv)
873*58e6ee5fSAndroid Build Coastguard Worker {
874*58e6ee5fSAndroid Build Coastguard Worker struct buffer_instance *instance = &top_instance;
875*58e6ee5fSAndroid Build Coastguard Worker bool opt = false;
876*58e6ee5fSAndroid Build Coastguard Worker int topt = 0;
877*58e6ee5fSAndroid Build Coastguard Worker int status;
878*58e6ee5fSAndroid Build Coastguard Worker int c;
879*58e6ee5fSAndroid Build Coastguard Worker
880*58e6ee5fSAndroid Build Coastguard Worker init_top_instance();
881*58e6ee5fSAndroid Build Coastguard Worker
882*58e6ee5fSAndroid Build Coastguard Worker for (;;) {
883*58e6ee5fSAndroid Build Coastguard Worker c = getopt(argc-1, argv+1, "htoB:");
884*58e6ee5fSAndroid Build Coastguard Worker if (c == -1)
885*58e6ee5fSAndroid Build Coastguard Worker break;
886*58e6ee5fSAndroid Build Coastguard Worker switch (c) {
887*58e6ee5fSAndroid Build Coastguard Worker case 'h':
888*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
889*58e6ee5fSAndroid Build Coastguard Worker break;
890*58e6ee5fSAndroid Build Coastguard Worker case 'B':
891*58e6ee5fSAndroid Build Coastguard Worker instance = allocate_instance(optarg);
892*58e6ee5fSAndroid Build Coastguard Worker if (!instance)
893*58e6ee5fSAndroid Build Coastguard Worker die("Failed to create instance");
894*58e6ee5fSAndroid Build Coastguard Worker add_instance(instance, tracecmd_count_cpus());
895*58e6ee5fSAndroid Build Coastguard Worker /* top instance requires direct access */
896*58e6ee5fSAndroid Build Coastguard Worker if (!topt && is_top_instance(first_instance))
897*58e6ee5fSAndroid Build Coastguard Worker first_instance = instance;
898*58e6ee5fSAndroid Build Coastguard Worker break;
899*58e6ee5fSAndroid Build Coastguard Worker case 't':
900*58e6ee5fSAndroid Build Coastguard Worker /* Force to use top instance */
901*58e6ee5fSAndroid Build Coastguard Worker topt = 1;
902*58e6ee5fSAndroid Build Coastguard Worker instance = &top_instance;
903*58e6ee5fSAndroid Build Coastguard Worker break;
904*58e6ee5fSAndroid Build Coastguard Worker case 'o':
905*58e6ee5fSAndroid Build Coastguard Worker opt = 1;
906*58e6ee5fSAndroid Build Coastguard Worker break;
907*58e6ee5fSAndroid Build Coastguard Worker default:
908*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
909*58e6ee5fSAndroid Build Coastguard Worker }
910*58e6ee5fSAndroid Build Coastguard Worker }
911*58e6ee5fSAndroid Build Coastguard Worker
912*58e6ee5fSAndroid Build Coastguard Worker update_first_instance(instance, topt);
913*58e6ee5fSAndroid Build Coastguard Worker
914*58e6ee5fSAndroid Build Coastguard Worker for_all_instances(instance) {
915*58e6ee5fSAndroid Build Coastguard Worker stat_instance(instance, opt);
916*58e6ee5fSAndroid Build Coastguard Worker }
917*58e6ee5fSAndroid Build Coastguard Worker
918*58e6ee5fSAndroid Build Coastguard Worker if (tracecmd_stack_tracer_status(&status) >= 0) {
919*58e6ee5fSAndroid Build Coastguard Worker if (status > 0)
920*58e6ee5fSAndroid Build Coastguard Worker printf("Stack tracing is enabled\n\n");
921*58e6ee5fSAndroid Build Coastguard Worker } else {
922*58e6ee5fSAndroid Build Coastguard Worker printf("Error reading stack tracer status\n\n");
923*58e6ee5fSAndroid Build Coastguard Worker }
924*58e6ee5fSAndroid Build Coastguard Worker
925*58e6ee5fSAndroid Build Coastguard Worker exit(0);
926*58e6ee5fSAndroid Build Coastguard Worker }
927