|
@@ -24,6 +24,7 @@
|
|
|
*/
|
|
|
|
|
|
#define _ERRNO_H 1
|
|
|
+#include <features.h>
|
|
|
#include <bits/errno.h>
|
|
|
#include <sys/syscall.h>
|
|
|
|
|
@@ -39,31 +40,42 @@
|
|
|
#define CTID TLS+PTR_SIZE
|
|
|
|
|
|
|
|
|
- .text
|
|
|
- .globl __clone;
|
|
|
- .type __clone,@function;
|
|
|
- .align 1<<4;
|
|
|
+.text
|
|
|
+.type clone,@function;
|
|
|
+.weak clone ; clone = __clone
|
|
|
+
|
|
|
+.type __clone,@function;
|
|
|
+.globl __clone;
|
|
|
|
|
|
__clone:
|
|
|
/* Sanity check arguments. */
|
|
|
movl $-EINVAL,%eax
|
|
|
+
|
|
|
+ test %ecx,%ecx
|
|
|
+ call .Lclone_error
|
|
|
+
|
|
|
+ test %edx,%edx
|
|
|
+ call .Lclone_error
|
|
|
+
|
|
|
movl FUNC(%esp),%ecx /* no NULL function pointers */
|
|
|
#ifdef __PIC__
|
|
|
- jecxz __syscall_error
|
|
|
+ jecxz .Lclone_error
|
|
|
#else
|
|
|
testl %ecx,%ecx
|
|
|
- jz __syscall_error
|
|
|
+ jz .Lclone_error
|
|
|
#endif
|
|
|
movl STACK(%esp),%ecx /* no NULL stack pointers */
|
|
|
#ifdef __PIC__
|
|
|
- jecxz __syscall_error
|
|
|
+ jecxz .Lclone_error
|
|
|
#else
|
|
|
testl %ecx,%ecx
|
|
|
- jz __syscall_error
|
|
|
+ jz .Lclone_error
|
|
|
#endif
|
|
|
|
|
|
- /* Insert the argument onto the new stack. */
|
|
|
- subl $16,%ecx
|
|
|
+ /* 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
|
|
|
movl ARG(%esp),%eax /* no negative argument counts */
|
|
|
movl %eax,12(%ecx)
|
|
|
|
|
@@ -90,7 +102,7 @@ __clone:
|
|
|
popl %ebx
|
|
|
|
|
|
test %eax,%eax
|
|
|
- jl __syscall_error
|
|
|
+ jl .Lclone_error
|
|
|
jz .Lthread_start
|
|
|
|
|
|
.Lpseudo_end:
|
|
@@ -109,7 +121,7 @@ __clone:
|
|
|
movl $__NR_exit, %eax
|
|
|
int $0x80
|
|
|
|
|
|
-__syscall_error:
|
|
|
+.Lclone_error:
|
|
|
negl %eax
|
|
|
pushl %eax
|
|
|
#ifdef __PIC__
|
|
@@ -129,4 +141,3 @@ __syscall_error:
|
|
|
.Lsize:
|
|
|
.size __clone,.Lsize-__clone
|
|
|
|
|
|
-.weak clone ; clone = __clone
|