This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix nptl/tst-getpid{1,2} on s390{,x} (take 2)


On Tue, Dec 14, 2004 at 06:14:52PM +0100, Jakub Jelinek wrote:
> So far tested outside of glibc tree only (and solely 31 bit).
> Martin, does this look ok?
> I'll test it fully in my next automated glibc build.

Testing revealed missing #include <tls.h>, fixed below.
With this patch plus the ppc64 clone.S patch I posted today
tst-getpid{1,2} passes on i386/i686/x86_64/ia64/ppc/ppc64/s390/s390x.

2004-12-15  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/s390/s390-32/clone.S (__clone): Add support for
	NPTL where the PID is stored at userlevel and needs to be reset when
	CLONE_THREAD is not used.
	* sysdeps/unix/sysv/linux/s390/s390-64/clone.S (__clone): Likewise.
nptl/
	* sysdeps/unix/sysv/linux/s390/s390-32/clone.S: New file.
	* sysdeps/unix/sysv/linux/s390/s390-64/clone.S: New file.
	* sysdeps/s390/tcb-offsets.sym (TID): Add.

--- libc/sysdeps/unix/sysv/linux/s390/s390-32/clone.S	1 Jul 2004 17:34:29 -0000	1.8
+++ libc/sysdeps/unix/sysv/linux/s390/s390-32/clone.S	15 Dec 2004 12:20:45 -0000	1.8.2.2
@@ -21,6 +21,7 @@
    and invokes a function in the right context after its all over.  */
 
 #include <sysdep.h>
+#include <tls.h>
 #define _ERRNO_H	1
 #include <bits/errno.h>
 
@@ -54,6 +55,18 @@ error:
 PSEUDO_END (__clone)
 	
 thread_start:
+#ifdef RESET_PID
+	tmh	%r3,1		/* CLONE_THREAD == 0x00010000 */
+	jne	1f
+	lhi	%r2,-1
+	tml	%r3,256		/* CLONE_VM == 0x00000100 */
+	jne	2f
+	svc	SYS_ify(getpid)
+2:	ear	%r3,%a0
+	st	%r2,PID(%r3)
+	st	%r2,TID(%r3)
+1:
+#endif
 	/* fn is in gpr 1, arg in gpr 0 */
 	lr      %r2,%r0         /* set first parameter to void *arg */
 	ahi     %r15,-96        /* make room on the stack for the save area */
--- libc/sysdeps/unix/sysv/linux/s390/s390-64/clone.S	1 Jul 2004 17:34:30 -0000	1.10
+++ libc/sysdeps/unix/sysv/linux/s390/s390-64/clone.S	15 Dec 2004 12:20:47 -0000	1.10.2.2
@@ -22,6 +22,7 @@
    and invokes a function in the right context after its all over.  */
 
 #include <sysdep.h>
+#include <tls.h>
 #define _ERRNO_H	1
 #include <bits/errno.h>
 
@@ -55,6 +56,20 @@ error:
 PSEUDO_END (__clone)
 
 thread_start:
+#ifdef RESET_PID
+	tmh	%r3,1		/* CLONE_THREAD == 0x00010000 */
+	jne	1f
+	lhi	%r2,-1
+	tml	%r3,256		/* CLONE_VM == 0x00000100 */
+	jne	2f
+	svc	SYS_ify(getpid)
+2:	ear	%r3,%a0
+	sllg	%r3,%r3,32
+	ear	%r3,%a1
+	st	%r2,PID(%r3)
+	st	%r2,TID(%r3)
+1:
+#endif
 	/* fn is in gpr 1, arg in gpr 0 */
 	lgr	%r2,%r0		/* set first parameter to void *arg */
 	aghi	%r15,-160	/* make room on the stack for the save area */
--- libc/nptl/sysdeps/unix/sysv/linux/s390/s390-32/clone.S 1 Jan 1970 00:00:00 -0000
+++ libc/nptl/sysdeps/unix/sysv/linux/s390/s390-32/clone.S	15 Dec 2004 09:53:45 -0000	1.1.2.1
@@ -0,0 +1,2 @@
+#define RESET_PID
+#include <sysdeps/unix/sysv/linux/s390/s390-32/clone.S>
--- libc/nptl/sysdeps/unix/sysv/linux/s390/s390-64/clone.S 1 Jan 1970 00:00:00 -0000
+++ libc/nptl/sysdeps/unix/sysv/linux/s390/s390-64/clone.S	15 Dec 2004 09:53:45 -0000	1.1.2.1
@@ -0,0 +1,2 @@
+#define RESET_PID
+#include <sysdeps/unix/sysv/linux/s390/s390-64/clone.S>
--- libc/nptl/sysdeps/s390/tcb-offsets.sym	10 Mar 2004 18:59:29 -0000	1.2
+++ libc/nptl/sysdeps/s390/tcb-offsets.sym	15 Dec 2004 09:53:44 -0000	1.2.2.1
@@ -3,3 +3,4 @@
 
 MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads)
 PID				offsetof (struct pthread, pid)
+TID				offsetof (struct pthread, tid)

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]