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;
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();
#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;
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
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
return;
}
- curBase = (Uint)&Kernel_Stack_Top;
+ curBase = (Uint)&gInitialKernelStack;
LOG("curBase = 0x%x, newBase = 0x%x", curBase, newBase);
// 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;
}
{
// 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(;;);
}