about summary refs log tree commit diff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2008-04-09 18:30:12 +0000
committerUlrich Drepper <drepper@redhat.com>2008-04-09 18:30:12 +0000
commit6c30d38fdd1a9aa03efd8aa3569f64666658271c (patch)
treec9b2d7981fb8c7dfffc28d28fc6a9f7984da0c82 /sysdeps/unix
parentde1bbf683e5b1c700c3f631ab8c7e8c7e4aabf90 (diff)
downloadglibc-6c30d38fdd1a9aa03efd8aa3569f64666658271c.tar.gz
glibc-6c30d38fdd1a9aa03efd8aa3569f64666658271c.tar.xz
glibc-6c30d38fdd1a9aa03efd8aa3569f64666658271c.zip
[BZ #5436]
2008-04-09  Ulrich Drepper  <drepper@redhat.com>
	* stdlib/tst-makecontext.c: Change parameter to cf to negative
	value to check for correct sign extension.

	[BZ #5436]
	* sysdeps/unix/sysv/linux/x86_64/makecontext.c (__makecontext):
	Copy 64-bit parameter values even though this is not required in
	the standard.

	* sysdeps/unix/sysv/linux/x86_64/vfork.S (__vfork): Record return
	PC save.
Diffstat (limited to 'sysdeps/unix')
-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