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 <sch...@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 <sch...@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, sch...@redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84  5EC7 45C6 250E 6F00 984E
"And now for something completely different."

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to