Browse Source

arm specific bits needed for nptl

 * SAVE_PID, RESTORE_PID in vfork.S
 * clone.S tweaks to allow for the pid to be reset

Signed-off-by: Austin Foxley <austinf@cetoncorp.com>
Austin Foxley 14 years ago
parent
commit
e58798e107

+ 13 - 3
libc/sysdeps/linux/arm/Makefile.arch

@@ -5,14 +5,24 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
-CSRC := brk.c ioperm.c iopl.c mmap.c sigaction.c __syscall_error.c
+CSRC := brk.c ioperm.c iopl.c mmap.c __syscall_error.c
+
+ifneq ($(UCLIBC_HAS_THREADS_NATIVE),y)
+CSRC += sigaction.c
+endif
 
 SSRC := \
-	__longjmp.S vfork.S clone.S setjmp.S bsd-setjmp.S \
+	__longjmp.S setjmp.S bsd-setjmp.S \
 	bsd-_setjmp.S sigrestorer.S mmap64.S
 
+ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y)
+SSRC += libc-aeabi_read_tp.S libc-thumb_atomics.S
+else
+SSRC += vfork.S clone.S
+endif
+
 ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),y)
-        CSRC += posix_fadvise.c posix_fadvise64.c
+CSRC += posix_fadvise.c posix_fadvise64.c
 endif
 
 ifeq ($(CONFIG_ARM_EABI),y)

+ 18 - 5
libc/sysdeps/linux/arm/clone.S

@@ -30,12 +30,12 @@
 /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
 
 .text
-.global clone
-.type clone,%function
+.global __clone
+.type __clone,%function
 .align 2
 #if defined(THUMB1_ONLY)
 .thumb_func
-clone:
+__clone:
 	@ sanity check args
 	cmp	r0, #0
 	beq	__einval
@@ -52,9 +52,15 @@ clone:
 	@ get flags
 	mov	r0, r2
 	@ new sp is already in r1
+	@ load remaining arguments off the stack
+	stmfd	sp!, {r4}
+	ldr	r2, [sp, #4]
+	ldr	r3, [sp, #8]
+	ldr	r4, [sp, #12]
 	DO_CALL (clone)
 	movs	a1, a1
 	blt	__error
+	ldmnefd sp!, {r4}
 	beq	1f
 	bx	lr
 1:
@@ -80,7 +86,7 @@ __error:
 	POP_RET
 .pool
 #else
-clone:
+__clone:
 	@ sanity check args
 	cmp	r0, #0
 	IT(te, ne)
@@ -98,9 +104,15 @@ clone:
 	@ get flags
 	mov	r0, r2
 	@ new sp is already in r1
+	@ load remaining arguments off the stack
+	stmfd	sp!, {r4}
+	ldr	r2, [sp, #4]
+	ldr	r3, [sp, #8]
+	ldr	r4, [sp, #12]
 	DO_CALL (clone)
 	movs	a1, a1
 	blt	__error
+	ldmnefd	sp!, {r4}
 	IT(t, ne)
 #if defined(__USE_BX__)
 	bxne	lr
@@ -120,6 +132,7 @@ __error:
 	b	__syscall_error
 #endif
 
-.size clone,.-clone
+.size __clone,.-__clone
+weak_alias(__clone, clone)
 
 #endif

+ 1 - 0
libc/sysdeps/linux/arm/libc-aeabi_read_tp.S

@@ -0,0 +1 @@
+#include <ldso/ldso/arm/aeabi_read_tp.S>

+ 1 - 0
libc/sysdeps/linux/arm/libc-thumb_atomics.S

@@ -0,0 +1 @@
+#include <ldso/ldso/arm/thumb_atomics.S>

+ 13 - 0
libc/sysdeps/linux/arm/vfork.S

@@ -12,6 +12,15 @@
 #include <bits/errno.h>
 #include <sys/syscall.h>
 
+#ifndef SAVE_PID
+#define SAVE_PID
+#endif
+
+#ifndef RESTORE_PID
+#define RESTORE_PID
+#endif
+
+
 #ifdef __NR_fork
 .text
 .global	__vfork
@@ -23,7 +32,9 @@
 .thumb_func
 __vfork:
 #ifdef __NR_vfork
+	SAVE_PID
 	DO_CALL (vfork)
+	RESTORE_PID
 	ldr		r1, =0xfffff000
 	cmp		r0, r1
 	bcs		1f
@@ -57,7 +68,9 @@ __error:
 __vfork:
 
 #ifdef __NR_vfork
+	SAVE_PID
 	DO_CALL (vfork)
+	RESTORE_PID
 	cmn	r0, #4096
 	IT(t, cc)
 #if defined(__USE_BX__)