summaryrefslogtreecommitdiff
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