X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=623de556745e8779d486ae916bd686c78ff64223;hb=ebaeb7ad41f633762d26f759852498fcb7d3dfea;hp=b30eb224c6806c996f4d23534c6cefe811a438bb;hpb=e7d03978fb7c0c6ab1250e56e73afba9ffb89923;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.c b/Kernel/arch/x86_64/proc.c index b30eb224..623de556 100644 --- a/Kernel/arch/x86_64/proc.c +++ b/Kernel/arch/x86_64/proc.c @@ -36,9 +36,10 @@ extern tThread *gActiveThreads; extern tThread *gSleepingThreads; extern tThread *gDeleteThreads; extern tThread *Threads_GetNextToRun(int CPU); -extern void Threads_Dump(); +extern void Threads_Dump(void); extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags); -extern void Proc_AlterUserReturnAddr(); +extern void Proc_ReturnToUser(void); +extern void GetCPUNum(void); // === PROTOTYPES === void ArchThreads_Init(); @@ -268,6 +269,7 @@ void ArchThreads_Init() #else pos = 0; #endif + gTSSs[pos].CPUNumber = pos; gTSSs[pos].RSP0 = 0; // Set properly by scheduler gGDT[6+pos*2].BaseLow = ((Uint)(&gTSSs[pos])) & 0xFFFF; gGDT[6+pos*2].BaseMid = ((Uint)(&gTSSs[pos])) >> 16; @@ -347,7 +349,8 @@ void Proc_Start() tThread *Proc_GetCurThread() { #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 @@ -640,11 +643,6 @@ int Proc_Demote(Uint *Err, int Dest, tRegs *Regs) // Change the Segment Registers Regs->cs = (((Dest+1)<<4) | Dest) - 8; Regs->ss = ((Dest+1)<<4) | Dest; - // Check if the GP Segs are GDT, then change them - if(!(Regs->ds & 4)) Regs->ds = ((Dest+1)<<4) | Dest; - if(!(Regs->es & 4)) Regs->es = ((Dest+1)<<4) | Dest; - if(!(Regs->fs & 4)) Regs->fs = ((Dest+1)<<4) | Dest; - if(!(Regs->gs & 4)) Regs->gs = ((Dest+1)<<4) | Dest; return 0; } @@ -657,7 +655,7 @@ void Proc_CallFaultHandler(tThread *Thread) { // Rewinds the stack and calls the user function // Never returns - __asm__ __volatile__ ("mov %0, %%rbp;\n\tcall Proc_AlterUserReturnAddr" :: "r"(Thread->FaultHandler)); + __asm__ __volatile__ ("mov %0, %%rbp;\n\tcall Proc_ReturnToUser" :: "r"(Thread->FaultHandler)); for(;;); }