__bionic_clone.S revision bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2
1bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott Hughes#include <machine/asm.h> 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/linux-syscalls.h> 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 45e3fc43ddeada547a155c6f561a12ff0b16e02d3Elliott Hughes// int __pthread_clone(int (*fn)(void*), void* tls, int flags, void* arg); 5bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott HughesENTRY(__pthread_clone) 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pushl %ebx 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pushl %ecx 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movl 16(%esp), %ecx 9cb08204053a285951b1907ef14a832f16a1a4679Jack Ren 10cb08204053a285951b1907ef14a832f16a1a4679Jack Ren # save tls 11cb08204053a285951b1907ef14a832f16a1a4679Jack Ren movl %ecx, %ebx 12cb08204053a285951b1907ef14a832f16a1a4679Jack Ren # 16-byte alignment on child stack 13cb08204053a285951b1907ef14a832f16a1a4679Jack Ren andl $~15, %ecx 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project # insert arguments onto the child stack 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movl 12(%esp), %eax 17cb08204053a285951b1907ef14a832f16a1a4679Jack Ren movl %eax, -16(%ecx) 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movl 24(%esp), %eax 19cb08204053a285951b1907ef14a832f16a1a4679Jack Ren movl %eax, -12(%ecx) 20cb08204053a285951b1907ef14a832f16a1a4679Jack Ren movl %ebx, -8(%ecx) 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 22e480fc83b2887388d469eb3bf58c86c610f5b082Jack Ren subl $16, %ecx 23cb08204053a285951b1907ef14a832f16a1a4679Jack Ren movl 20(%esp), %ebx 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project movl $__NR_clone, %eax 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int $0x80 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project test %eax, %eax 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project jns 1f 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2922d366cc09383956dc264ed4641572e609392eeeJin Wei # an error occurred, set errno and return -1 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project negl %eax 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project call __set_errno 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project orl $-1, %eax 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project jmp 2f 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project1: 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project jnz 2f 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project # we're in the child thread now, call __thread_entry 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project # with the appropriate arguments on the child stack 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project # we already placed most of them 41cb08204053a285951b1907ef14a832f16a1a4679Jack Ren call __thread_entry 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hlt 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project2: 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project popl %ecx 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project popl %ebx 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ret 48bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott HughesEND(__pthread_clone) 4997cf7f3394780d524038fc083e2c134031b54728David 'Digit' Turner 5022d366cc09383956dc264ed4641572e609392eeeJin Wei 5122d366cc09383956dc264ed4641572e609392eeeJin Wei/* 5222d366cc09383956dc264ed4641572e609392eeeJin Wei * int __bionic_clone(unsigned long clone_flags, 5322d366cc09383956dc264ed4641572e609392eeeJin Wei * void* newsp, 5422d366cc09383956dc264ed4641572e609392eeeJin Wei * int *parent_tidptr, 5522d366cc09383956dc264ed4641572e609392eeeJin Wei * void *new_tls, 5622d366cc09383956dc264ed4641572e609392eeeJin Wei * int *child_tidptr, 5722d366cc09383956dc264ed4641572e609392eeeJin Wei * int (*fn)(void *), 5822d366cc09383956dc264ed4641572e609392eeeJin Wei * void *arg); 5916984423bc67cd334d74b585bac2c01e44583624Bruce Beare */ 60bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott HughesENTRY(__bionic_clone) 6122d366cc09383956dc264ed4641572e609392eeeJin Wei pushl %ebx 6222d366cc09383956dc264ed4641572e609392eeeJin Wei pushl %esi 6322d366cc09383956dc264ed4641572e609392eeeJin Wei pushl %edi 6422d366cc09383956dc264ed4641572e609392eeeJin Wei 6522d366cc09383956dc264ed4641572e609392eeeJin Wei # insert arguments onto the child stack 6622d366cc09383956dc264ed4641572e609392eeeJin Wei movl 20(%esp), %ecx 6722d366cc09383956dc264ed4641572e609392eeeJin Wei andl $~15, %ecx 6822d366cc09383956dc264ed4641572e609392eeeJin Wei movl 36(%esp), %eax 6922d366cc09383956dc264ed4641572e609392eeeJin Wei movl %eax, -16(%ecx) 7022d366cc09383956dc264ed4641572e609392eeeJin Wei movl 40(%esp), %eax 7122d366cc09383956dc264ed4641572e609392eeeJin Wei movl %eax, -12(%ecx) 7222d366cc09383956dc264ed4641572e609392eeeJin Wei 7322d366cc09383956dc264ed4641572e609392eeeJin Wei subl $16, %ecx 7422d366cc09383956dc264ed4641572e609392eeeJin Wei movl 16(%esp), %ebx 7522d366cc09383956dc264ed4641572e609392eeeJin Wei movl 24(%esp), %edx 7622d366cc09383956dc264ed4641572e609392eeeJin Wei movl 32(%esp), %esi 7722d366cc09383956dc264ed4641572e609392eeeJin Wei movl 28(%esp), %edi 7822d366cc09383956dc264ed4641572e609392eeeJin Wei movl $__NR_clone, %eax 7922d366cc09383956dc264ed4641572e609392eeeJin Wei int $0x80 8022d366cc09383956dc264ed4641572e609392eeeJin Wei test %eax, %eax 8122d366cc09383956dc264ed4641572e609392eeeJin Wei jns 1f 8222d366cc09383956dc264ed4641572e609392eeeJin Wei 8322d366cc09383956dc264ed4641572e609392eeeJin Wei # an error occurred, set errno and return -1 8422d366cc09383956dc264ed4641572e609392eeeJin Wei negl %eax 8522d366cc09383956dc264ed4641572e609392eeeJin Wei call __set_errno 8622d366cc09383956dc264ed4641572e609392eeeJin Wei orl $-1, %eax 8722d366cc09383956dc264ed4641572e609392eeeJin Wei jmp 2f 8822d366cc09383956dc264ed4641572e609392eeeJin Wei 8922d366cc09383956dc264ed4641572e609392eeeJin Wei1: 9022d366cc09383956dc264ed4641572e609392eeeJin Wei jnz 2f 9122d366cc09383956dc264ed4641572e609392eeeJin Wei 9222d366cc09383956dc264ed4641572e609392eeeJin Wei # we're in the child now, call __bionic_clone_entry 9322d366cc09383956dc264ed4641572e609392eeeJin Wei # with the appropriate arguments on the child stack 9422d366cc09383956dc264ed4641572e609392eeeJin Wei # we already placed most of them 9522d366cc09383956dc264ed4641572e609392eeeJin Wei call __bionic_clone_entry 9622d366cc09383956dc264ed4641572e609392eeeJin Wei hlt 9722d366cc09383956dc264ed4641572e609392eeeJin Wei 9822d366cc09383956dc264ed4641572e609392eeeJin Wei2: 9922d366cc09383956dc264ed4641572e609392eeeJin Wei popl %edi 10022d366cc09383956dc264ed4641572e609392eeeJin Wei popl %esi 10122d366cc09383956dc264ed4641572e609392eeeJin Wei popl %ebx 10222d366cc09383956dc264ed4641572e609392eeeJin Wei ret 103bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott HughesEND(__bionic_clone) 104