Browse Source

i386 specific bit for nptl

 * RESET_PID support for clone.S
 * SAVE_PID, RESTORE_PID in vfork.S
 * fixup syscall assembly constraints to be a little less restrictive
      allows arbitrary variables to be used as the syscall nr

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

+ 11 - 2
libc/sysdeps/linux/i386/Makefile.arch

@@ -5,8 +5,17 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
-CSRC := brk.c sigaction.c __syscall_error.c
+CSRC := brk.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 bsd-_setjmp.S \
+	__longjmp.S setjmp.S bsd-setjmp.S bsd-_setjmp.S \
 	sync_file_range.S syscall.S mmap.S mmap64.S posix_fadvise64.S
+
+
+ifneq ($(UCLIBC_HAS_THREADS_NATIVE),y)
+SSRC += vfork.S clone.S
+endif

+ 1 - 1
libc/sysdeps/linux/i386/bits/syscalls.h

@@ -102,7 +102,7 @@ __asm__ (".L__X'%ebx = 1\n\t"
     "int $0x80\n\t"                                                           \
     RESTOREARGS_##nr                                                          \
     : "=a" (resultvar)                                                        \
-    : "i" (name) ASMFMT_##nr(args) : "memory", "cc");                         \
+    : "g" (name) ASMFMT_##nr(args) : "memory", "cc");                         \
      (int) resultvar; })
 
 #define LOADARGS_0

+ 1 - 1
libc/sysdeps/linux/i386/bits/uClibc_arch_features.h

@@ -37,7 +37,7 @@
 #undef __UCLIBC_HAVE_ASM_GLOBAL_DOT_NAME__
 
 /* define if target supports CFI pseudo ops */
-#undef __UCLIBC_HAVE_ASM_CFI_DIRECTIVES__
+#define __UCLIBC_HAVE_ASM_CFI_DIRECTIVES__
 
 /* define if target supports IEEE signed zero floats */
 #define __UCLIBC_HAVE_SIGNED_ZERO__

+ 8 - 0
libc/sysdeps/linux/i386/clone.S

@@ -79,7 +79,10 @@ clone:
 	movl	%eax,8(%ecx)
 	/* Don't leak any information.  */
 	movl	$0,4(%ecx)
+#ifndef RESET_PID
 	movl	$0,(%ecx)
+#endif
+
 
 	/* Do the system call */
 	pushl	%ebx
@@ -90,6 +93,10 @@ clone:
 	movl	FLAGS+12(%esp),%ebx
 	movl	CTID+12(%esp),%edi
 	movl	$__NR_clone,%eax
+#ifdef RESET_PID
+	/* Remember the flag value.  */
+	movl	%ebx, (%ecx)
+#endif
 	int	$0x80
 	popl	%edi
 	popl	%esi
@@ -121,3 +128,4 @@ __error:
 	jmp __syscall_error
 
 .size clone,.-clone
+weak_alias(clone, __clone)

+ 10 - 0
libc/sysdeps/linux/i386/vfork.S

@@ -18,9 +18,19 @@
 
 __vfork:
 	popl %ecx
+
+#ifdef SAVE_PID
+	SAVE_PID
+#endif
+
 	movl $__NR_vfork,%eax
 	int $0x80
 	pushl %ecx
+
+#ifdef RESTORE_PID
+	RESTORE_PID
+#endif
+
 	cmpl $-4095,%eax
 	jae __syscall_error
 	ret