aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/builtin-trace.c33
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
18static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, unsigned long arg) 18static 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
25static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned long arg) 26static 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
55static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned long arg) 57static 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
95static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, unsigned long arg) 98static 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
136static struct syscall_fmt { 140static 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
204static size_t fprintf_duration(unsigned long t, FILE *fp) 209static 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) {