X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farm7%2Fproc.c;h=2ab7d46696654ab66489c62d633902c52d885532;hb=bcde7ddae4eb57329312e7dbe4bfd3a9a7d6832b;hp=30279cc1fb95e4ed101ec5c1d45a4e35cc233c0f;hpb=2bc4a1c1fc602a92ace9fbeea5664c6977f8ae5b;p=tpg%2Facess2.git diff --git a/Kernel/arch/arm7/proc.c b/Kernel/arch/arm7/proc.c index 30279cc1..2ab7d466 100644 --- a/Kernel/arch/arm7/proc.c +++ b/Kernel/arch/arm7/proc.c @@ -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)