aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2006-12-13 17:14:36 +0000
committerPatrick Jacques <kernelzilla@kinetic-computing.com>2010-11-16 00:05:15 -0700
commit788f507761f6a86b59ee2287cdad3babacbc4eb3 (patch)
treeb853dc729a93b084c852944c6bc1a33de2c6be55
parentf48d41579269a255e4ebd88e616d36f44805de16 (diff)
downloadandroid_external_strace-788f507761f6a86b59ee2287cdad3babacbc4eb3.tar.gz
android_external_strace-788f507761f6a86b59ee2287cdad3babacbc4eb3.tar.bz2
android_external_strace-788f507761f6a86b59ee2287cdad3babacbc4eb3.zip
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.
-rw-r--r--ChangeLog25
-rw-r--r--time.c112
2 files changed, 86 insertions, 51 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c667f8a..d2fbd55e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,30 @@
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 &&
diff --git a/time.c b/time.c
index 3b736b0b..daa14250 100644
--- a/time.c
+++ b/time.c
@@ -47,6 +47,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)
{
@@ -67,16 +80,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)
@@ -238,51 +248,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)
@@ -313,7 +324,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;
}
@@ -345,13 +356,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;
}
@@ -380,9 +391,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);
@@ -390,12 +400,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;