X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=ebb07d6a1cea4b195d019f8d44024f2eb091ca56;hb=182f31010e9cd84cc649e578a433169ee5c1cb5d;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..ebb07d6a 100644 --- a/Kernel/arch/x86_64/proc.c +++ b/Kernel/arch/x86_64/proc.c @@ -1,5 +1,5 @@ /* - * AcessOS Microkernel Version + * Acess2 x86_64 port * proc.c */ #include @@ -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); @@ -624,7 +627,7 @@ void Proc_StartProcess(Uint16 SS, Uint Stack, Uint Flags, Uint16 CS, Uint IP) */ int Proc_Demote(Uint *Err, int Dest, tRegs *Regs) { - int cpl = Regs->cs & 3; + int cpl = Regs->CS & 3; // Sanity Check if(Dest > 3 || Dest < 0) { *Err = -EINVAL; @@ -638,13 +641,8 @@ 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; + Regs->CS = (((Dest+1)<<4) | Dest) - 8; + Regs->SS = ((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(;;); }