summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2014-08-07 00:07:28 +0000
committerDmitry V. Levin <ldv@altlinux.org>2014-08-07 00:30:26 +0000
commit3c49b02e98af0aabfffd20fd8b34b1f71b8cffb9 (patch)
tree979622f53ab466210b19613b6ccc7936d2f62137
parent15114ec215f889b71fd1f9ed2012b8deeb33a55c (diff)
downloadstrace-3c49b02e98af0aabfffd20fd8b34b1f71b8cffb9.tar.gz
Fix preadv/pwritev offset decoding on bigendian architectures
This partially reverts commit 7845a42b39e59e904d01e75e21f7bc7eb6462560. * util.c (printllval): Remove align argument. * defs.h (printllval): Update prototype. (printllval_aligned, printllval_unaligned): Remove. * file.c (sys_readahead, sys_truncate64, sys_ftruncate64, sys_fadvise64, sys_fadvise64_64, sys_sync_file_range, sys_sync_file_range2, sys_fallocate): Replace printllval_aligned call with printllval. * io.c (sys_pread, sys_pwrite): Likewise. (print_llu_from_low_high_val): New function. (sys_preadv, sys_pwritev): Use it instead of printllval_unaligned.
-rw-r--r--defs.h6
-rw-r--r--file.c24
-rw-r--r--io.c28
-rw-r--r--util.c14
4 files changed, 42 insertions, 30 deletions
diff --git a/defs.h b/defs.h
index 1a3b48376..b92fa7b75 100644
--- a/defs.h
+++ b/defs.h
@@ -663,11 +663,7 @@ extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_b
# define LONG_LONG(a,b) \
((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
#endif
-extern int printllval(struct tcb *, const char *, int, bool);
-#define printllval_aligned(tcp, fmt, arg) \
- printllval((tcp), (fmt), (arg), true)
-#define printllval_unaligned(tcp, fmt, arg) \
- printllval((tcp), (fmt), (arg), false)
+extern int printllval(struct tcb *, const char *, int);
extern void printxval(const struct xlat *, int, const char *);
extern int printargs(struct tcb *);
diff --git a/file.c b/file.c
index a92a7dcb1..360408f39 100644
--- a/file.c
+++ b/file.c
@@ -480,7 +480,7 @@ sys_readahead(struct tcb *tcp)
if (entering(tcp)) {
int argn;
printfd(tcp, tcp->u_arg[0]);
- argn = printllval_aligned(tcp, ", %lld", 1);
+ argn = printllval(tcp, ", %lld", 1);
tprintf(", %ld", tcp->u_arg[argn]);
}
return 0;
@@ -501,7 +501,7 @@ sys_truncate64(struct tcb *tcp)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
- printllval_aligned(tcp, ", %llu", 1);
+ printllval(tcp, ", %llu", 1);
}
return 0;
}
@@ -521,7 +521,7 @@ sys_ftruncate64(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
- printllval_aligned(tcp, ", %llu", 1);
+ printllval(tcp, ", %llu", 1);
}
return 0;
}
@@ -2419,7 +2419,7 @@ sys_fadvise64(struct tcb *tcp)
if (entering(tcp)) {
int argn;
printfd(tcp, tcp->u_arg[0]);
- argn = printllval_aligned(tcp, ", %lld", 1);
+ argn = printllval(tcp, ", %lld", 1);
tprintf(", %ld, ", tcp->u_arg[argn++]);
printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
}
@@ -2432,8 +2432,8 @@ sys_fadvise64_64(struct tcb *tcp)
if (entering(tcp)) {
int argn;
printfd(tcp, tcp->u_arg[0]);
- argn = printllval_aligned(tcp, ", %lld, ", 1);
- argn = printllval_aligned(tcp, "%lld, ", argn);
+ argn = printllval(tcp, ", %lld, ", 1);
+ argn = printllval(tcp, "%lld, ", argn);
#if defined __ARM_EABI__ || defined AARCH64 || defined POWERPC || defined XTENSA
printxval(advise, tcp->u_arg[1], "POSIX_FADV_???");
#else
@@ -2451,8 +2451,8 @@ sys_sync_file_range(struct tcb *tcp)
if (entering(tcp)) {
int argn;
printfd(tcp, tcp->u_arg[0]);
- argn = printllval_aligned(tcp, ", %lld, ", 1);
- argn = printllval_aligned(tcp, "%lld, ", argn);
+ argn = printllval(tcp, ", %lld, ", 1);
+ argn = printllval(tcp, "%lld, ", argn);
printflags(sync_file_range_flags, tcp->u_arg[argn],
"SYNC_FILE_RANGE_???");
}
@@ -2467,8 +2467,8 @@ sys_sync_file_range2(struct tcb *tcp)
printfd(tcp, tcp->u_arg[0]);
printflags(sync_file_range_flags, 1,
"SYNC_FILE_RANGE_???");
- argn = printllval_aligned(tcp, ", %lld, ", 2);
- argn = printllval_aligned(tcp, "%lld, ", argn);
+ argn = printllval(tcp, ", %lld, ", 2);
+ argn = printllval(tcp, "%lld, ", argn);
}
return 0;
}
@@ -2480,8 +2480,8 @@ sys_fallocate(struct tcb *tcp)
int argn;
printfd(tcp, tcp->u_arg[0]); /* fd */
tprintf(", %#lo, ", tcp->u_arg[1]); /* mode */
- argn = printllval_aligned(tcp, "%llu, ", 2); /* offset */
- printllval_aligned(tcp, "%llu", argn); /* len */
+ argn = printllval(tcp, "%llu, ", 2); /* offset */
+ printllval(tcp, "%llu", argn); /* len */
}
return 0;
}
diff --git a/io.c b/io.c
index fea121886..437777733 100644
--- a/io.c
+++ b/io.c
@@ -199,7 +199,7 @@ sys_pread(struct tcb *tcp)
else
printstr(tcp, tcp->u_arg[1], tcp->u_rval);
tprintf(", %lu, ", tcp->u_arg[2]);
- printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
+ printllval(tcp, "%llu", PREAD_OFFSET_ARG);
}
return 0;
}
@@ -212,12 +212,32 @@ sys_pwrite(struct tcb *tcp)
tprints(", ");
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu, ", tcp->u_arg[2]);
- printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
+ printllval(tcp, "%llu", PREAD_OFFSET_ARG);
}
return 0;
}
#if HAVE_SYS_UIO_H
+
+static void
+print_llu_from_low_high_val(struct tcb *tcp, int arg)
+{
+#if SIZEOF_LONG == SIZEOF_LONG_LONG
+ tprintf("%llu", (unsigned long long) tcp->u_arg[arg]);
+#elif defined(LINUX_MIPSN32)
+ tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]);
+#else
+# ifdef X32
+ if (current_personality == 0)
+ tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]);
+ else
+# endif
+ tprintf("%llu",
+ ((unsigned long long) tcp->u_arg[arg + 1] << (sizeof(long) * 8))
+ | (unsigned long long) tcp->u_arg[arg]);
+#endif
+}
+
int
sys_preadv(struct tcb *tcp)
{
@@ -231,7 +251,7 @@ sys_preadv(struct tcb *tcp)
}
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
- printllval_unaligned(tcp, "%llu", 3);
+ print_llu_from_low_high_val(tcp, 3);
}
return 0;
}
@@ -244,7 +264,7 @@ sys_pwritev(struct tcb *tcp)
tprints(", ");
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
- printllval_unaligned(tcp, "%llu", 3);
+ print_llu_from_low_high_val(tcp, 3);
}
return 0;
}
diff --git a/util.c b/util.c
index 33482d5f5..c78e962c9 100644
--- a/util.c
+++ b/util.c
@@ -225,7 +225,7 @@ printxval(const struct xlat *xlat, int val, const char *dflt)
* argument.
*/
int
-printllval(struct tcb *tcp, const char *format, int arg_no, bool align)
+printllval(struct tcb *tcp, const char *format, int arg_no)
{
#if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
# if SUPPORTED_PERSONALITIES > 1
@@ -236,10 +236,8 @@ printllval(struct tcb *tcp, const char *format, int arg_no, bool align)
# if SUPPORTED_PERSONALITIES > 1
} else {
# if defined(AARCH64) || defined(POWERPC64)
- if (align) {
- /* Align arg_no to the next even number. */
- arg_no = (arg_no + 1) & 0xe;
- }
+ /* Align arg_no to the next even number. */
+ arg_no = (arg_no + 1) & 0xe;
# endif
tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
arg_no += 2;
@@ -263,10 +261,8 @@ printllval(struct tcb *tcp, const char *format, int arg_no, bool align)
defined LINUX_MIPSO32 || \
defined POWERPC || \
defined XTENSA
- if (align) {
- /* Align arg_no to the next even number. */
- arg_no = (arg_no + 1) & 0xe;
- }
+ /* Align arg_no to the next even number. */
+ arg_no = (arg_no + 1) & 0xe;
# endif
tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
arg_no += 2;