X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Farmv7%2Fproc.c;h=58abce183f12aa433317270a2361b680b2cb3647;hb=93d0cdaafdf1edc4af1270e04bdb97159a51a30f;hp=fa1e02ceb8a832c824ba919aaec13d9fec5093e7;hpb=04a050f42807686dc119838c82372409246d55bb;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/armv7/proc.c b/KernelLand/Kernel/arch/armv7/proc.c index fa1e02ce..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; @@ -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;