X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fproc.c;h=60f015b27fe73b190947358307916e921383aa67;hb=0f48b41ce8edd3b6d549d641b35901e4b51a5132;hp=f9c5ba1fcaf4f004881c140e90bb6fc2e17050bc;hpb=243bdab4e7acc8516d9b1c138f45dc1195f97767;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/proc.c b/Kernel/arch/x86/proc.c index f9c5ba1f..60f015b2 100644 --- a/Kernel/arch/x86/proc.c +++ b/Kernel/arch/x86/proc.c @@ -337,13 +337,14 @@ int Proc_SpawnWorker() memcpy(new, &gThreadZero, sizeof(tThread)); // Set Thread ID new->TID = giNextTID++; - // Set kernel stack + // Create a new worker stack (in PID0's address space) + // The stack is relocated by this code new->KernelStack = MM_NewWorkerStack(); // Get ESP and EBP based in the new stack __asm__ __volatile__ ("mov %%esp, %0": "=r"(esp)); __asm__ __volatile__ ("mov %%ebp, %0": "=r"(ebp)); - esp = cur->KernelStack - (new->KernelStack - esp); + esp = new->KernelStack - (cur->KernelStack - esp); ebp = new->KernelStack - (cur->KernelStack - ebp); // Save core machine state @@ -357,6 +358,9 @@ int Proc_SpawnWorker() // Set EIP as parent new->SavedState.EIP = eip; + // Mark as active + new->Status = THREAD_STAT_ACTIVE; + Threads_AddActive( new ); return new->TID; } @@ -557,7 +561,8 @@ void Proc_Scheduler(int CPU) gTSSs[CPU].ESP0 = thread->KernelStack; // Set address space - __asm__ __volatile__ ("mov %0, %%cr3"::"a"(gCurrentThread->MemState.CR3)); + if( gCurrentThread->MemState.CR3 != 0 ) + __asm__ __volatile__ ("mov %0, %%cr3"::"a"(gCurrentThread->MemState.CR3)); // Switch threads __asm__ __volatile__ ( "mov %1, %%esp\n\t" // Restore ESP