diff options
-rw-r--r-- | tools/perf/builtin-trace.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 69a065e51135..c29692ab1891 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -15,14 +15,16 @@ | |||
15 | #include <stdlib.h> | 15 | #include <stdlib.h> |
16 | #include <sys/mman.h> | 16 | #include <sys/mman.h> |
17 | 17 | ||
18 | static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, unsigned long arg) | 18 | static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, |
19 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
19 | { | 20 | { |
20 | return scnprintf(bf, size, "%#lx", arg); | 21 | return scnprintf(bf, size, "%#lx", arg); |
21 | } | 22 | } |
22 | 23 | ||
23 | #define SCA_HEX syscall_arg__scnprintf_hex | 24 | #define SCA_HEX syscall_arg__scnprintf_hex |
24 | 25 | ||
25 | static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned long arg) | 26 | static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, |
27 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
26 | { | 28 | { |
27 | int printed = 0, prot = arg; | 29 | int printed = 0, prot = arg; |
28 | 30 | ||
@@ -52,7 +54,8 @@ static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned l | |||
52 | 54 | ||
53 | #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot | 55 | #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot |
54 | 56 | ||
55 | static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned long arg) | 57 | static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, |
58 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
56 | { | 59 | { |
57 | int printed = 0, flags = arg; | 60 | int printed = 0, flags = arg; |
58 | 61 | ||
@@ -92,7 +95,8 @@ static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned | |||
92 | 95 | ||
93 | #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags | 96 | #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags |
94 | 97 | ||
95 | static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, unsigned long arg) | 98 | static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, |
99 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
96 | { | 100 | { |
97 | int behavior = arg; | 101 | int behavior = arg; |
98 | 102 | ||
@@ -136,7 +140,7 @@ static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, uns | |||
136 | static struct syscall_fmt { | 140 | static struct syscall_fmt { |
137 | const char *name; | 141 | const char *name; |
138 | const char *alias; | 142 | const char *alias; |
139 | size_t (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg); | 143 | size_t (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg, u8 *arg_mask); |
140 | bool errmsg; | 144 | bool errmsg; |
141 | bool timeout; | 145 | bool timeout; |
142 | bool hexret; | 146 | bool hexret; |
@@ -198,7 +202,8 @@ struct syscall { | |||
198 | const char *name; | 202 | const char *name; |
199 | bool filtered; | 203 | bool filtered; |
200 | struct syscall_fmt *fmt; | 204 | struct syscall_fmt *fmt; |
201 | size_t (**arg_scnprintf)(char *bf, size_t size, unsigned long arg); | 205 | size_t (**arg_scnprintf)(char *bf, size_t size, |
206 | unsigned long arg, u8 *args_mask); | ||
202 | }; | 207 | }; |
203 | 208 | ||
204 | static size_t fprintf_duration(unsigned long t, FILE *fp) | 209 | static size_t fprintf_duration(unsigned long t, FILE *fp) |
@@ -443,17 +448,23 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, | |||
443 | 448 | ||
444 | if (sc->tp_format != NULL) { | 449 | if (sc->tp_format != NULL) { |
445 | struct format_field *field; | 450 | struct format_field *field; |
451 | u8 mask = 0, bit = 1; | ||
452 | |||
453 | for (field = sc->tp_format->format.fields->next; field; | ||
454 | field = field->next, ++i, bit <<= 1) { | ||
455 | if (mask & bit) | ||
456 | continue; | ||
446 | 457 | ||
447 | for (field = sc->tp_format->format.fields->next; field; field = field->next) { | ||
448 | printed += scnprintf(bf + printed, size - printed, | 458 | printed += scnprintf(bf + printed, size - printed, |
449 | "%s%s: ", printed ? ", " : "", field->name); | 459 | "%s%s: ", printed ? ", " : "", field->name); |
450 | 460 | ||
451 | if (sc->arg_scnprintf && sc->arg_scnprintf[i]) | 461 | if (sc->arg_scnprintf && sc->arg_scnprintf[i]) { |
452 | printed += sc->arg_scnprintf[i](bf + printed, size - printed, args[i]); | 462 | printed += sc->arg_scnprintf[i](bf + printed, size - printed, |
453 | else | 463 | args[i], &mask); |
464 | } else { | ||
454 | printed += scnprintf(bf + printed, size - printed, | 465 | printed += scnprintf(bf + printed, size - printed, |
455 | "%ld", args[i]); | 466 | "%ld", args[i]); |
456 | ++i; | 467 | } |
457 | } | 468 | } |
458 | } else { | 469 | } else { |
459 | while (i < 6) { | 470 | while (i < 6) { |