X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=a1d5c86ade3314d0a42331c02df3040922a07a14;hb=7d7952eb5cab57587c50a9c0d8c1bc45c55c0f2c;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..a1d5c86a 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 @@ -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(); @@ -269,15 +270,16 @@ void ArchThreads_Init() pos = 0; #endif 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; - gGDT[6+pos*2].BaseHi = ((Uint)(&gTSSs[pos])) >> 24; - gGDT[6+pos*2+1].DWord[0] = ((Uint)(&gTSSs[pos])) >> 32; + gGDT[7+pos*2].LimitLow = sizeof(tTSS) & 0xFFFF; + gGDT[7+pos*2].BaseLow = ((Uint)(&gTSSs[pos])) & 0xFFFF; + gGDT[7+pos*2].BaseMid = ((Uint)(&gTSSs[pos])) >> 16; + gGDT[7+pos*2].BaseHi = ((Uint)(&gTSSs[pos])) >> 24; + gGDT[7+pos*2+1].DWord[0] = ((Uint)(&gTSSs[pos])) >> 32; #if USE_MP } for(pos=0;posID.Val&0xFF] ].Current; + //return gaCPUs[ gaAPIC_to_CPU[gpMP_LocalAPIC->ID.Val&0xFF] ].Current; + return gaCPUs[ GetCPUNum() ].Current; #else return gCurrentThread; #endif @@ -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(;;); }