|
@@ -253,6 +253,8 @@ void thread_lazy_fpu(void)
|
|
|
asm volatile ("clts");
|
|
|
}
|
|
|
|
|
|
+#include <log.h>
|
|
|
+
|
|
|
void scheduler(registers_t *regs)
|
|
|
{
|
|
|
int i;
|
|
@@ -284,20 +286,22 @@ found:
|
|
|
ASSERT(next_thread != NULL);
|
|
|
list_remove(&next_thread->in_queue_list);
|
|
|
|
|
|
+ if (current_thread->tid != 0) ASSERT(current_thread->kernel_esp >= (uintptr_t)current_thread->kernel_stack);
|
|
|
+ if (next_thread->tid != 0) ASSERT(next_thread->kernel_esp >= (uintptr_t)next_thread->kernel_stack);
|
|
|
+
|
|
|
if (current_thread != next_thread)
|
|
|
{
|
|
|
memcpy(¤t_thread->state.regs, regs, sizeof(registers_t));
|
|
|
-
|
|
|
current_thread->kernel_esp = regs->esp;
|
|
|
- current_thread->state.regs.esp = ((registers_ext_t*)regs)->esp3;
|
|
|
+ if (SEGMENT_RPL(regs->cs) != 0) current_thread->state.regs.esp = ((registers_ext_t*)regs)->esp3;
|
|
|
|
|
|
set_kernel_esp(next_thread->kernel_esp);
|
|
|
|
|
|
- asm volatile ("pushl %eax\n"
|
|
|
+ /*asm volatile ("pushl %eax\n"
|
|
|
"movl %cr4, %eax\n"
|
|
|
"orb $0x08, %al\n"
|
|
|
"movl %eax, %cr4\n"
|
|
|
- "popl %eax\n");
|
|
|
+ "popl %eax\n");*/
|
|
|
|
|
|
if (SEGMENT_RPL(next_thread->state.regs.cs) != 0)
|
|
|
{
|