about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-12-15 07:04:50 +0000
committerUlrich Drepper <drepper@redhat.com>2004-12-15 07:04:50 +0000
commit1f9d7c2739c9442d07c5578920824abb4a3bf509 (patch)
tree6f29ac8743a35132ab5f43b9675bca8bc17ee215
parent8a3f5844c508a67f4fe291236ca7dd73b3d71699 (diff)
downloadglibc-1f9d7c2739c9442d07c5578920824abb4a3bf509.tar.gz
glibc-1f9d7c2739c9442d07c5578920824abb4a3bf509.tar.xz
glibc-1f9d7c2739c9442d07c5578920824abb4a3bf509.zip
Update.
2004-12-14  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Add support
	for pid caching in nptl.
-rw-r--r--ChangeLog5
-rw-r--r--nptl/ChangeLog8
-rw-r--r--nptl/sysdeps/powerpc/tcb-offsets.sym1
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S30
5 files changed, 45 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 176a08920d..35a3ac1e7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-12-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Add support
+	for pid caching in nptl.
+
 2004-10-18  Maciej W. Rozycki  <macro@mips.com>
 
 	* sysdeps/unix/sysv/linux/mips/bits/socket.h (__cmsg_nxthdr): Use
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index f779bd4968..e44a856c13 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,11 @@
+2004-12-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/powerpc/tcb-offsets.sym: Add TID.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: New file.
+
+	* tst-getpid1.c: If child crashes, report this first.  Print which
+	signal.
+
 2004-12-09  Ulrich Drepper  <drepper@redhat.com>
 
 	* init.c (__pthread_initialize_minimal_internal): Also unblock
diff --git a/nptl/sysdeps/powerpc/tcb-offsets.sym b/nptl/sysdeps/powerpc/tcb-offsets.sym
index fddd466f08..a9701fb5b7 100644
--- a/nptl/sysdeps/powerpc/tcb-offsets.sym
+++ b/nptl/sysdeps/powerpc/tcb-offsets.sym
@@ -12,3 +12,4 @@
 MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads)
 #endif
 PID				thread_offsetof (pid)
+TID				thread_offsetof (tid)
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
new file mode 100644
index 0000000000..f87adf4737
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
@@ -0,0 +1,3 @@
+#define RESET_PID
+#include <tcb-offsets.h>
+#include <sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S>
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
index 71e9a84e60..be069c90c8 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
@@ -23,6 +23,9 @@
 #include <bp-sym.h>
 #include <bp-asm.h>
 
+#define CLONE_VM	0x00000100
+#define CLONE_THREAD	0x00010000
+
 /* This is the only really unusual system call in PPC linux, but not
    because of any weirdness in the system call itself; because of
    all the freaky stuff we have to do to make the call useful.  */
@@ -45,10 +48,13 @@ ENTRY (BP_SYM (__clone))
 	beq-	cr0,L(badargs)
 
 	/* Set up stack frame for parent.  */
-	stdu	r1,-80(r1)
+	stdu	r1,-88(r1)
 	std	r29,56(r1)
 	std	r30,64(r1)
 	std	r31,72(r1)
+#ifdef RESET_PID
+	std	r28,80(r1)
+#endif
 
 	/* Set up stack frame for child.  */
 	clrrdi	r4,r4,4
@@ -58,6 +64,9 @@ ENTRY (BP_SYM (__clone))
 	/* Save fn, args, stack across syscall.  */
 	mr	r29,r3			/* Function in r29.  */
 	mr	r30,r4			/* Stack pointer in r30.  */
+#ifdef RESET_PID
+	mr	r28,r5			/* Flags in r28.  */
+#endif
 	mr	r31,r6			/* Argument in r31.  */
 
 	/* 'flags' argument is first parameter to clone syscall. (The other
@@ -81,6 +90,20 @@ ENTRY (BP_SYM (__clone))
 	   it adds a race condition if a signal is sent to a thread
 	   just after it is created (in the previous three instructions).  */
 	mr	r1,r30
+
+#ifdef RESET_PID
+	andis.	r0,r28,1	/* This is & CLONE_THREAD */
+	bne+	r0,L(oldpid)
+	andi.	r0,r28,CLONE_VM
+	li	r3,-1
+	bne-	r0,L(nomoregetpid)
+	DO_CALL(SYS_ify(getpid))
+L(nomoregetpid):
+	stw	r3,TID(r13)
+	stw	r3,PID(r13)
+L(oldpid):
+#endif
+
 	/* Call procedure.  */
 	ld	r0,0(r29)
 	ld	r2,8(r29)
@@ -96,10 +119,13 @@ ENTRY (BP_SYM (__clone))
 
 L(parent):
 	/* Parent.  Restore registers & return.  */
+#ifdef RESET_PID
+	ld	r28,88(r1)
+#endif
 	ld	r31,72(r1)
 	ld	r30,64(r1)
 	ld	r29,56(r1)
-	addi	r1,r1,80
+	addi	r1,r1,88
 	bnslr+
 	b	JUMPTARGET(__syscall_error)