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

Jakub Jelinek jakub@redhat.com
Tue Dec 14 17:14:00 GMT 2004


Hi!

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.

2004-12-14  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.jj	2004-07-12 17:50:26.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/s390/s390-32/clone.S	2004-12-14 17:39:17.888568618 +0100
@@ -54,6 +54,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.jj	2004-07-12 17:50:26.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/s390/s390-64/clone.S	2004-12-14 18:03:24.020208726 +0100
@@ -55,6 +55,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.jj	2004-12-14 17:56:54.715727557 +0100
+++ libc/nptl/sysdeps/unix/sysv/linux/s390/s390-32/clone.S	2004-12-14 17:57:02.301372155 +0100
@@ -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.jj	2004-12-14 17:56:54.000000000 +0100
+++ libc/nptl/sysdeps/unix/sysv/linux/s390/s390-64/clone.S	2004-12-14 18:03:46.223246796 +0100
@@ -0,0 +1,2 @@
+#define RESET_PID
+#include <sysdeps/unix/sysv/linux/s390/s390-64/clone.S>
--- libc/nptl/sysdeps/s390/tcb-offsets.sym.jj	2004-03-10 20:02:20.000000000 +0100
+++ libc/nptl/sysdeps/s390/tcb-offsets.sym	2004-12-14 17:56:00.412430245 +0100
@@ -3,3 +3,4 @@
 
 MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads)
 PID				offsetof (struct pthread, pid)
+TID				offsetof (struct pthread, tid)

	Jakub



More information about the Libc-hacker mailing list