2004-06-22  Roland McGrath  <roland@redhat.com>

	* syscall.c (syscall_fixup) [LINUX && X86_64]: For 32-bit process,
	sign extend the low 32 bits of RAX to 64 bits.
	* syscall.c (force_result): [LINUX && X86_64]: Fix RAX*4 -> RAX*8.
diff --git a/syscall.c b/syscall.c
index 5c8a79e..4264a80 100644
--- a/syscall.c
+++ b/syscall.c
@@ -1296,6 +1296,8 @@
 #elif defined (X86_64)
 	if (upeek(pid, 8*RAX, &rax) < 0)
 		return -1;
+	if (current_personality == 1)
+		rax = (long int)(int)rax; /* sign extend from 32 bits */
 	if (rax != -ENOSYS && !(tcp->flags & TCB_INSYSCALL)) {
 		if (debug)
 			fprintf(stderr, "stray syscall exit: rax = %ld\n", rax);
@@ -1615,7 +1617,7 @@
 #else /* !I386 */
 #ifdef X86_64
 	rax = error ? -error : rval;
-	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(RAX * 4), rax) < 0)
+	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(RAX * 8), rax) < 0)
 		return -1;
 #else
 #ifdef IA64