// === FLAGS ===
#define DEBUG_TRACE_SWITCH 0
+#define DEBUG_DISABLE_DOUBLEFAULT 1
// === CONSTANTS ===
#define SWITCH_MAGIC 0xFF5317C8 // FF SWITCH - There is no code in this area
extern tThread gThreadZero;
extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags);
extern void Isr8(void); // Double Fault
-extern void Proc_ReturnToUser(void);
+extern void Proc_ReturnToUser(tVAddr Handler, Uint Argument);
// === PROTOTYPES ===
void ArchThreads_Init(void);
MM_FinishVirtualInit();
#endif
- #if 0
+ #if !DEBUG_DISABLE_DOUBLEFAULT
// Initialise Double Fault TSS
gGDT[5].BaseLow = (Uint)&gDoubleFault_TSS & 0xFFFF;
gGDT[5].BaseMid = (Uint)&gDoubleFault_TSS >> 16;
}
gaCPUs[i].IdleThread = Threads_GetThread(tid);
gaCPUs[i].IdleThread->ThreadName = "Idle Thread";
- Threads_SetTickets( gaCPUs[i].IdleThread, 0 ); // Never called randomly
+ Threads_SetPriority( gaCPUs[i].IdleThread, -1 ); // Never called randomly
gaCPUs[i].IdleThread->Quantum = 1; // 1 slice quantum
{
gpIdleThread = Proc_GetCurThread();
gpIdleThread->ThreadName = "Idle Thread";
- gpIdleThread->NumTickets = 0; // Never called randomly
+ Threads_SetPriority( gpIdleThread, -1 ); // Never called randomly
gpIdleThread->Quantum = 1; // 1 slice quantum
for(;;) HALT(); // Just yeilds
}
Uint tmpEbp, oldEsp = esp;
// Set CR3
+ #if USE_PAE
+ # warning "PAE Unimplemented"
+ #else
newThread->MemState.CR3 = cur->MemState.CR3;
+ #endif
// Create new KStack
newThread->KernelStack = MM_NewKStack();
__asm__ __volatile__ ("mov %0, %%db0" : : "r" (newThread) );
#if USE_MP
// ACK the interrupt
- if(GetCPUNum())
+ if( GetCPUNum() )
gpMP_LocalAPIC->EOI.Val = 0;
else
#endif
// Set EIP as parent
new->SavedState.EIP = eip;
// Mark as active
- new->Status = THREAD_STAT_ACTIVE;
Threads_AddActive( new );
return new->TID;
{
// Rewinds the stack and calls the user function
// Never returns
- __asm__ __volatile__ ("mov %0, %%ebp;\n\tcall Proc_ReturnToUser" :: "r"(Thread->FaultHandler));
+ Proc_ReturnToUser( Thread->FaultHandler, Thread->CurFaultNum );
for(;;);
}