Updates to CPU Determining and initialising fractal mappings
[tpg/acess2.git] / Kernel / arch / x86_64 / proc.c
index 5bb66af..623de55 100644 (file)
@@ -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(;;);
 }
 

UCC git Repository :: git.ucc.asn.au