From: Eugene S. <ev...@gm...> - 2016-09-21 21:21:37
|
These allow retrieving specific argument in full taking into account peculiarities of runtimes which employ EXT_ARG (x32, for example). * defs.h: Add declarations of getarg_ull, getarg_ll. * util.c (getarg_ull): New function. (getarg_ll): Likewise. (printargs): Use getarg_ull for argument retrieval. --- defs.h | 2 ++ util.c | 44 ++++++++++++++++++++++++++++++++------------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/defs.h b/defs.h index 26dbf8e..593e316 100644 --- a/defs.h +++ b/defs.h @@ -546,6 +546,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 unsigned long long getarg_ull(struct tcb *tcp, int argn); +extern long long getarg_ll(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 056711d..b17ab29 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) +unsigned long long +getarg_ull(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 (unsigned long) tcp->u_arg[argn]; + else # endif - tprintf("%s%#llx", i ? ", " : "", tcp->ext_arg[i]); + return (unsigned long long) tcp->ext_arg[argn]; #else - tprintf("%s%#lx", i ? ", " : "", tcp->u_arg[i]); + return (unsigned long) tcp->u_arg[argn]; #endif - } +} + +long long +getarg_ll(struct tcb *tcp, int argn) +{ +#if HAVE_STRUCT_TCB_EXT_ARG +# if SUPPORTED_PERSONALITIES > 1 + if (current_personality == 1) + return (long) tcp->u_arg[argn]; + else +# endif + return (long long) tcp->ext_arg[argn]; +#else + return (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; } -- 1.7.10.4 |