diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-08-26 11:29:38 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-08-26 16:25:57 -0400 |
commit | beccb2b54a39ca5e49a7aa2912faa33617a45cc1 (patch) | |
tree | 805842bd7728c92c5211b5f6d897493e54b77dfb /tools/perf/builtin-trace.c | |
parent | e5959683adb6b15cc2aebfbed5aa1315e24a53db (diff) |
perf trace: Allow overiding the formatting of syscall fields
The mmap syscalls, for instance, don't have the FORMAT_IS_POINTER for
its pointer arguments, override it.
This also paves the way for more specialized argument beautifiers, like
for mmap's prot and flags arguments.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-mm864hvhrpt39muxmmbtjasz@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-trace.c')
-rw-r--r-- | tools/perf/builtin-trace.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 2d759f57f9d4..60ee811c5129 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -17,24 +17,35 @@ static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, unsigned long ar | |||
17 | return scnprintf(bf, size, "%#lx", arg); | 17 | return scnprintf(bf, size, "%#lx", arg); |
18 | } | 18 | } |
19 | 19 | ||
20 | #define SCA_HEX syscall_arg__scnprintf_hex | ||
21 | |||
20 | static struct syscall_fmt { | 22 | static struct syscall_fmt { |
21 | const char *name; | 23 | const char *name; |
22 | const char *alias; | 24 | const char *alias; |
25 | size_t (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg); | ||
23 | bool errmsg; | 26 | bool errmsg; |
24 | bool timeout; | 27 | bool timeout; |
25 | bool hexret; | 28 | bool hexret; |
26 | } syscall_fmts[] = { | 29 | } syscall_fmts[] = { |
27 | { .name = "access", .errmsg = true, }, | 30 | { .name = "access", .errmsg = true, }, |
28 | { .name = "arch_prctl", .errmsg = true, .alias = "prctl", }, | 31 | { .name = "arch_prctl", .errmsg = true, .alias = "prctl", }, |
29 | { .name = "brk", .hexret = true, }, | 32 | { .name = "brk", .hexret = true, |
33 | .arg_scnprintf = { [0] = SCA_HEX, /* brk */ }, }, | ||
30 | { .name = "mmap", .hexret = true, }, | 34 | { .name = "mmap", .hexret = true, }, |
31 | { .name = "connect", .errmsg = true, }, | 35 | { .name = "connect", .errmsg = true, }, |
32 | { .name = "fstat", .errmsg = true, .alias = "newfstat", }, | 36 | { .name = "fstat", .errmsg = true, .alias = "newfstat", }, |
33 | { .name = "fstatat", .errmsg = true, .alias = "newfstatat", }, | 37 | { .name = "fstatat", .errmsg = true, .alias = "newfstatat", }, |
34 | { .name = "futex", .errmsg = true, }, | 38 | { .name = "futex", .errmsg = true, }, |
39 | { .name = "ioctl", .errmsg = true, | ||
40 | .arg_scnprintf = { [2] = SCA_HEX, /* arg */ }, }, | ||
35 | { .name = "lstat", .errmsg = true, .alias = "newlstat", }, | 41 | { .name = "lstat", .errmsg = true, .alias = "newlstat", }, |
36 | { .name = "mmap", .hexret = true, }, | 42 | { .name = "mmap", .hexret = true, |
43 | .arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, }, | ||
44 | { .name = "mprotect", .errmsg = true, | ||
45 | .arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, }, | ||
37 | { .name = "mremap", .hexret = true, }, | 46 | { .name = "mremap", .hexret = true, }, |
47 | { .name = "munmap", .errmsg = true, | ||
48 | .arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, }, | ||
38 | { .name = "open", .errmsg = true, }, | 49 | { .name = "open", .errmsg = true, }, |
39 | { .name = "poll", .errmsg = true, .timeout = true, }, | 50 | { .name = "poll", .errmsg = true, .timeout = true, }, |
40 | { .name = "ppoll", .errmsg = true, .timeout = true, }, | 51 | { .name = "ppoll", .errmsg = true, .timeout = true, }, |
@@ -232,7 +243,9 @@ static int syscall__set_arg_fmts(struct syscall *sc) | |||
232 | return -1; | 243 | return -1; |
233 | 244 | ||
234 | for (field = sc->tp_format->format.fields->next; field; field = field->next) { | 245 | for (field = sc->tp_format->format.fields->next; field; field = field->next) { |
235 | if (field->flags & FIELD_IS_POINTER) | 246 | if (sc->fmt && sc->fmt->arg_scnprintf[idx]) |
247 | sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx]; | ||
248 | else if (field->flags & FIELD_IS_POINTER) | ||
236 | sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex; | 249 | sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex; |
237 | ++idx; | 250 | ++idx; |
238 | } | 251 | } |