X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fproc.c;h=2f59472a1a0e3411cece31446239d21d0e3bdfd3;hb=4b80e9762374558077e28e321d75029645529a45;hp=43a88e387d0f660e94c90eb437c0ccb981041190;hpb=dea6bcf35a3f52396724d74e47f71cb3afade37c;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/proc.c b/Kernel/arch/x86/proc.c index 43a88e38..2f59472a 100644 --- a/Kernel/arch/x86/proc.c +++ b/Kernel/arch/x86/proc.c @@ -24,6 +24,7 @@ extern tGDT gGDT[]; extern tIDT gIDT[]; extern void APStartup(void); // 16-bit AP startup code extern Uint GetEIP(void); // start.asm +extern int GetCPUNum(void); // start.asm extern Uint32 gaInitPageDir[1024]; // start.asm extern void Kernel_Stack_Top; extern tSpinlock glThreadListLock; @@ -389,7 +390,8 @@ void Proc_Start(void) tThread *Proc_GetCurThread(void) { #if USE_MP - return gaCPUs[ gaAPIC_to_CPU[gpMP_LocalAPIC->ID.Val&0xFF] ].Current; + //return gaCPUs[ gaAPIC_to_CPU[gpMP_LocalAPIC->ID.Val&0xFF] ].Current; + return gaCPUs[ GetCPUNum() ].Current; #else return gCurrentThread; #endif @@ -587,7 +589,6 @@ Uint Proc_MakeUserStack(void) return base + USER_STACK_SZ; } - /** * \fn void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize) * \brief Starts a user task @@ -599,19 +600,30 @@ void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char ** Uint delta; Uint16 ss, cs; - LOG("stack = 0x%x", stack); + //Log("stack = %p", stack); // Copy Arguments - stack = (void*)( (Uint)stack - DataSize ); + stack -= DataSize/sizeof(*stack); memcpy( stack, ArgV, DataSize ); - // 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; + //Log("stack = %p", stack); + + if( DataSize ) + { + // Adjust Arguments and environment + delta = (Uint)stack - (Uint)ArgV; + ArgV = (char**)stack; + for( i = 0; ArgV[i]; i++ ) + ArgV[i] += delta; + i ++; + + // Do we care about EnvP? + if( EnvP ) { + EnvP = &ArgV[i]; + for( i = 0; EnvP[i]; i++ ) + EnvP[i] += delta; + } + } // User Mode Segments ss = 0x23; cs = 0x1B;