2010-11-07 14:42:29 +01:00
|
|
|
|
|
|
|
.global _create_thread
|
|
|
|
.global ___thread_startup
|
|
|
|
|
|
|
|
.section .text
|
|
|
|
|
2011-03-14 21:15:36 +01:00
|
|
|
.def _create_thread; .scl 2; .type 32; .endef
|
|
|
|
|
2010-11-07 14:42:29 +01:00
|
|
|
.align 4
|
|
|
|
_create_thread:
|
|
|
|
#.thr_proc equ esp+8
|
|
|
|
#.param equ esp+12
|
|
|
|
#.stack_size equ esp+16
|
|
|
|
|
|
|
|
pushl %ebx
|
|
|
|
|
|
|
|
movl $68, %eax
|
|
|
|
movl $12, %ebx
|
|
|
|
movl 16(%esp), %ecx #[.stack_size]
|
|
|
|
addl $4095, %ecx
|
|
|
|
andl $-4096, %ecx
|
|
|
|
movl %ecx, 16(%esp) #save stack size
|
|
|
|
int $0x40
|
|
|
|
testl %eax, %eax
|
|
|
|
jz 1f
|
|
|
|
|
|
|
|
leal -20(%eax,%ecx), %edx
|
|
|
|
|
|
|
|
movl 8(%esp), %ebx #[.thr_proc]
|
|
|
|
mov %ebx, 4(%edx)
|
|
|
|
|
|
|
|
movl 12(%esp), %ebx #[.param]
|
|
|
|
movl %ebx, 8(%edx)
|
|
|
|
|
|
|
|
addl %eax, %ecx
|
|
|
|
movl %eax, 12(%edx) #stack low limit
|
|
|
|
movl %ecx, 16(%edx) #stack high limit
|
|
|
|
|
|
|
|
movl $51, %eax
|
|
|
|
movl $1, %ebx
|
|
|
|
lea ___thread_startup , %ecx
|
|
|
|
int $0x40
|
|
|
|
popl %ebx
|
|
|
|
ret
|
|
|
|
1:
|
|
|
|
notl %eax
|
|
|
|
popl %ebx
|
|
|
|
ret
|