]>
git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - tools/perf/util/trace-event-info.c
2 * Copyright (C) 2008,2009, Steven Rostedt <srostedt@redhat.com>
4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License (not later!)
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
28 #include <sys/types.h>
37 #include <linux/kernel.h>
40 #include "trace-event.h"
46 #define STR(x) _STR(x)
49 #define TRACE_CTRL "tracing_on"
51 #define AVAILABLE "available_tracers"
52 #define CURRENT "current_tracer"
53 #define ITER_CTRL "trace_options"
54 #define MAX_LATENCY "tracing_max_latency"
56 unsigned int page_size
;
58 static const char *output_file
= "trace.info";
62 struct event_list
*next
;
67 struct events
*sibling
;
68 struct events
*children
;
75 static void die(const char *fmt
, ...)
87 vfprintf(stderr
, fmt
, ap
);
90 fprintf(stderr
, "\n");
94 void *malloc_or_die(unsigned int size
)
104 static const char *find_debugfs(void)
106 const char *path
= debugfs_mount(NULL
);
109 die("Your kernel not support debugfs filesystem");
115 * Finds the path to the debugfs/tracing
116 * Allocates the string and stores it.
118 static const char *find_tracing_dir(void)
120 static char *tracing
;
121 static int tracing_found
;
127 debugfs
= find_debugfs();
129 tracing
= malloc_or_die(strlen(debugfs
) + 9);
131 sprintf(tracing
, "%s/tracing", debugfs
);
137 static char *get_tracing_file(const char *name
)
142 tracing
= find_tracing_dir();
146 file
= malloc_or_die(strlen(tracing
) + strlen(name
) + 2);
148 sprintf(file
, "%s/%s", tracing
, name
);
152 static void put_tracing_file(char *file
)
157 static ssize_t
write_or_die(const void *buf
, size_t len
)
161 ret
= write(output_fd
, buf
, len
);
163 die("writing to '%s'", output_file
);
170 unsigned char str
[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
173 ptr
= (unsigned int *)(void *)str
;
174 return *ptr
== 0x01020304;
177 static unsigned long long copy_file_fd(int fd
)
179 unsigned long long size
= 0;
184 r
= read(fd
, buf
, BUFSIZ
);
187 write_or_die(buf
, r
);
194 static unsigned long long copy_file(const char *file
)
196 unsigned long long size
= 0;
199 fd
= open(file
, O_RDONLY
);
201 die("Can't read '%s'", file
);
202 size
= copy_file_fd(fd
);
208 static unsigned long get_size_fd(int fd
)
210 unsigned long long size
= 0;
215 r
= read(fd
, buf
, BUFSIZ
);
220 lseek(fd
, 0, SEEK_SET
);
225 static unsigned long get_size(const char *file
)
227 unsigned long long size
= 0;
230 fd
= open(file
, O_RDONLY
);
232 die("Can't read '%s'", file
);
233 size
= get_size_fd(fd
);
239 static void read_header_files(void)
241 unsigned long long size
, check_size
;
245 path
= get_tracing_file("events/header_page");
246 fd
= open(path
, O_RDONLY
);
248 die("can't read '%s'", path
);
250 /* unfortunately, you can not stat debugfs files for size */
251 size
= get_size_fd(fd
);
253 write_or_die("header_page", 12);
254 write_or_die(&size
, 8);
255 check_size
= copy_file_fd(fd
);
258 if (size
!= check_size
)
259 die("wrong size for '%s' size=%lld read=%lld",
260 path
, size
, check_size
);
261 put_tracing_file(path
);
263 path
= get_tracing_file("events/header_event");
264 fd
= open(path
, O_RDONLY
);
266 die("can't read '%s'", path
);
268 size
= get_size_fd(fd
);
270 write_or_die("header_event", 13);
271 write_or_die(&size
, 8);
272 check_size
= copy_file_fd(fd
);
273 if (size
!= check_size
)
274 die("wrong size for '%s'", path
);
275 put_tracing_file(path
);
279 static bool name_in_tp_list(char *sys
, struct tracepoint_path
*tps
)
282 if (!strcmp(sys
, tps
->name
))
290 static void copy_event_system(const char *sys
, struct tracepoint_path
*tps
)
292 unsigned long long size
, check_size
;
302 die("can't read directory '%s'", sys
);
304 while ((dent
= readdir(dir
))) {
305 if (dent
->d_type
!= DT_DIR
||
306 strcmp(dent
->d_name
, ".") == 0 ||
307 strcmp(dent
->d_name
, "..") == 0 ||
308 !name_in_tp_list(dent
->d_name
, tps
))
310 format
= malloc_or_die(strlen(sys
) + strlen(dent
->d_name
) + 10);
311 sprintf(format
, "%s/%s/format", sys
, dent
->d_name
);
312 ret
= stat(format
, &st
);
319 write_or_die(&count
, 4);
322 while ((dent
= readdir(dir
))) {
323 if (dent
->d_type
!= DT_DIR
||
324 strcmp(dent
->d_name
, ".") == 0 ||
325 strcmp(dent
->d_name
, "..") == 0 ||
326 !name_in_tp_list(dent
->d_name
, tps
))
328 format
= malloc_or_die(strlen(sys
) + strlen(dent
->d_name
) + 10);
329 sprintf(format
, "%s/%s/format", sys
, dent
->d_name
);
330 ret
= stat(format
, &st
);
333 /* unfortunately, you can not stat debugfs files for size */
334 size
= get_size(format
);
335 write_or_die(&size
, 8);
336 check_size
= copy_file(format
);
337 if (size
!= check_size
)
338 die("error in size of file '%s'", format
);
346 static void read_ftrace_files(struct tracepoint_path
*tps
)
350 path
= get_tracing_file("events/ftrace");
352 copy_event_system(path
, tps
);
354 put_tracing_file(path
);
357 static bool system_in_tp_list(char *sys
, struct tracepoint_path
*tps
)
360 if (!strcmp(sys
, tps
->system
))
368 static void read_event_files(struct tracepoint_path
*tps
)
378 path
= get_tracing_file("events");
382 die("can't read directory '%s'", path
);
384 while ((dent
= readdir(dir
))) {
385 if (dent
->d_type
!= DT_DIR
||
386 strcmp(dent
->d_name
, ".") == 0 ||
387 strcmp(dent
->d_name
, "..") == 0 ||
388 strcmp(dent
->d_name
, "ftrace") == 0 ||
389 !system_in_tp_list(dent
->d_name
, tps
))
394 write_or_die(&count
, 4);
397 while ((dent
= readdir(dir
))) {
398 if (dent
->d_type
!= DT_DIR
||
399 strcmp(dent
->d_name
, ".") == 0 ||
400 strcmp(dent
->d_name
, "..") == 0 ||
401 strcmp(dent
->d_name
, "ftrace") == 0 ||
402 !system_in_tp_list(dent
->d_name
, tps
))
404 sys
= malloc_or_die(strlen(path
) + strlen(dent
->d_name
) + 2);
405 sprintf(sys
, "%s/%s", path
, dent
->d_name
);
406 ret
= stat(sys
, &st
);
408 write_or_die(dent
->d_name
, strlen(dent
->d_name
) + 1);
409 copy_event_system(sys
, tps
);
415 put_tracing_file(path
);
418 static void read_proc_kallsyms(void)
420 unsigned int size
, check_size
;
421 const char *path
= "/proc/kallsyms";
425 ret
= stat(path
, &st
);
429 write_or_die(&size
, 4);
432 size
= get_size(path
);
433 write_or_die(&size
, 4);
434 check_size
= copy_file(path
);
435 if (size
!= check_size
)
436 die("error in size of file '%s'", path
);
440 static void read_ftrace_printk(void)
442 unsigned int size
, check_size
;
447 path
= get_tracing_file("printk_formats");
448 ret
= stat(path
, &st
);
452 write_or_die(&size
, 4);
455 size
= get_size(path
);
456 write_or_die(&size
, 4);
457 check_size
= copy_file(path
);
458 if (size
!= check_size
)
459 die("error in size of file '%s'", path
);
461 put_tracing_file(path
);
464 static struct tracepoint_path
*
465 get_tracepoints_path(struct perf_event_attr
*pattrs
, int nb_events
)
467 struct tracepoint_path path
, *ppath
= &path
;
468 int i
, nr_tracepoints
= 0;
470 for (i
= 0; i
< nb_events
; i
++) {
471 if (pattrs
[i
].type
!= PERF_TYPE_TRACEPOINT
)
474 ppath
->next
= tracepoint_id_to_path(pattrs
[i
].config
);
476 die("%s\n", "No memory to alloc tracepoints list");
480 return nr_tracepoints
> 0 ? path
.next
: NULL
;
483 int read_tracing_data(int fd
, struct perf_event_attr
*pattrs
, int nb_events
)
486 struct tracepoint_path
*tps
= get_tracepoints_path(pattrs
, nb_events
);
489 * What? No tracepoints? No sense writing anything here, bail out.
499 memcpy(buf
+ 3, "tracing", 7);
501 write_or_die(buf
, 10);
503 write_or_die(VERSION
, strlen(VERSION
) + 1);
511 write_or_die(buf
, 1);
513 /* save size of long */
514 buf
[0] = sizeof(long);
515 write_or_die(buf
, 1);
518 page_size
= sysconf(_SC_PAGESIZE
);
519 write_or_die(&page_size
, 4);
522 read_ftrace_files(tps
);
523 read_event_files(tps
);
524 read_proc_kallsyms();
525 read_ftrace_printk();