2006-12-10 Dmitry V. Levin <ldv@altlinux.org>
+ 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 &&
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)
{
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)
};
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)
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;
}
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;
}
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);
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;