summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/i386/clone.S
diff options
context:
space:
mode:
authorGuillaume Cottenceau <gc@mandriva.com>2001-05-14 14:19:32 +0000
committerGuillaume Cottenceau <gc@mandriva.com>2001-05-14 14:19:32 +0000
commit167217bec15c9c7aa70ba2a3dc9c689b3cd91872 (patch)
tree7c0c62debf8f9f145643102fb52b81afce743594 /mdk-stage1/dietlibc/i386/clone.S
parent9097327dc1c667fc51b8e05cc7c0626fac96665d (diff)
downloaddrakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.gz
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.bz2
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.xz
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.zip
import new version of dietlibc
Diffstat (limited to 'mdk-stage1/dietlibc/i386/clone.S')
-rw-r--r--mdk-stage1/dietlibc/i386/clone.S51
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