Implement clone() C library function properly.

Only provide an implementation for ARM at the moment, since
it requires specific assembly fragments (the standard syscall
stubs cannot be used because the child returns in a different
stack).
This commit is contained in:
David 'Digit' Turner
2010-01-22 18:59:05 -08:00
parent 1a2917ca95
commit 97cf7f3394
15 changed files with 213 additions and 52 deletions

View File

@@ -48,3 +48,8 @@ __pthread_clone:
popl %ecx
popl %ebx
ret
/* XXX: TODO: Add __bionic_clone here
* See bionic/bionic_clone.c and arch-arm/bionic/clone.S
* for more details...
*/

View File

@@ -5,7 +5,7 @@ syscall_src += arch-x86/syscalls/_exit_thread.S
syscall_src += arch-x86/syscalls/__fork.S
syscall_src += arch-x86/syscalls/_waitpid.S
syscall_src += arch-x86/syscalls/waitid.S
syscall_src += arch-x86/syscalls/__clone.S
syscall_src += arch-x86/syscalls/__sys_clone.S
syscall_src += arch-x86/syscalls/execve.S
syscall_src += arch-x86/syscalls/setuid.S
syscall_src += arch-x86/syscalls/getuid.S

View File

@@ -2,19 +2,21 @@
#include <sys/linux-syscalls.h>
.text
.type __clone, @function
.globl __clone
.type __sys_clone, @function
.globl __sys_clone
.align 4
__clone:
__sys_clone:
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi
mov 20(%esp), %ebx
mov 24(%esp), %ecx
mov 28(%esp), %edx
mov 32(%esp), %esi
pushl %edi
mov 24(%esp), %ebx
mov 28(%esp), %ecx
mov 32(%esp), %edx
mov 36(%esp), %esi
mov 40(%esp), %edi
movl $__NR_clone, %eax
int $0x80
cmpl $-129, %eax
@@ -25,6 +27,7 @@ __clone:
addl $4, %esp
orl $-1, %eax
1:
popl %edi
popl %esi
popl %edx
popl %ecx