[PATCH] Factor out printing of 64bit syscall argument
Andreas Schwab
schwab at redhat.com
Wed Nov 4 11:55:46 UTC 2009
This patch refactors the printing of 64bit syscall arguments. It has
been tested on x86/x86-64/ppc/ppc64, and should also improve the
situation on mips.
The second patch just adds the decoding of fallocate to the ppc strace.
Andreas.
>From 64c4335fc86e42a6e33819fa763d845017f1ad16 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab at redhat.com>
Date: Wed, 4 Nov 2009 12:26:17 +0100
Subject: [PATCH 1/2] Factor out printing of 64bit syscall argument
* defs.h (ALIGN64): Remove.
(printllval): Declare.
* util.c (printllval): Define.
* file.c (sys_readahead): Use printllval.
(sys_truncate64): Likewise.
(sys_ftruncate64): Likewise.
(sys_fadvise64): Likewise.
(sys_fadvise64_64): Likewise.
(sys_fallocate): Likewise.
* io.c (sys_pread): Likewise.
(sys_pwrite): Likewise.
(sys_pread64): Likewise.
(sys_pwrite64): Likewise.
* mem.c (sys_mmap64): Likewise.
---
defs.h | 16 +-------------
file.c | 65 ++++++++++++++++++++-------------------------------------------
io.c | 28 +++++++-------------------
mem.c | 3 +-
util.c | 36 +++++++++++++++++++++++++++++++++++
5 files changed, 68 insertions(+), 80 deletions(-)
diff --git a/defs.h b/defs.h
index 5bcaa07..dc0d91f 100644
--- a/defs.h
+++ b/defs.h
@@ -651,20 +651,6 @@ extern const char *const signalent2[];
extern const int nsignals2;
#endif /* SUPPORTED_PERSONALITIES >= 3 */
-#if defined(FREEBSD) || (defined(LINUX) \
- && defined(POWERPC) && !defined(__powerpc64__)) \
- || defined (LINUX_MIPSO32)
-/* ARRGH! off_t args are aligned on 64 bit boundaries! */
-#define ALIGN64(tcp,arg) \
-do { \
- if (arg % 2) \
- memmove (&tcp->u_arg[arg], &tcp->u_arg[arg + 1], \
- (tcp->u_nargs - arg - 1) * sizeof tcp->u_arg[0]); \
-} while (0)
-#else
-#define ALIGN64(tcp,arg) do { } while (0)
-#endif
-
#if HAVE_LONG_LONG
/* _l refers to the lower numbered u_arg,
@@ -678,6 +664,8 @@ do { \
#define LONG_LONG(_l,_h) \
((long long)((unsigned long long)(unsigned)(_h) | ((unsigned long long)(_l)<<32)))
#endif
+
+extern int printllval(struct tcb *, const char *, int);
#endif
#ifdef IA64
diff --git a/file.c b/file.c
index 2e46284..dcdf4a9 100644
--- a/file.c
+++ b/file.c
@@ -610,16 +610,10 @@ int
sys_readahead(struct tcb *tcp)
{
if (entering(tcp)) {
- ALIGN64 (tcp, 1);
- tprintf("%ld, %lld, %ld", tcp->u_arg[0],
-# if defined LINUX_MIPSN32
- tcp->ext_arg[1], tcp->u_arg[2]
-# elif defined IA64 || defined X86_64 || defined ALPHA || defined LINUX_MIPSN64 || (defined POWERPC && defined __powerpc64__)
- (long long int) tcp->u_arg[1], tcp->u_arg[2]
-# else
- LONG_LONG(tcp->u_arg[1], tcp->u_arg[2]), tcp->u_arg[3]
-# endif
- );
+ int argn;
+ tprintf("%ld, ", tcp->u_arg[0]);
+ argn = printllval(tcp, "%lld", 1);
+ tprintf(", %ld", tcp->u_arg[argn]);
}
return 0;
}
@@ -631,7 +625,6 @@ sys_lseek64(struct tcb *tcp)
{
if (entering(tcp)) {
long long offset;
- ALIGN64 (tcp, 1); /* FreeBSD aligns off_t args */
offset = LONG_LONG(tcp->u_arg [1], tcp->u_arg[2]);
if (tcp->u_arg[3] == SEEK_SET)
tprintf("%ld, %llu, ", tcp->u_arg[0], offset);
@@ -660,9 +653,8 @@ int
sys_truncate64(struct tcb *tcp)
{
if (entering(tcp)) {
- ALIGN64 (tcp, 1);
printpath(tcp, tcp->u_arg[0]);
- tprintf(", %llu", LONG_LONG(tcp->u_arg[1],tcp->u_arg[2]));
+ printllval(tcp, ", %llu", 1);
}
return 0;
}
@@ -684,9 +676,8 @@ int
sys_ftruncate64(struct tcb *tcp)
{
if (entering(tcp)) {
- ALIGN64 (tcp, 1);
- tprintf("%ld, %llu", tcp->u_arg[0],
- LONG_LONG(tcp->u_arg[1] ,tcp->u_arg[2]));
+ tprintf("%ld, ", tcp->u_arg[0]);
+ printllval(tcp, "%llu", 1);
}
return 0;
}
@@ -2816,16 +2807,11 @@ int
sys_fadvise64(struct tcb *tcp)
{
if (entering(tcp)) {
- ALIGN64(tcp, 1);
- tprintf("%ld, %lld, %ld, ",
- tcp->u_arg[0],
-# if defined IA64 || defined X86_64 || defined ALPHA || (defined POWERPC && defined __powerpc64__)
- (long long int) tcp->u_arg[1], tcp->u_arg[2]);
- printxval(advise, tcp->u_arg[3], "POSIX_FADV_???");
-#else
- LONG_LONG(tcp->u_arg[1], tcp->u_arg[2]), tcp->u_arg[3]);
- printxval(advise, tcp->u_arg[4], "POSIX_FADV_???");
-#endif
+ int argn;
+ tprintf("%ld, ", tcp->u_arg[0]);
+ argn = printllval(tcp, "%lld", 1);
+ tprintf(", %ld, ", tcp->u_arg[argn++]);
+ printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
}
return 0;
}
@@ -2836,22 +2822,14 @@ int
sys_fadvise64_64(struct tcb *tcp)
{
if (entering(tcp)) {
- tprintf("%ld, %lld, %lld, ",
- tcp->u_arg[0],
-#if defined LINUX_MIPSN32
- tcp->ext_arg[1], tcp->ext_arg[2]);
- printxval(advise, tcp->u_arg[3], "POSIX_FADV_???");
-#elif defined IA64 || defined X86_64 || defined ALPHA || defined LINUX_MIPSN64
- (long long int) tcp->u_arg[1], (long long int) tcp->u_arg[2]);
- printxval(advise, tcp->u_arg[3], "POSIX_FADV_???");
-#elif defined ARM || defined POWERPC
- LONG_LONG(tcp->u_arg[2], tcp->u_arg[3]),
- LONG_LONG(tcp->u_arg[4], tcp->u_arg[5]));
+ int argn;
+ tprintf("%ld, ", tcp->u_arg[0]);
+ argn = printllval(tcp, "%lld, ", 1);
+ argn = printllval(tcp, "%lld, ", argn);
+#if defined ARM || defined POWERPC
printxval(advise, tcp->u_arg[1], "POSIX_FADV_???");
#else
- LONG_LONG(tcp->u_arg[1], tcp->u_arg[2]),
- LONG_LONG(tcp->u_arg[3], tcp->u_arg[4]));
- printxval(advise, tcp->u_arg[5], "POSIX_FADV_???");
+ printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
#endif
}
return 0;
@@ -2906,12 +2884,11 @@ int
sys_fallocate(struct tcb *tcp)
{
if (entering(tcp)) {
+ int argn;
tprintf("%ld, ", tcp->u_arg[0]); /* fd */
tprintf("%#lo, ", tcp->u_arg[1]); /* mode */
- tprintf("%llu, ", LONG_LONG(tcp->u_arg[2],
- tcp->u_arg[3])); /* offset */
- tprintf("%llu", LONG_LONG(tcp->u_arg[4],
- tcp->u_arg[5])); /* len */
+ argn = printllval(tcp, "%llu, ", 2); /* offset */
+ printllval(tcp, "%llu", argn); /* len */
}
return 0;
}
diff --git a/io.c b/io.c
index add3fb6..3d2970c 100644
--- a/io.c
+++ b/io.c
@@ -286,9 +286,8 @@ struct tcb *tcp;
tprintf("%#lx", tcp->u_arg[1]);
else
printstr(tcp, tcp->u_arg[1], tcp->u_rval);
- ALIGN64 (tcp, PREAD_OFFSET_ARG); /* PowerPC alignment restriction */
- tprintf(", %lu, %llu", tcp->u_arg[2],
- *(unsigned long long *)&tcp->u_arg[PREAD_OFFSET_ARG]);
+ tprintf(", %lu, ", tcp->u_arg[2]);
+ printllval(tcp, "%llu", PREAD_OFFSET_ARG);
}
return 0;
}
@@ -300,9 +299,8 @@ struct tcb *tcp;
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
- ALIGN64 (tcp, PREAD_OFFSET_ARG); /* PowerPC alignment restriction */
- tprintf(", %lu, %llu", tcp->u_arg[2],
- *(unsigned long long *)&tcp->u_arg[PREAD_OFFSET_ARG]);
+ tprintf(", %lu, ", tcp->u_arg[2]);
+ printllval(tcp, "%llu", PREAD_OFFSET_ARG);
}
return 0;
}
@@ -355,17 +353,12 @@ struct tcb *tcp;
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
} else {
- ALIGN64 (tcp, 3);
if (syserror(tcp))
tprintf("%#lx", tcp->u_arg[1]);
else
printstr(tcp, tcp->u_arg[1], tcp->u_rval);
-#ifdef MIPS_LINUXN32
- tprintf(", %lu, %#llx", tcp->u_arg[2], tcp->ext_arg[3]);
-#else
- tprintf(", %lu, %#llx", tcp->u_arg[2],
- LONG_LONG(tcp->u_arg[3], tcp->u_arg[4]));
-#endif
+ tprintf(", %lu, ", tcp->u_arg[2]);
+ printllval(tcp, "%#llx", 3);
}
return 0;
}
@@ -375,15 +368,10 @@ sys_pwrite64(tcp)
struct tcb *tcp;
{
if (entering(tcp)) {
- ALIGN64 (tcp, 3);
tprintf("%ld, ", tcp->u_arg[0]);
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
-#ifdef MIPS_LINUXN32
- tprintf(", %lu, %#llx", tcp->u_arg[2], tcp->ext_arg[3]);
-#else
- tprintf(", %lu, %#llx", tcp->u_arg[2],
- LONG_LONG(tcp->u_arg[3], tcp->u_arg[4]));
-#endif
+ tprintf(", %lu, ", tcp->u_arg[2]);
+ printllval(tcp, "%#llx", 3);
}
return 0;
}
diff --git a/mem.c b/mem.c
index c922f07..9335217 100644
--- a/mem.c
+++ b/mem.c
@@ -318,7 +318,6 @@ struct tcb *tcp;
return 0;
#endif /* ALPHA */
#endif /* linux */
- ALIGN64 (tcp, 5); /* FreeBSD wierdies */
/* addr */
tprintf("%#lx, ", u_arg[0]);
@@ -337,7 +336,7 @@ struct tcb *tcp;
/* fd */
tprintf(", %ld, ", u_arg[4]);
/* offset */
- tprintf("%#llx", LONG_LONG(u_arg[5], u_arg[6]));
+ printllval(tcp, "%#llx", 5);
}
return RVAL_HEX;
}
diff --git a/util.c b/util.c
index 84baf7a..a471590 100644
--- a/util.c
+++ b/util.c
@@ -254,6 +254,42 @@ printxval(const struct xlat *xlat, int val, const char *dflt)
tprintf("%#x /* %s */", val, dflt);
}
+#if HAVE_LONG_LONG
+/*
+ * Print 64bit argument at position llarg and return the index of the next
+ * argument.
+ */
+int
+printllval(struct tcb *tcp, const char *format, int llarg)
+{
+# if defined(FREEBSD) \
+ || (defined(LINUX) && defined(POWERPC) && !defined(__powerpc64__)) \
+ || defined (LINUX_MIPSO32)
+ /* Align 64bit argument to 64bit boundary. */
+ if (llarg % 2) llarg++;
+# endif
+# if defined LINUX && defined X86_64
+ if (current_personality == 0) {
+ tprintf(format, tcp->u_arg[llarg]);
+ llarg++;
+ } else {
+ tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
+ llarg += 2;
+ }
+# elif defined IA64 || defined ALPHA || (defined POWERPC && defined __powerpc64__)
+ tprintf(format, tcp->u_arg[llarg]);
+ llarg++;
+# elif defined LINUX_MIPSN32
+ tprintf(format, tcp->ext_arg[llarg]);
+ llarg++;
+# else
+ tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
+ llarg += 2;
+# endif
+ return llarg;
+}
+#endif
+
/*
* Interpret `xlat' as an array of flags
* print the entries whose bits are on in `flags'
--
1.6.5.1
>From cec453446303811833cc4672ae73132f751c2a45 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab at redhat.com>
Date: Wed, 4 Nov 2009 12:43:20 +0100
Subject: [PATCH 2/2] Decode fallocate on PowerPC
* linux/powerpc/syscallent.h: Decode fallocate.
---
linux/powerpc/syscallent.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/linux/powerpc/syscallent.h b/linux/powerpc/syscallent.h
index ecf7245..5529324 100644
--- a/linux/powerpc/syscallent.h
+++ b/linux/powerpc/syscallent.h
@@ -338,7 +338,7 @@
{ 4, TD, sys_timerfd, "timerfd" }, /* 306 */
{ 1, TD, sys_eventfd, "eventfd" }, /* 307 */
{ 5, 0, printargs, "SYS_308" }, /* 308 */
- { 5, 0, printargs, "SYS_309" }, /* 309 */
+ { 6, TF, sys_fallocate, "fallocate" }, /* 309 */
{ 3, 0, sys_subpage_prot, "subpage_prot" }, /* 310 */
{ 5, 0, printargs, "SYS_311" }, /* 311 */
{ 5, 0, printargs, "SYS_312" }, /* 312 */
--
1.6.5.1
--
Andreas Schwab, schwab at redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84 5EC7 45C6 250E 6F00 984E
"And now for something completely different."
More information about the Strace-devel
mailing list