diff options
author | David 'Digit' Turner <digit@google.com> | 2010-01-22 18:59:05 -0800 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2010-01-25 11:18:30 -0800 |
commit | 97cf7f3394780d524038fc083e2c134031b54728 (patch) | |
tree | 40b61956bbe4d28babe839c3be40e9f114810e5f /libc/arch-x86/syscalls | |
parent | 1a2917ca954f575cc9698c99e54bd93087793c8f (diff) | |
download | bionic-97cf7f3394780d524038fc083e2c134031b54728.zip bionic-97cf7f3394780d524038fc083e2c134031b54728.tar.gz bionic-97cf7f3394780d524038fc083e2c134031b54728.tar.bz2 |
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).
Diffstat (limited to 'libc/arch-x86/syscalls')
-rw-r--r-- | libc/arch-x86/syscalls/__sys_clone.S (renamed from libc/arch-x86/syscalls/__clone.S) | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libc/arch-x86/syscalls/__clone.S b/libc/arch-x86/syscalls/__sys_clone.S index 5862129..172d6af 100644 --- a/libc/arch-x86/syscalls/__clone.S +++ b/libc/arch-x86/syscalls/__sys_clone.S @@ -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 |