From: Dmitry V. Levin Date: Wed, 13 Dec 2006 17:14:36 +0000 (+0000) Subject: 2006-12-10 Dmitry V. Levin X-Git-Tag: v4.5.18~257 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1cad25dd44afc58a5345e704dcbe4ec0d57e58eb;p=strace 2006-12-10 Dmitry V. Levin Add biarch support for "struct itimerval". * time.c (printitv): Rename to printitv_bitness(). Add printitv() macro wrapper around printitv_bitness(). (printitv_bitness): Handle 32-bit personality. [ALPHA] (sys_osf_getitimer, sys_osf_setitimer): Use printitv_bitness(). (tprint_timeval, tprint_timeval32): New functions. (printtv_bitness, printitv_bitness, sys_adjtimex): Use them. (printitv32): Remove. --- diff --git a/ChangeLog b/ChangeLog index 582599f7..466a56b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,30 @@ 2006-12-10 Dmitry V. Levin + Add biarch support for "struct itimerval". + * time.c (printitv): Rename to printitv_bitness(). + Add printitv() macro wrapper around printitv_bitness(). + (printitv_bitness): Handle 32-bit personality. + [ALPHA] (sys_osf_getitimer, sys_osf_setitimer): + Use printitv_bitness(). + (tprint_timeval, tprint_timeval32): New functions. + (printtv_bitness, printitv_bitness, sys_adjtimex): Use them. + (printitv32): Remove. + + Add biarch support for "struct timeval". + * defs.h (bitness_t): New enum type. + (printtv_bitness, sprinttv): New function prototypes. + (printtv): Convert to macro wrapper around printtv_bitness(). + (printtv32): Remove. + * desc.c (decode_select): Use printtv_bitness() and sprinttv(). + (sys_oldselect, sys_osf_select, sys_select, sys_pselect6): + Update decode_select() use. + * file.c [ALPHA] (sys_osf_utimes): Use printtv_bitness(). + * time.c (printtv_bitness, sprinttv): New functions. + (printtv, printtv32): Remove. + [ALPHA] (sys_osf_settimeofday, sys_osf_settimeofday): + Use printtv_bitness(). + Fixes RH#171626, RH#173050. + Add biarch support for "struct iovec". * defs.h (personality_wordsize): Add. * io.c [HAVE_SYS_UIO_H] (tprint_iov): [LINUX && diff --git a/time.c b/time.c index cbfa5568..139af0f4 100644 --- a/time.c +++ b/time.c @@ -43,6 +43,19 @@ struct timeval32 u_int32_t tv_sec, tv_usec; }; +static void +tprint_timeval32(struct tcb *tcp, const struct timeval32 *tv) +{ + tprintf("{%u, %u}", tv->tv_sec, tv->tv_usec); +} + +static void +tprint_timeval(struct tcb *tcp, const struct timeval *tv) +{ + tprintf("{%lu, %lu}", + (unsigned long) tv->tv_sec, (unsigned long) tv->tv_usec); +} + void printtv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness) { @@ -63,16 +76,13 @@ printtv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness) struct timeval32 tv; if ((rc = umove(tcp, addr, &tv)) >= 0) - tprintf("{%u, %u}", - tv.tv_sec, tv.tv_usec); + tprint_timeval32(tcp, &tv); } else { struct timeval tv; if ((rc = umove(tcp, addr, &tv)) >= 0) - tprintf("{%lu, %lu}", - (unsigned long) tv.tv_sec, - (unsigned long) tv.tv_usec); + tprint_timeval(tcp, &tv); } if (rc < 0) @@ -234,51 +244,52 @@ static const struct xlat which[] = { }; static void -printitv(tcp, addr) -struct tcb *tcp; -long addr; +printitv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness) { - struct itimerval itv; - if (addr == 0) tprintf("NULL"); else if (!verbose(tcp)) tprintf("%#lx", addr); - else if (umove(tcp, addr, &itv) < 0) - tprintf("{...}"); - else { - tprintf("{it_interval={%lu, %lu}, it_value={%lu, %lu}}", - (long) itv.it_interval.tv_sec, (long) itv.it_interval.tv_usec, - (long) itv.it_value.tv_sec, (long) itv.it_value.tv_usec); - } -} + else + { + int rc; + + if (bitness == BITNESS_32 +#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1 + || personality_wordsize[current_personality] == 4 +#endif + ) + { + struct + { + struct timeval32 it_interval, it_value; + } itv; + + if ((rc = umove(tcp, addr, &itv)) >= 0) + tprintf("{it_interval="); + tprint_timeval32(tcp, &itv.it_interval); + tprintf(", it_value="); + tprint_timeval32(tcp, &itv.it_value); + tprintf("}"); + } else + { + struct itimerval itv; + if ((rc = umove(tcp, addr, &itv)) >= 0) + tprintf("{it_interval="); + tprint_timeval(tcp, &itv.it_interval); + tprintf(", it_value="); + tprint_timeval(tcp, &itv.it_value); + tprintf("}"); + } -#ifdef ALPHA -static void -printitv32(tcp, addr) -struct tcb *tcp; -long addr; -{ - struct itimerval32 - { - struct timeval32 it_interval; - struct timeval32 it_value; - } itv; - - if (addr == 0) - tprintf("NULL"); - else if (!verbose(tcp)) - tprintf("%#lx", addr); - else if (umove(tcp, addr, &itv) < 0) - tprintf("{...}"); - else { - tprintf("{it_interval={%u, %u}, it_value={%u, %u}}", - itv.it_interval.tv_sec, itv.it_interval.tv_usec, - itv.it_value.tv_sec, itv.it_value.tv_usec); - } + if (rc < 0) + tprintf("{...}"); + } } -#endif + +#define printitv(tcp, addr) \ + printitv_bitness((tcp), (addr), BITNESS_CURRENT) int sys_getitimer(tcp) @@ -309,7 +320,7 @@ struct tcb *tcp; if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[1]); else - printitv32(tcp, tcp->u_arg[1]); + printitv_bitness(tcp, tcp->u_arg[1], BITNESS_32); } return 0; } @@ -341,13 +352,13 @@ struct tcb *tcp; if (entering(tcp)) { printxval(which, tcp->u_arg[0], "ITIMER_???"); tprintf(", "); - printitv32(tcp, tcp->u_arg[1]); + printitv_bitness(tcp, tcp->u_arg[1], BITNESS_32); tprintf(", "); } else { if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[2]); else - printitv32(tcp, tcp->u_arg[2]); + printitv_bitness(tcp, tcp->u_arg[2], BITNESS_32); } return 0; } @@ -376,9 +387,8 @@ struct tcb *tcp; txc.maxerror, txc.esterror, txc.status); tprintf("time_constant=%ld, precision=%lu, ", txc.time_constant, txc.precision); - tprintf("tolerance=%ld, time={%lu, %lu}}", - txc.tolerance, (long) txc.time.tv_sec, - (long) txc.time.tv_usec); + tprintf("tolerance=%ld, time=", txc.tolerance); + tprint_timeval(tcp, &txc.time); #else tprintf("{modes=%d, offset=%ld, freq=%ld, ", txc.modes, txc.offset, txc.freq); @@ -386,12 +396,12 @@ struct tcb *tcp; txc.maxerror, txc.esterror, txc.status); tprintf("constant=%ld, precision=%lu, ", txc.constant, txc.precision); - tprintf("tolerance=%ld, time={%lu, %lu}}", - txc.tolerance, (long) txc.time.tv_sec, - (long) txc.time.tv_usec); + tprintf("tolerance=%ld, time=", txc.tolerance); + tprint_timeval(tcp, &txc.time); /* there's a bunch of other stuff, but it's not * worth the time or the trouble to include */ #endif + tprintf("}"); } } return 0;