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