summaryrefslogtreecommitdiff
path: root/src/thread/i386/clone.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread/i386/clone.s')
-rw-r--r--src/thread/i386/clone.s35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/thread/i386/clone.s b/src/thread/i386/clone.s
new file mode 100644
index 00000000..4f33366c
--- /dev/null
+++ b/src/thread/i386/clone.s
@@ -0,0 +1,35 @@
+.text
+.global __clone
+.type __clone,%function
+__clone:
+ movl 8(%esp),%ecx
+ andl $0xfffffff0, %ecx
+ subl $28,%ecx
+ movl 16(%esp),%eax
+ movl %eax,12(%ecx)
+ movl 4(%esp),%eax
+ movl %eax,8(%ecx)
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl $120,%eax
+ movl 12+12(%esp),%ebx
+ movl 20+12(%esp),%edx
+ movl 24+12(%esp),%esi
+ movl 28+12(%esp),%edi
+ int $128
+ popl %edi
+ popl %esi
+ popl %ebx
+ test %eax,%eax
+ jnz 1f
+ xorl %ebp,%ebp
+ call *%ebx
+ movl %eax, %ebx
+ movl $1, %eax
+ int $128
+1:
+ movl %eax, 4(%esp)
+ ret
+
+.size __clone,.-__clone