[PATCH] Correct decoding of readahead on powerpc32

Andreas Schwab schwab at redhat.com
Tue Nov 3 14:43:54 UTC 2009


"Dmitry V. Levin" <ldv-u2l5PoMzF/Vg9hUCZPvPmw at public.gmane.org> writes:

> On Tue, Nov 03, 2009 at 01:56:46PM +0100, Andreas Schwab wrote:
>> * linux/powerpc/syscallent.h (sys_readahead): Account for 64bit
>> alignment on powerpc32.
>> * file.c (sys_readahead): Align 64bit arg.
>
> Looks OK.  By the way, do sys_fadvise64() and sys_fadvise64_64() need the
> same fix?

Good catch.  Also, PowerPC64 needs the same treatment as the other 64bit
architectures.

Andreas.

>From 5ece400d716bf1741b97c32128391e3d65d2d6b6 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab at redhat.com>
Date: Tue, 3 Nov 2009 15:21:14 +0100
Subject: [PATCH] Correct decoding of readahead and fadvice64(_64) on PowerPC

* file.c (sys_readahead): Align 64bit argument.  Handle PowerPC64
like other 64bit architectures.
(sys_fadvise64): Likewise.
(sys_fadvise64_64): Handle PowerPC like ARM.
* linux/powerpc/syscallent.h (sys_readahead): Account for 64bit
argument alignment on PowerPC32.
---
 file.c                     |    8 +++++---
 linux/powerpc/syscallent.h |    2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/file.c b/file.c
index 2197cdc..2e46284 100644
--- a/file.c
+++ b/file.c
@@ -610,10 +610,11 @@ 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
+# 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]
@@ -2815,9 +2816,10 @@ 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
+# 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
@@ -2842,7 +2844,7 @@ sys_fadvise64_64(struct tcb *tcp)
 #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
+#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]));
 		printxval(advise, tcp->u_arg[1], "POSIX_FADV_???");
diff --git a/linux/powerpc/syscallent.h b/linux/powerpc/syscallent.h
index 116edc8..ecf7245 100644
--- a/linux/powerpc/syscallent.h
+++ b/linux/powerpc/syscallent.h
@@ -219,7 +219,7 @@
 	{ 5,	0,	sys_putpmsg,		"putpmsg"		}, /* 188 */
 	{ 0,	TP,	sys_vfork,		"vfork"			}, /* 189 */
 	{ 2,	0,	sys_getrlimit,		"getrlimit"		}, /* 190 */
-	{ 4,	TD,	sys_readahead,		"readahead"		}, /* 190 */
+	{ 5,	TD,	sys_readahead,		"readahead"		}, /* 190 */
 	{ 6,	0,	sys_mmap,		"mmap2"			}, /* 192 */
 	{ 4,	TF,	sys_truncate64,		"truncate64"		}, /* 193 */
 	{ 4,	TD,	sys_ftruncate64,	"ftruncate64"		}, /* 194 */
-- 
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