From: Eugene Syromyatnikov Date: Wed, 21 Sep 2016 21:21:27 +0000 (+0300) Subject: util: add getarg_ll and getarg_ull functions X-Git-Tag: v4.14~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b93991d381e345b926c0ed29612177b16d4cc28c;p=strace util: add getarg_ll and getarg_ull functions These allow retrieving specific argument in full taking into account peculiarities of runtimes which employ tcp->ext_arg (e.g. x32). * defs.h (getarg_ll, getarg_ull): New prototypes. * util.c (getarg_ll, getarg_ull): New functions. (printargs): Use getarg_ull. --- diff --git a/defs.h b/defs.h index 4c7a0637..d447eb1e 100644 --- a/defs.h +++ b/defs.h @@ -542,6 +542,8 @@ extern int printllval(struct tcb *, const char *, int) extern void printaddr(long); extern void printxvals(const uint64_t, const char *, const struct xlat *, ...) ATTRIBUTE_SENTINEL; +extern long long getarg_ll(struct tcb *tcp, int argn); +extern unsigned long long getarg_ull(struct tcb *tcp, int argn); extern int printargs(struct tcb *); extern int printargs_u(struct tcb *); extern int printargs_d(struct tcb *); diff --git a/util.c b/util.c index 056711d1..0dbe20c9 100644 --- a/util.c +++ b/util.c @@ -1413,24 +1413,44 @@ print_array(struct tcb *tcp, return cur >= end_addr; } -int -printargs(struct tcb *tcp) +long long +getarg_ll(struct tcb *tcp, int argn) { - if (entering(tcp)) { - int i; - int n = tcp->s_ent->nargs; - for (i = 0; i < n; i++) { #if HAVE_STRUCT_TCB_EXT_ARG # if SUPPORTED_PERSONALITIES > 1 - if (current_personality == 1) - tprintf("%s%#lx", i ? ", " : "", tcp->u_arg[i]); - else + if (current_personality == 1) + return (long) tcp->u_arg[argn]; + else # endif - tprintf("%s%#llx", i ? ", " : "", tcp->ext_arg[i]); + return (long long) tcp->ext_arg[argn]; #else - tprintf("%s%#lx", i ? ", " : "", tcp->u_arg[i]); + return (long) tcp->u_arg[argn]; #endif - } +} + +unsigned long long +getarg_ull(struct tcb *tcp, int argn) +{ +#if HAVE_STRUCT_TCB_EXT_ARG +# if SUPPORTED_PERSONALITIES > 1 + if (current_personality == 1) + return (unsigned long) tcp->u_arg[argn]; + else +# endif + return (unsigned long long) tcp->ext_arg[argn]; +#else + return (unsigned long) tcp->u_arg[argn]; +#endif +} + +int +printargs(struct tcb *tcp) +{ + if (entering(tcp)) { + int i; + int n = tcp->s_ent->nargs; + for (i = 0; i < n; i++) + tprintf("%s%#llx", i ? ", " : "", getarg_ull(tcp, i)); } return 0; }