X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fproc.c;h=f7bda0fca98725835316947867fe951e8937c1a9;hb=9d3800f60f2212432e550a4e003ae65b498a4d36;hp=5cfc7a2ea492809e7d02f3f17510caa5af2de44a;hpb=51adc08a1e11fe9e5389e6e7c3e3a4ea4973917b;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/proc.c b/Kernel/arch/x86/proc.c index 5cfc7a2e..f7bda0fc 100644 --- a/Kernel/arch/x86/proc.c +++ b/Kernel/arch/x86/proc.c @@ -33,6 +33,7 @@ extern tThread *gSleepingThreads; extern tThread *gDeleteThreads; extern tThread *Threads_GetNextToRun(int CPU); extern void Threads_Dump(); +extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags); // === PROTOTYPES === void ArchThreads_Init(); @@ -242,24 +243,19 @@ int Proc_Clone(Uint *Err, Uint Flags) __asm__ __volatile__ ("mov %%esp, %0": "=r"(esp)); __asm__ __volatile__ ("mov %%ebp, %0": "=r"(ebp)); - // Create new thread structure - newThread = malloc( sizeof(tThread) ); - if(!newThread) { - Warning("Proc_Clone - Out of memory when creating thread\n"); - *Err = -ENOMEM; - return -1; - } - - // Base new thread on current - memcpy(newThread, cur, sizeof(tThread)); + newThread = Threads_CloneTCB(Err, Flags); + if(!newThread) return -1; // Initialise Memory Space (New Addr space or kernel stack) if(Flags & CLONE_VM) { - newThread->TGID = newThread->TID; newThread->MemState.CR3 = MM_Clone(); + newThread->KernelStack = cur->KernelStack; } else { Uint tmpEbp, oldEsp = esp; + // Set CR3 + newThread->MemState.CR3 = cur->MemState.CR3; + // Create new KStack newThread->KernelStack = MM_NewKStack(); // Check for errors @@ -285,23 +281,6 @@ int Proc_Clone(Uint *Err, Uint Flags) *(Uint*)tmpEbp += newThread->KernelStack - cur->KernelStack; } } - - // Set Pointer, Spinlock and TID - newThread->Next = NULL; - newThread->IsLocked = 0; - newThread->TID = giNextTID++; - newThread->PTID = cur->TID; - - // Create copy of name - newThread->ThreadName = malloc(strlen(cur->ThreadName)+1); - strcpy(newThread->ThreadName, cur->ThreadName); - - // Clear message list (messages are not inherited) - newThread->Messages = NULL; - newThread->LastMessage = NULL; - - // Set remaining (sheduler expects remaining to be correct) - newThread->Remaining = newThread->Quantum; // Save core machine state newThread->SavedState.ESP = esp; @@ -318,8 +297,6 @@ int Proc_Clone(Uint *Err, Uint Flags) // Lock list and add to active Threads_AddActive(newThread); - //Threads_Dump(); - return newThread->TID; }