[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Lost] [Patch] kernel2: im_handle erlaubt Taskwechsel
! kernel2: im_handle geht fest davon aus, dass Syscalls den aktuellen Task
nicht aendern koennen. Leider liegt es damit bei PM_SLEEP falsch und
aktiviert dann unter anderem das falsche Page Directory...
! kernel2: cr3 nur neu laden, wenn auch wirklich ein anderer Prozess dran ist
Index: interrupts/im.c
===================================================================
--- interrupts/im.c (Revision 896)
+++ interrupts/im.c (Arbeitskopie)
@@ -55,6 +55,7 @@
{
// Pointer auf den aktuellen Thread holen
pm_thread_t* thread = cpu_get_current()->thread;
+ pm_thread_t* old_thread = thread;
thread->kernel_stack = (vaddr_t) isf;
byte int_num = isf->interrupt_number;
@@ -97,16 +98,13 @@
if (int_num == 0x20) {
// Den aktuellen Thread an den Scheduler zurueckgeben
pm_scheduler_push(thread);
-
+
// Einen neuen Thread holen.
- thread = pm_scheduler_pop();
-
- cpu_get_current()->tss.esp0 = (uintptr_t) thread->kernel_stack + sizeof(interrupt_stack_frame_t);
-
+ cpu_get_current()->thread = pm_scheduler_pop();
cpu_get_current()->tss.ss0 = 2 << 3;
-
-
- cpu_get_current()->thread = thread;
+ cpu_get_current()->tss.esp0 =
+ (uintptr_t) thread->kernel_stack
+ + sizeof(interrupt_stack_frame_t);
}
} else if (int_num == 0x30) {
// Syscall
@@ -122,9 +120,12 @@
asm("cli; hlt");
}
}
-
- mmc_activate(&thread->process->context);
+ thread = cpu_get_current()->thread;
+ if (thread != old_thread) {
+ mmc_activate(&thread->process->context);
+ }
+
im_end_of_interrupt(int_num);
return (interrupt_stack_frame_t*) thread->kernel_stack;
}