blob: 54b6ef20855b760bf62d600317ad80f219ee2fd0 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001#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
Jack Rencb082042012-03-21 17:48:13 +080016
17 # save tls
18 movl %ecx, %ebx
19 # 16-byte alignment on child stack
20 andl $~15, %ecx
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080021
22 # insert arguments onto the child stack
23 movl 12(%esp), %eax
Jack Rencb082042012-03-21 17:48:13 +080024 movl %eax, -16(%ecx)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080025 movl 24(%esp), %eax
Jack Rencb082042012-03-21 17:48:13 +080026 movl %eax, -12(%ecx)
27 movl %ebx, -8(%ecx)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080028
Jack Rene480fc82011-09-21 12:44:11 +020029 subl $16, %ecx
Jack Rencb082042012-03-21 17:48:13 +080030 movl 20(%esp), %ebx
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080031 movl $__NR_clone, %eax
32 int $0x80
33 test %eax, %eax
34 jns 1f
35
Jin Wei22d366c2012-08-08 15:15:16 +080036 # an error occurred, set errno and return -1
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080037 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
Jack Rencb082042012-03-21 17:48:13 +080048 call __thread_entry
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080049 hlt
50
512:
52 popl %ecx
53 popl %ebx
54 ret
David 'Digit' Turner97cf7f32010-01-22 18:59:05 -080055
Jin Wei22d366c2012-08-08 15:15:16 +080056
57/*
58 * int __bionic_clone(unsigned long clone_flags,
59 * void* newsp,
60 * int *parent_tidptr,
61 * void *new_tls,
62 * int *child_tidptr,
63 * int (*fn)(void *),
64 * void *arg);
Bruce Beare16984422010-06-25 09:02:10 -070065 */
Jin Wei22d366c2012-08-08 15:15:16 +080066.text
67.globl __bionic_clone
68.type __bionic_clone, @function
69.align 4
70__bionic_clone:
71 pushl %ebx
72 pushl %esi
73 pushl %edi
74
75 # insert arguments onto the child stack
76 movl 20(%esp), %ecx
77 andl $~15, %ecx
78 movl 36(%esp), %eax
79 movl %eax, -16(%ecx)
80 movl 40(%esp), %eax
81 movl %eax, -12(%ecx)
82
83 subl $16, %ecx
84 movl 16(%esp), %ebx
85 movl 24(%esp), %edx
86 movl 32(%esp), %esi
87 movl 28(%esp), %edi
88 movl $__NR_clone, %eax
89 int $0x80
90 test %eax, %eax
91 jns 1f
92
93 # an error occurred, set errno and return -1
94 negl %eax
95 call __set_errno
96 orl $-1, %eax
97 jmp 2f
98
991:
100 jnz 2f
101
102 # we're in the child now, call __bionic_clone_entry
103 # with the appropriate arguments on the child stack
104 # we already placed most of them
105 call __bionic_clone_entry
106 hlt
107
1082:
109 popl %edi
110 popl %esi
111 popl %ebx
112 ret