#endif
// === FLAGS ===
-#define DEBUG_TRACE_SWITCH 1
+#define DEBUG_TRACE_SWITCH 0
#define DEBUG_DISABLE_DOUBLEFAULT 1
+#define DEBUG_VERY_SLOW_SWITCH 0
// === CONSTANTS ===
#define SWITCH_MAGIC 0xFF5317C8 // FF SWITCH - There is no code in this area
// Base is 1193182
#define TIMER_BASE 1193182
-#define TIMER_DIVISOR 11932 //~100Hz
+#if DEBUG_VERY_SLOW_PERIOD
+# define TIMER_DIVISOR 1193 //~10Hz switch, with 10 quantum = 1s per thread
+#else
+# define TIMER_DIVISOR 11932 //~100Hz
+#endif
// === TYPES ===
#if USE_MP
tThread *gCurrentThread = NULL;
tThread *gpIdleThread = NULL;
#endif
-#if USE_PAE
-Uint32 *gPML4s[4] = NULL;
-#endif
tTSS *gTSSs = NULL; // Pointer to TSS array
tTSS gTSS0 = {0};
// --- Error Recovery ---
#endif
gThreadZero.CurCPU = 0;
- #if USE_PAE
- gThreadZero.MemState.PDP[0] = 0;
- gThreadZero.MemState.PDP[1] = 0;
- gThreadZero.MemState.PDP[2] = 0;
- #else
gThreadZero.MemState.CR3 = (Uint)gaInitPageDir - KERNEL_BASE;
- #endif
// Create Per-Process Data Block
if( !MM_Allocate(MM_PPD_CFG) )
{
- Panic("OOM - No space for initiali Per-Process Config");
+ Panic("OOM - No space for initial Per-Process Config");
}
// Change Stacks
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();
thread = Threads_GetNextToRun(CPU, thread);
- #if DEBUG_TRACE_SWITCH
- if(thread) {
- Log("Switching to task %i(%s), CR3 = 0x%x, EIP = %p",
- thread->TID,
- thread->ThreadName,
- thread->MemState.CR3,
- thread->SavedState.EIP
- );
- }
- #endif
-
// No avaliable tasks, just go into low power mode (idle thread)
if(thread == NULL) {
#if USE_MP
#endif
}
+ #if DEBUG_TRACE_SWITCH
+ if(thread && thread != Proc_GetCurThread() ) {
+ Log("Switching to task %i(%s), CR3 = 0x%x, EIP = %p",
+ thread->TID,
+ thread->ThreadName,
+ thread->MemState.CR3,
+ thread->SavedState.EIP
+ );
+ }
+ #endif
+
// Set current thread
#if USE_MP
gaCPUs[CPU].Current = thread;
Log("%p Scheduled", thread);
}
- #if USE_PAE
- # error "Todo: Implement PAE Address space switching"
- #else
// Set thread pointer
__asm__ __volatile__("mov %0, %%db0\n\t" : : "r"(thread) );
// Switch threads
"r"(thread->MemState.CR3),
"r"(thread->bInstrTrace&&thread->SavedState.EIP==(Uint)&GetEIP_Sched_ret?0x100:0)
);
- #endif
for(;;); // Shouldn't reach here
}