|
|
@@ -1,4 +1,4 @@
|
|
|
-/* Copyright (C) 1996,1997,98,99,2000,02,03 Free Software Foundation, Inc.
|
|
|
+/* Copyright (C) 1996-2000,02,03,04,2005 Free Software Foundation, Inc.
|
|
|
This file is part of the GNU C Library.
|
|
|
Contributed by Richard Henderson (rth@tamu.edu)
|
|
|
|
|
|
@@ -50,16 +50,26 @@ __clone:
|
|
|
|
|
|
/* no NULL function pointers */
|
|
|
movl FUNC(%esp),%ecx
|
|
|
- jecxz .Lclone_error
|
|
|
+#ifdef __PIC__
|
|
|
+ jecxz __error
|
|
|
+#else
|
|
|
+ testl %ecx,%ecx
|
|
|
+ jz __error
|
|
|
+#endif
|
|
|
|
|
|
/* no NULL stack pointers */
|
|
|
movl STACK(%esp),%ecx
|
|
|
- jecxz .Lclone_error
|
|
|
+#ifdef __PIC__
|
|
|
+ jecxz __error
|
|
|
+#else
|
|
|
+ testl %ecx,%ecx
|
|
|
+ jz __error
|
|
|
+#endif
|
|
|
|
|
|
/* Insert the argument onto the new stack. Make sure the new
|
|
|
thread is started with an alignment of (mod 16). */
|
|
|
andl $0xfffffff0, %ecx
|
|
|
- subl $24,%ecx
|
|
|
+ subl $28,%ecx
|
|
|
movl ARG(%esp),%eax /* no negative argument counts */
|
|
|
movl %eax,12(%ecx)
|
|
|
|
|
|
@@ -86,14 +96,13 @@ __clone:
|
|
|
popl %ebx
|
|
|
|
|
|
test %eax,%eax
|
|
|
- jl .Lclone_error
|
|
|
+ jl __error
|
|
|
jz .Lthread_start
|
|
|
-
|
|
|
-.Lpseudo_end:
|
|
|
ret
|
|
|
|
|
|
.Lthread_start:
|
|
|
- subl %ebp,%ebp /* terminate the stack frame */
|
|
|
+ /* Note: %esi is zero. */
|
|
|
+ movl %esi,%ebp /* terminate the stack frame */
|
|
|
call *%ebx
|
|
|
#ifdef __PIC__
|
|
|
call .Lhere
|
|
|
@@ -105,38 +114,8 @@ __clone:
|
|
|
movl $__NR_exit, %eax
|
|
|
int $0x80
|
|
|
|
|
|
-#ifdef __PIC__
|
|
|
-
|
|
|
-.Lthere:
|
|
|
- movl (%esp), %ebx
|
|
|
- ret
|
|
|
-
|
|
|
-.Lclone_error:
|
|
|
- pushl %ebx
|
|
|
- call .Lthere
|
|
|
- addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
|
|
- xorl %edx, %edx
|
|
|
- subl %eax, %edx
|
|
|
- pushl %edx
|
|
|
- call __errno_location@PLT
|
|
|
- popl %ecx
|
|
|
- popl %ebx
|
|
|
- movl %ecx, (%eax)
|
|
|
- orl $-1, %eax
|
|
|
- jmp .Lpseudo_end
|
|
|
-
|
|
|
-#else /* __PIC__ */
|
|
|
-
|
|
|
-.Lclone_error:
|
|
|
- negl %eax
|
|
|
- pushl %eax
|
|
|
- call __errno_location
|
|
|
- popl %ecx
|
|
|
- movl %ecx, (%eax)
|
|
|
- xorl %eax, %eax
|
|
|
- decl %eax
|
|
|
-
|
|
|
-#endif
|
|
|
+__error:
|
|
|
+ call __syscall_error
|
|
|
|
|
|
.size __clone,.-__clone
|
|
|
|