* Acess2
* - By John Hodge (thePowersGang)
*
- * arch/arm7/proc.
+ * arch/arm7/proc.c
* - ARM7 Process Switching
*/
#include <acess.h>
// === 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 void KernelThreadHeader(void); // Actually takes args on stack
extern tVAddr MM_NewKStack(int bGlobal); // TODO: Move out into a header
// === PROTOTYPES ===
void Proc_IdleThread(void *unused);
-tTID Proc_NewKThread( void (*Fnc)(void*), void *Ptr );
+tTID Proc_NewKThread(void (*Fnc)(void*), void *Ptr);
// === GLOBALS ===
tThread *gpCurrentThread = &gThreadZero;
void Proc_IdleThread(void *unused)
{
- for(;;)
+ Threads_SetPriority(gpIdleThread, -1);
+ Threads_SetName("Idle Thread");
+ for(;;) {
+ __asm__ __volatile__ ("wfi");
Proc_Reschedule();
+ }
}
void Proc_Start(void)
tTID Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr )
{
- return -1;
+ tThread *new;
+ Uint32 sp;
+
+ new = Threads_CloneTCB(NULL, 0);
+ if(!new) return -1;
+
+ new->KernelStack = MM_NewKStack(1);
+ if(!new->KernelStack) {
+ // TODO: Delete thread
+ Log_Error("Proc", "Unable to allocate kernel stack");
+ return -1;
+ }
+
+ sp = new->KernelStack;
+
+ *(Uint32*)(sp -= 4) = (Uint)Ptr;
+ *(Uint32*)(sp -= 4) = 1;
+ *(Uint32*)(sp -= 4) = (Uint)Fnc;
+ *(Uint32*)(sp -= 4) = (Uint)new;
+
+ new->SavedState.SP = sp;
+ new->SavedState.IP = (Uint)KernelThreadHeader;
+
+ Threads_AddActive(new);
+
+ return new->TID;
}
tTID Proc_NewKThread( void (*Fnc)(void*), void *Ptr )
new = Threads_CloneTCB(NULL, 0);
if(!new) return -1;
- new->KernelStack = MM_NewKStack(0);
+ // TODO: Non-shared stack
+ new->KernelStack = MM_NewKStack(1);
if(!new->KernelStack) {
// TODO: Delete thread
+ Log_Error("Proc", "Unable to allocate kernel stack");
return -1;
}
sp = new->KernelStack;
- *(Uint32*)(sp -= 4) = (Uint)new;
- *(Uint32*)(sp -= 4) = (Uint)Fnc;
- *(Uint32*)(sp -= 4) = 1;
*(Uint32*)(sp -= 4) = (Uint)Ptr;
+ *(Uint32*)(sp -= 4) = 1;
+ *(Uint32*)(sp -= 4) = (Uint)Fnc;
+ *(Uint32*)(sp -= 4) = (Uint)new;
new->SavedState.SP = sp;
new->SavedState.IP = (Uint)KernelThreadHeader;
next = Threads_GetNextToRun(0, cur);
if(!next) next = gpIdleThread;
if(!next || next == cur) return;
+
+ Log("Switching to %p (%i %s) IP=%p SP=%p", next, next->TID, next->ThreadName, next->SavedState.IP, next->SavedState.SP);
+ Log("Requested by %p", __builtin_return_address(0));
+ gpCurrentThread = next;
+ // TODO: Change kernel stack?
+
SwitchTask(
next->SavedState.SP, &cur->SavedState.SP,
next->SavedState.IP, &cur->SavedState.IP,