summary refs log tree commit diff
path: root/linuxthreads
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-02-15 00:40:58 +0000
committerUlrich Drepper <drepper@redhat.com>2003-02-15 00:40:58 +0000
commit7c6d00e62369b27b3493d0f89da47e22568fcac9 (patch)
treebf8090b9bb6969f5682b9d170d6586781ff4d36d /linuxthreads
parent472022708ee08ac559dde540891eb2f8c2a9afcf (diff)
downloadglibc-7c6d00e62369b27b3493d0f89da47e22568fcac9.tar.gz
glibc-7c6d00e62369b27b3493d0f89da47e22568fcac9.tar.xz
glibc-7c6d00e62369b27b3493d0f89da47e22568fcac9.zip
Update.
2003-02-14  Steven Munroe  <sjmunroe@us.ibm.com>

	* sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork):
	Check pthread_create existance, not __pthread_fork.
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/ChangeLog5
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S48
2 files changed, 44 insertions, 9 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index dd1a1c2e59..4f1d89909f 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,8 @@
+2003-02-14  Steven Munroe  <sjmunroe@us.ibm.com>
+
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork):
+	Check pthread_create existance, not __pthread_fork.
+
 2003-02-12  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/pthread/Makefile: Define CFLAGS-confstr.c.
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S
index 8b2f806f93..0229a9a75c 100644
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S
+++ b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S
@@ -25,23 +25,46 @@
    The calling process is suspended until the new process exits or is
    replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
    and the process ID of the new process to the old process.  */
+   
+	.section	".toc","aw"
+.LC0:
+	.tc __libc_pthread_functions[TC],__libc_pthread_functions
+	.section	".text"
+	.align 2
 
 ENTRY (__vfork)
 
 #ifdef __NR_vfork
-
-	SINGLE_THREAD_P
-	bne-	HIDDEN_JUMPTARGET(__fork)
+	
+# ifdef SHARED
+  ld  10,.LC0@toc(2)
+  ld  10,0(10)
+  cmpwi  10,0
+  bne-  HIDDEN_JUMPTARGET(__fork)
+# else
+  .weak  pthread_create
+	lis  10,pthread_create@highest
+	ori  10,10,pthread_create@higher
+  sldi 10,10,32
+  oris 10,10,pthread_create@h
+  ori  10,10,pthread_create@l
+  cmpwi  10,0
+  bne-  .Lhidden_fork
+# endif
 
 	DO_CALL (SYS_ify (vfork));
-
+	
 # ifdef __ASSUME_VFORK_SYSCALL
-	PSEUDO_RET
+  PSEUDO_RET
 # else
-	bnslr+
-	/* Check if vfork syscall is known at all.  */
-	cmpdi	r3,ENOSYS
-	bne	JUMPTARGET(__syscall_error)
+  bnslr+
+  /* Check if vfork syscall is known at all.  */
+  cmpdi	r3,ENOSYS
+# ifdef SHARED
+  bne	JUMPTARGET(__syscall_error)
+# else
+  bne-  .Lsyscall_error
+# endif
 
 # endif
 #endif
@@ -53,6 +76,13 @@ ENTRY (__vfork)
 	PSEUDO_RET
 #endif
 
+# ifndef SHARED
+.Lhidden_fork:
+	b	HIDDEN_JUMPTARGET(__fork)
+.Lsyscall_error:
+	b	JUMPTARGET(__syscall_error)
+# endif
+
 PSEUDO_END (__vfork)
 libc_hidden_def (__vfork)