diff options
| author | Austin Foxley <austinf@cetoncorp.com> | 2009-10-17 13:19:56 -0700 | 
|---|---|---|
| committer | Austin Foxley <austinf@cetoncorp.com> | 2009-10-17 13:19:56 -0700 | 
| commit | b04c2ba52317dab5b2e4172d2f8678b1025780d8 (patch) | |
| tree | 5fca41f076901fbe5f5b9c3f8cd6f433403f35c0 | |
| parent | 6abc8f6c7c847291a9b20cb5b84e9a2dfe3b578a (diff) | |
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>
| -rw-r--r-- | libc/sysdeps/linux/i386/Makefile.arch | 13 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i386/bits/syscalls.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i386/bits/uClibc_arch_features.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i386/clone.S | 8 | ||||
| -rw-r--r-- | libc/sysdeps/linux/i386/vfork.S | 10 | 
5 files changed, 31 insertions, 4 deletions
diff --git a/libc/sysdeps/linux/i386/Makefile.arch b/libc/sysdeps/linux/i386/Makefile.arch index 2bf2b7607..668cca742 100644 --- a/libc/sysdeps/linux/i386/Makefile.arch +++ b/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 diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h index 23d872a29..f9ea54ac7 100644 --- a/libc/sysdeps/linux/i386/bits/syscalls.h +++ b/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 diff --git a/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h b/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h index deeec03d5..536e9c155 100644 --- a/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h +++ b/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__ diff --git a/libc/sysdeps/linux/i386/clone.S b/libc/sysdeps/linux/i386/clone.S index 14fc25ca1..a7de3fe27 100644 --- a/libc/sysdeps/linux/i386/clone.S +++ b/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) diff --git a/libc/sysdeps/linux/i386/vfork.S b/libc/sysdeps/linux/i386/vfork.S index 8005ff1d2..c9db2f48c 100644 --- a/libc/sysdeps/linux/i386/vfork.S +++ b/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  | 
