-
- #if USE_MP // MP Debug
-// Log("CPU = %i, Thread %p", CPU, thread);
- #endif
-
- // Update Kernel Stack pointer
- gTSSs[CPU].ESP0 = thread->KernelStack-4;
-
- #if 0
- if(thread->SavedState.ESP > 0xC0000000
- && thread->SavedState.ESP < thread->KernelStack-0x2000) {
- Log_Warning("Proc", "Possible bad ESP %p (PID %i)", thread->SavedState.ESP);
- }
- #endif
-
- if( thread->bInstrTrace ) {
- 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
- __asm__ __volatile__ (
- "mov %4, %%cr3\n\t" // Set address space
- "mov %1, %%esp\n\t" // Restore ESP
- "mov %2, %%ebp\n\t" // and EBP
- "or %5, 72(%%ebp)\n\t" // or trace flag to eflags (2+2+4+8+2)*4
- "jmp *%3" : : // And return to where we saved state (Proc_Clone or Proc_Scheduler)
- "a"(SWITCH_MAGIC), "b"(thread->SavedState.ESP),
- "d"(thread->SavedState.EBP), "c"(thread->SavedState.EIP),
- "r"(thread->MemState.CR3),
- "r"(thread->bInstrTrace&&thread->SavedState.EIP==(Uint)&GetEIP_Sched_ret?0x100:0)
- );
- #endif
- for(;;); // Shouldn't reach here