Kernel/arm7 - NewKThread (partially) implemented
authorJohn Hodge <[email protected]>
Mon, 26 Sep 2011 14:30:43 +0000 (22:30 +0800)
committerJohn Hodge <[email protected]>
Mon, 26 Sep 2011 14:30:43 +0000 (22:30 +0800)
Kernel/arch/arm7/include/proc.h
Kernel/arch/arm7/mm_virt.c
Kernel/arch/arm7/proc.c

index e206359..1dd9b0f 100644 (file)
@@ -11,7 +11,7 @@
 
 // === STRUCTURES ===
 typedef struct {
 
 // === STRUCTURES ===
 typedef struct {
-       Uint32  IP, LR, SP;
+       Uint32  IP, SP;
        Uint32  UserIP, UserSP;
 } tTaskState;
 
        Uint32  UserIP, UserSP;
 } tTaskState;
 
index 7abf4e7..c191c68 100644 (file)
@@ -38,6 +38,7 @@ void  MM_int_GetTables(tVAddr VAddr, Uint32 **Table0, Uint32 **Table1);
  int   MM_int_AllocateCoarse(tVAddr VAddr, int Domain);
  int   MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi);
  int   MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi);
  int   MM_int_AllocateCoarse(tVAddr VAddr, int Domain);
  int   MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi);
  int   MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi);
+tVAddr MM_NewKStack(int bGlobal);
 
 // === GLOBALS ===
 
 
 // === GLOBALS ===
 
@@ -394,6 +395,13 @@ void MM_FreeTemp(tVAddr VAddr)
        // TODO: Implement FreeTemp
 }
 
        // TODO: Implement FreeTemp
 }
 
+tVAddr MM_NewKStack(int bGlobal)
+{
+       // TODO: Implement NewKStack
+       // TODO: Should I support global stacks? if only for the idle thread
+       return 0;
+}
+
 void MM_DumpTables(tVAddr Start, tVAddr End)
 {
        
 void MM_DumpTables(tVAddr Start, tVAddr End)
 {
        
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);
 // === 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);
 
 // === 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 )
 {
 
 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)
 }
 
 void Proc_CallFaultHandler(tThread *Thread)

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