__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