diff options
author | Guillaume Cottenceau <gc@mandriva.com> | 2001-05-14 14:19:32 +0000 |
---|---|---|
committer | Guillaume Cottenceau <gc@mandriva.com> | 2001-05-14 14:19:32 +0000 |
commit | 167217bec15c9c7aa70ba2a3dc9c689b3cd91872 (patch) | |
tree | 7c0c62debf8f9f145643102fb52b81afce743594 /mdk-stage1/dietlibc/i386/clone.S | |
parent | 9097327dc1c667fc51b8e05cc7c0626fac96665d (diff) | |
download | drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.gz drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.bz2 drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.xz drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.zip |
import new version of dietlibc
Diffstat (limited to 'mdk-stage1/dietlibc/i386/clone.S')
-rw-r--r-- | mdk-stage1/dietlibc/i386/clone.S | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/i386/clone.S b/mdk-stage1/dietlibc/i386/clone.S new file mode 100644 index 000000000..ac02eb468 --- /dev/null +++ b/mdk-stage1/dietlibc/i386/clone.S @@ -0,0 +1,51 @@ +#include <asm/unistd.h> + +.text +.weak clone +clone: +.global __clone +__clone: + movl 4(%esp), %ecx /* have non null thread_funcion */ + testl %ecx, %ecx + je .Lclone_error + + movl 8(%esp), %ecx /* have non null child_stack pointer */ + testl %ecx, %ecx + je .Lclone_error + + /* put the parameter on thread stack */ + subl $8, %ecx + + movl 16(%esp), %eax /* arg */ + movl %eax, 4(%ecx) + + movl 4(%esp), %eax /* thread_func */ + movl %eax, 0(%ecx) + + /* the syscall */ + pushl %ebx + movl 16(%esp), %ebx /* flags */ + movl $__NR_clone, %eax + int $0x80 + popl %ebx + + testl %eax, %eax + jl .Lclone_error + je .Lstart_thread + ret + +.Lstart_thread: + xorl %ebp,%ebp + call *%ebx + pushl %eax + call _exit + +.Lclone_error: + negl %eax + pushl %eax + call __errno_location + popl %ecx + movl %ecx, (%eax) + xorl %eax, %eax + decl %eax + ret |