KSTACK_USERSTATE_SIZE equ (4+8+1+5)*4 ; SRegs, GPRegs, CPU, IRET
[section .text]
+
+[global NewTaskHeader]
+NewTaskHeader:
+ mov eax, [esp]
+ mov dr0, eax
+ xchg bx, bx
+
+ sti
+ ; TODO: SMP
+ mov al, 0x20
+ out 0x20, al
+
+ mov eax, [esp+4]
+ add esp, 12 ; Thread, Function, Args
+ call eax
+
+ push eax ; Ret val
+ push 0 ; 0 = This Thread
+ call Threads_Exit
+
%if USE_MP
[extern giMP_TimerCount]
[extern gpMP_LocalAPIC]
SpawnTask:
; Call Proc_Clone with Flags=0
xor eax, eax
- push eax
+; push eax
push eax
call Proc_Clone
add esp, 8 ; Remove arguments from stack
; Validate user ESP
; - Page Table
mov edx, [eax+KSTACK_USERSTATE_SIZE-12] ; User ESP is at top of kstack - 3*4
- %if USE_PAE
- %error PAE Support
- %else
mov ecx, edx
shr ecx, 22
test BYTE [0xFC3F0000+ecx*4], 1
jnz .justKillIt
- %endif
; - Page
mov ecx, edx
shr ecx, 12
; Adjust
sub edx, 8
; - Page Table
- %if USE_PAE
- %else
mov ecx, edx
shr ecx, 22
test BYTE [0xFC3F0000+ecx*4], 1
jnz .justKillIt
- %endif
; - Page
mov ecx, edx
shr ecx, 12