summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-04-10 19:21:13 +0000
committerJakub Jelinek <jakub@redhat.com>2008-04-10 19:21:13 +0000
commitb0c50524f1fb93adbd52e9950f92650e020b0d59 (patch)
treefd9af5238c7ebb9bb27ffafb3e47be9ed5ca2680 /sysdeps/unix/sysv/linux
parent3a2e541ba348de2bbab7b65328694403e61e5dff (diff)
Updated to fedora-glibc-20080410T1907
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/i386/vfork.S3
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/makecontext.c26
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/vfork.S3
3 files changed, 21 insertions, 11 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/vfork.S b/sysdeps/unix/sysv/linux/i386/vfork.S
index eefd4b49cb..2494d9bef0 100644
--- a/sysdeps/unix/sysv/linux/i386/vfork.S
+++ b/sysdeps/unix/sysv/linux/i386/vfork.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2002, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2002, 2004, 2005, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@gnu.org>.
@@ -34,6 +34,7 @@ ENTRY (__vfork)
/* Pop the return PC value into ECX. */
popl %ecx
cfi_adjust_cfa_offset (-4)
+ cfi_register (%eip, %ecx)
#ifdef SAVE_PID
SAVE_PID
diff --git a/sysdeps/unix/sysv/linux/x86_64/makecontext.c b/sysdeps/unix/sysv/linux/x86_64/makecontext.c
index 5deea7d1b2..615dede522 100644
--- a/sysdeps/unix/sysv/linux/x86_64/makecontext.c
+++ b/sysdeps/unix/sysv/linux/x86_64/makecontext.c
@@ -1,5 +1,5 @@
/* Create new context.
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>, 2002.
@@ -78,31 +78,39 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
sp[idx_uc_link] = (unsigned long int) ucp->uc_link;
va_start (ap, argc);
- /* Handle arguments. */
+ /* Handle arguments.
+
+ The standard says the parameters must all be int values. This is
+ an historic accident and would be done differently today. For
+ x86-64 all integer values are passed as 64-bit values and
+ therefore extending the API to copy 64-bit values instead of
+ 32-bit ints makes sense. It does not break existing
+ functionality and it does not violate the standard which says
+ that passing non-int values means undefined behavior. */
for (i = 0; i < argc; ++i)
switch (i)
{
case 0:
- ucp->uc_mcontext.gregs [REG_RDI] = va_arg (ap, int);
+ ucp->uc_mcontext.gregs[REG_RDI] = va_arg (ap, long int);
break;
case 1:
- ucp->uc_mcontext.gregs [REG_RSI] = va_arg (ap, int);
+ ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, long int);
break;
case 2:
- ucp->uc_mcontext.gregs [REG_RDX] = va_arg (ap, int);
+ ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, long int);
break;
case 3:
- ucp->uc_mcontext.gregs [REG_RCX] = va_arg (ap, int);
+ ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, long int);
break;
case 4:
- ucp->uc_mcontext.gregs [REG_R8] = va_arg (ap, int);
+ ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, long int);
break;
case 5:
- ucp->uc_mcontext.gregs [REG_R9] = va_arg (ap, int);
+ ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, long int);
break;
default:
/* Put value on stack. */
- sp[(i - 5)] = va_arg (ap, int);
+ sp[i - 5] = va_arg (ap, unsigned long int);
break;
}
va_end (ap);
diff --git a/sysdeps/unix/sysv/linux/x86_64/vfork.S b/sysdeps/unix/sysv/linux/x86_64/vfork.S
index 4bad38892b..e289656ad2 100644
--- a/sysdeps/unix/sysv/linux/x86_64/vfork.S
+++ b/sysdeps/unix/sysv/linux/x86_64/vfork.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2004, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -31,6 +31,7 @@ ENTRY (__vfork)
is preserved by the syscall and that we're allowed to destroy. */
popq %rdi
cfi_adjust_cfa_offset(-8)
+ cfi_register(%rip, %rdi)
#ifdef SAVE_PID
SAVE_PID