From 998fac70497f071897c79571ced1486ae3c260d8 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 23 Jun 2004 01:40:45 +0000 Subject: [PATCH] 2004-06-22 Roland McGrath * 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. --- syscall.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/syscall.c b/syscall.c index 5c8a79e8..4264a80d 100644 --- a/syscall.c +++ b/syscall.c @@ -1296,6 +1296,8 @@ struct tcb *tcp; #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 @@ force_result(tcp, error, rval) #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 -- 2.40.0