X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=623de556745e8779d486ae916bd686c78ff64223;hb=1810e1d377b996679ae090bfe57d1b5321ce190f;hp=5bb66af9ad2a9655ef7cb29a1f3fa2d2a80817cc;hpb=43f12a083f112a410859597c5f45e78b1de2e7c8;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.c b/Kernel/arch/x86_64/proc.c index 5bb66af9..623de556 100644 --- a/Kernel/arch/x86_64/proc.c +++ b/Kernel/arch/x86_64/proc.c @@ -24,8 +24,8 @@ extern tGDT gGDT[]; extern void APStartup(); // 16-bit AP startup code extern Uint GetRIP(); // start.asm -extern Uint64 gaInitPML4[512]; // start.asm -extern void Kernel_Stack_Top; +extern Uint64 gInitialPML4[512]; // start.asm +extern void gInitialKernelStack; extern tSpinlock glThreadListLock; extern int giNumCPUs; extern int giNextTID; @@ -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; @@ -288,7 +290,7 @@ void ArchThreads_Init() gCurrentThread = &gThreadZero; #endif - gThreadZero.MemState.CR3 = (Uint)gaInitPML4 - KERNEL_BASE; + gThreadZero.MemState.CR3 = (Uint)gInitialPML4 - KERNEL_BASE; // Set timer frequency outb(0x43, 0x34); // Set Channel 0, Low/High, Rate Generator @@ -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 @@ -376,7 +379,7 @@ void Proc_ChangeStack() return; } - curBase = (Uint)&Kernel_Stack_Top; + curBase = (Uint)&gInitialKernelStack; LOG("curBase = 0x%x, newBase = 0x%x", curBase, newBase); @@ -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(;;); }