perf trace beauty: Allow accessing syscall args values in a syscall arg formatter
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: f9f83b3344f9ed6e1d33a87810f38eca5ed6a14f Gitweb: http://git.kernel.org/tip/f9f83b3344f9ed6e1d33a87810f38eca5ed6a14f Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Fri, 14 Jul 2017 10:13:56 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 18 Jul 2017 23:13:53 -0300
perf trace beauty: Allow accessing syscall args values in a syscall arg formatter
For instance, fcntl's upcoming 'arg' formatter needs to look at the 'cmd' value to decide how to format its value, sometimes it is a file flags, sometimes an fd, a pointer to a structure, etc.
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/builtin-trace.c | 23 ++++++++++++++++------- tools/perf/trace/beauty/beauty.h | 13 +++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-)
tools/perf/builtin-trace.c +16 -7
@@ -1369,19 +1369,32 @@ out:* variable to read it. Most notably this avoids extended load instructions * on unaligned addresses */ +static unsigned long __syscall_arg__val (unsigned char *args,u8 idx) +{ +unsigned long val; +unsigned char *p = args +sizeof (unsigned long ) * idx; + +memcpy (&val, p,sizeof (val)); +return val; +} + +unsigned long syscall_arg__val (struct syscall_arg *arg,u8 idx) +{ +return __syscall_arg__val (arg->args, idx); +}static size_t syscall__scnprintf_args (struct syscall *sc,char *bf,size_t size,unsigned char *args,struct trace *trace,struct thread *thread) {size_t printed =0 ; -unsigned char *p;unsigned long val;if (sc->args !=NULL ) {struct format_field *field;u8 bit =1 ;struct syscall_arg arg = { + .args = args, .idx =0 , .mask =0 , .trace = trace,
@@ -1393,9 +1406,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,if (arg.mask & bit)continue ; -/* special care for unaligned accesses */ - p = args +sizeof (unsigned long ) * arg.idx; -memcpy (&val, p,sizeof (val)); + val =syscall_arg__val (&arg, arg.idx);/* * Suppress this argument if its value is zero and
@@ -1431,9 +1442,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,int i =0 ;while (i <6 ) { -/* special care for unaligned accesses */ - p = args +sizeof (unsigned long ) * i; -memcpy (&val, p,sizeof (val)); + val =__syscall_arg__val (args, i); printed +=scnprintf (bf + printed, size - printed,"%sarg%d: %ld" , printed ?", " :"" , i, val);
tools/perf/trace/beauty/beauty.h +13 -0
@@ -6,8 +6,19 @@struct trace ;struct thread ; +/** +* @val: value of syscall argument being formatted +* @args: All the args, use syscall_args__val(arg, nth) to access one +* @thread: tid state (maps, pid, tid, etc) +* @trace: 'perf trace' internals: all threads, etc +* @parm: private area, may be an strarray, for instance +* @idx: syscall arg idx (is this the first?) +* @mask: a syscall arg may mask another arg, see syscall_arg__scnprintf_futex_op +*/ +struct syscall_arg {unsigned long val; +unsigned char *args;struct thread *thread;struct trace *trace;void *parm;
@@ -15,6 +26,8 @@ struct syscall_arg {u8 mask; }; +unsigned long syscall_arg__val (struct syscall_arg *arg,u8 idx); +size_t syscall_arg__scnprintf_strarrays (char *bf,size_t size,struct syscall_arg *arg);#define SCA_STRARRAYS syscall_arg__scnprintf_strarrays