about summary refs log tree commit diff
path: root/src/thread/i386
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread/i386')
-rw-r--r--src/thread/i386/__set_thread_area.s21
-rw-r--r--src/thread/i386/clone.s73
2 files changed, 60 insertions, 34 deletions
diff --git a/src/thread/i386/__set_thread_area.s b/src/thread/i386/__set_thread_area.s
index a43525ec..cccf1cd3 100644
--- a/src/thread/i386/__set_thread_area.s
+++ b/src/thread/i386/__set_thread_area.s
@@ -2,20 +2,21 @@
 .global __set_thread_area
 .type   __set_thread_area,@function
 __set_thread_area:
-	pushl %ebx
-	movl 8(%esp),%ecx
-	movl $-1,4(%ecx)
-	movl %ecx,8(%ecx)
-	movl $0xfffff,12(%ecx)
-	movl $0x51,16(%ecx)
-	leal 4(%ecx),%ebx
-	movl $243,%eax
+	push %ebx
+	push $0x51
+	push $0xfffff
+	push 16(%esp)
+	push $-1
+	mov %esp,%ebx
+	xor %eax,%eax
+	mov $243,%al
 	int $128
-	popl %ebx
 	testl %eax,%eax
 	jnz 1f
-	movl 4(%ecx),%ecx
+	movl (%esp),%ecx
 	leal 3(,%ecx,8),%ecx
 	movw %cx,%gs
 1:
+	addl $16,%esp
+	popl %ebx
 	ret
diff --git a/src/thread/i386/clone.s b/src/thread/i386/clone.s
index 7af5f5db..bebf01a3 100644
--- a/src/thread/i386/clone.s
+++ b/src/thread/i386/clone.s
@@ -1,26 +1,51 @@
 .text
-.global __uniclone
-.type   __uniclone,@function
-__uniclone:
-	movl	4(%esp),%ecx
-	subl	$24,%ecx
-	movl	8(%esp),%eax
-	movl	%eax,16(%ecx)
-	movl	12(%esp),%eax
-	movl	%eax,24(%ecx)
-	pushl	%ebx
-	pushl	%esi
-	pushl	%edi
-	pushl   %ebp
-	movl    %eax,8(%eax)
-	leal    20(%eax),%edx
-	leal    4(%eax),%esi
-	movl	%edx,%edi
-	movl	$0x7d0f00,%ebx
-	movl	$120,%eax
-	int	$128
-	popl    %ebp
-	popl	%edi
-	popl	%esi
-	popl	%ebx
+.global __clone
+.weak clone
+.type   __clone,@function
+.type   clone,@function
+__clone:
+clone:
+	push %ebp
+	mov %esp,%ebp
+	push %ebx
+	push %esi
+	push %edi
+
+	xor %eax,%eax
+	push $0x51
+	mov %gs,%ax
+	push $0xfffff
+	shr $3,%eax
+	push 28(%ebp)
+	push %eax
+	mov $120,%al
+
+	mov 12(%ebp),%ecx
+	mov 16(%ebp),%ebx
+	and $-16,%ecx
+	sub $16,%ecx
+	mov 20(%ebp),%edi
+	mov %edi,(%ecx)
+	mov 24(%ebp),%edx
+	mov %esp,%esi
+	mov 32(%ebp),%edi
+	mov 8(%ebp),%ebp
+	int $128
+	test %eax,%eax
+	jnz 1f
+
+	mov %ebp,%eax
+	xor %ebp,%ebp
+	call *%eax
+	mov %eax,%ebx
+	xor %eax,%eax
+	inc %eax
+	int $128
+	hlt
+
+1:	add $16,%esp
+	pop %edi
+	pop %esi
+	pop %ebx
+	pop %ebp
 	ret