Kernel/arm7 - NewKThread (partially) implemented
[tpg/acess2.git] / Kernel / arch / arm7 / proc.c
index 30279cc..2ab7d46 100644 (file)
@@ -12,6 +12,8 @@
 // === IMPORTS ===
 extern tThread gThreadZero;
 extern void    SwitchTask(Uint32 NewSP, Uint32 *OldSP, Uint32 NewIP, Uint32 *OldIP, Uint32 MemPtr);
+extern void    KernelThreadHeader(void);       // Actually takes args
+extern tVAddr  MM_NewKStack(int bGlobal);      // TODO: Move out into a header
 
 // === PROTOTYPES ===
 void   Proc_IdleThread(void *unused);
@@ -66,8 +68,31 @@ tTID Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr )
 
 tTID Proc_NewKThread( void (*Fnc)(void*), void *Ptr )
 {
-       // TODO: Implement
-       return -1;
+       tThread *new;
+       Uint32  sp;
+
+       new = Threads_CloneTCB(NULL, 0);
+       if(!new)        return -1;
+
+       new->KernelStack = MM_NewKStack(0);
+       if(!new) {
+               // TODO: Delete thread
+               return -1;
+       }       
+
+       sp = new->KernelStack;
+       
+       *(Uint32*)(sp -= 4) = (Uint)new;
+       *(Uint32*)(sp -= 4) = (Uint)Fnc;
+       *(Uint32*)(sp -= 4) = 1;
+       *(Uint32*)(sp -= 4) = (Uint)Ptr;
+
+       new->SavedState.SP = sp;
+       new->SavedState.IP = (Uint)KernelThreadHeader;
+
+       Threads_AddActive(new);
+
+       return new->TID;
 }
 
 void Proc_CallFaultHandler(tThread *Thread)

UCC git Repository :: git.ucc.asn.au