1#include <sys/linux-syscalls.h> 2 3.text 4 5/* 6 * int __pthread_clone(int (*fn)(void*), void *tls, int flags, 7 * void *arg); 8 */ 9.globl __pthread_clone 10.type __pthread_clone, @function 11.align 4 12__pthread_clone: 13 pushl %ebx 14 pushl %ecx 15 movl 16(%esp), %ecx 16 17 # save tls 18 movl %ecx, %ebx 19 # 16-byte alignment on child stack 20 andl $~15, %ecx 21 22 # insert arguments onto the child stack 23 movl 12(%esp), %eax 24 movl %eax, -16(%ecx) 25 movl 24(%esp), %eax 26 movl %eax, -12(%ecx) 27 movl %ebx, -8(%ecx) 28 29 subl $16, %ecx 30 movl 20(%esp), %ebx 31 movl $__NR_clone, %eax 32 int $0x80 33 test %eax, %eax 34 jns 1f 35 36 # an error occured, set errno and return -1 37 negl %eax 38 call __set_errno 39 orl $-1, %eax 40 jmp 2f 41 421: 43 jnz 2f 44 45 # we're in the child thread now, call __thread_entry 46 # with the appropriate arguments on the child stack 47 # we already placed most of them 48 call __thread_entry 49 hlt 50 512: 52 popl %ecx 53 popl %ebx 54 ret 55 56/* XXX: TODO: Add __bionic_clone here 57 * See bionic/bionic_clone.c and arch-arm/bionic/clone.S 58 * for more details... 59 */ 60