X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Farmv7%2Fproc.c;h=58abce183f12aa433317270a2361b680b2cb3647;hb=85362e8a4c919b58cd261345d29f26bae4ad75e2;hp=9d5643ef1aa8032fc4fecf3761342429e85c3629;hpb=d0b4559f2936f6d9f06be0f7c3c51527a480ec0d;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/armv7/proc.c b/KernelLand/Kernel/arch/armv7/proc.c index 9d5643ef..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; @@ -136,7 +138,7 @@ tThread *Proc_SpawnWorker( void (*Fnc)(void*), void *Ptr ) Uint32 sp; new = Threads_CloneThreadZero(); - if(!new) return -1; + if(!new) return NULL; if(new->ThreadName) free(new->ThreadName); new->ThreadName = NULL; @@ -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;