X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=e3d7e90b651f9272e27890e3eab53abc27f99428;hb=d01b7e1a4924a41a5219eedfd2f6d32b310368cd;hp=ce6ebbdec394302f3bf564104f48c37cb73097cc;hpb=dc42c3998b01e66a609fed5d503a81a972e636d6;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.c b/Kernel/arch/x86_64/proc.c index ce6ebbde..e3d7e90b 100644 --- a/Kernel/arch/x86_64/proc.c +++ b/Kernel/arch/x86_64/proc.c @@ -592,41 +592,43 @@ Uint Proc_MakeUserStack(void) } -/** - * \fn void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize) - * \brief Starts a user task - */ -void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize) +void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, char **ArgV, int DataSize) { - Uint *stack = (void*)Proc_MakeUserStack(); + Uint *stack; + char **envp; int i; Uint delta; Uint16 ss, cs; - LOG("stack = 0x%x", stack); // Copy Arguments - stack = (void*)( (Uint)stack - DataSize ); + stack = (void*)Proc_MakeUserStack(); + if(!stack) { + Log_Error("Proc", "Unable to create user stack!"); + Threads_Exit(0, -1); + } + stack -= (DataSize+7)/8; + LOG("stack = 0x%x", stack); + Log("stack = %p, DataSize = %i", stack, DataSize); memcpy( stack, ArgV, DataSize ); + free(ArgV); // Adjust Arguments and environment delta = (Uint)stack - (Uint)ArgV; ArgV = (char**)stack; for( i = 0; ArgV[i]; i++ ) ArgV[i] += delta; - i ++; - EnvP = &ArgV[i]; - for( i = 0; EnvP[i]; i++ ) EnvP[i] += delta; + envp = &ArgV[i+1]; + for( i = 0; envp[i]; i++ ) envp[i] += delta; // User Mode Segments // 0x2B = 64-bit ss = 0x23; cs = 0x2B; // Arguments - *--stack = (Uint)EnvP; + *--stack = (Uint)envp; *--stack = (Uint)ArgV; *--stack = (Uint)ArgC; - while(*Bases) - *--stack = *Bases++; + *--stack = Base; Proc_StartProcess(ss, (Uint)stack, 0x202, cs, Entrypoint); }