X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Farmv7%2Fproc.c;h=58abce183f12aa433317270a2361b680b2cb3647;hb=93d0cdaafdf1edc4af1270e04bdb97159a51a30f;hp=cd998f2bea5184dae0d3627df4e749eebce3d554;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/armv7/proc.c b/KernelLand/Kernel/arch/armv7/proc.c index cd998f2b..58abce18 100644 --- a/KernelLand/Kernel/arch/armv7/proc.c +++ b/KernelLand/Kernel/arch/armv7/proc.c @@ -16,7 +16,7 @@ extern void SwitchTask(Uint32 NewSP, Uint32 *OldSP, Uint32 NewIP, Uint32 *OldIP, extern void KernelThreadHeader(void); // Actually takes args on stack extern void Proc_int_DropToUser(Uint32 IP, Uint32 SP) NORETURN __attribute__((long_call)); extern Uint32 Proc_int_SwapUserSP(Uint32 NewSP); -extern Uint32 Proc_CloneInt(Uint32 *SP, Uint32 *MemPtr); +extern Uint32 Proc_CloneInt(Uint32 *SP, Uint32 *MemPtr, bool ClearUser); extern tVAddr MM_NewKStack(int bGlobal); // TODO: Move out into a header extern tVAddr MM_NewUserStack(void); extern char kernel_table0[]; @@ -64,7 +64,6 @@ tThread *Proc_GetCurThread(void) void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, const char **ArgV, int DataSize) { - Uint32 *usr_sp; int i; const char **envp; tVAddr delta; @@ -73,7 +72,10 @@ void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, const char **ArgV, int // Entrypoint, Base, ArgC, ArgV, DataSize); // Write data to the user's stack - usr_sp = (void*)MM_NewUserStack(); + Uint32 *usr_sp = (void*)MM_NewUserStack(); + if( !usr_sp ) { + Log_KernelPanic("Proc", "Creation of user stack failed"); + } usr_sp -= (DataSize+3)/4; memcpy(usr_sp, ArgV, DataSize); free(ArgV); @@ -113,7 +115,7 @@ tTID Proc_Clone(Uint Flags) if(!new) return -1; // Actual clone magic - pc = Proc_CloneInt(&sp, &mem); + pc = Proc_CloneInt(&sp, &mem, (Flags & CLONE_NOUSER ? 1 : 0)); if(pc == 0) { Log("Proc_Clone: In child"); return 0; @@ -130,13 +132,13 @@ tTID Proc_Clone(Uint Flags) return new->TID; } -int Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr ) +tThread *Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr ) { tThread *new; Uint32 sp; new = Threads_CloneThreadZero(); - if(!new) return -1; + if(!new) return NULL; if(new->ThreadName) free(new->ThreadName); new->ThreadName = NULL; @@ -144,7 +146,7 @@ int Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr ) if(!new->KernelStack) { // TODO: Delete thread Log_Error("Proc", "Unable to allocate kernel stack"); - return -1; + return NULL; } sp = new->KernelStack; @@ -158,7 +160,7 @@ int Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr ) Threads_AddActive(new); - return new->TID; + return new; } tTID Proc_NewKThread( void (*Fnc)(void*), void *Ptr ) @@ -208,13 +210,12 @@ void Proc_Reschedule(void) if(!next) next = gpIdleThread; if(!next || next == cur) return; - Log("Switching to %p (%i %s) IP=%p SP=%p TTBR0=%p UsrSP=%p", - next, next->TID, next->ThreadName, - next->SavedState.IP, next->SavedState.SP, next->Process->MemState.Base, - next->SavedState.UserSP - ); - - Log("Requested by %p", __builtin_return_address(0)); +// Log("Switching to %p (%i %s) IP=%p SP=%p TTBR0=%p UsrSP=%p", +// next, next->TID, next->ThreadName, +// next->SavedState.IP, next->SavedState.SP, next->Process->MemState.Base, +// next->SavedState.UserSP +// ); +// Log("Requested by %p", __builtin_return_address(0)); gpCurrentThread = next;