[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kernel2: Manuell in ersten Thread springen



! kernel2: Wenn wir um Multitasking zu aktivieren nur auf den ersten
           Timer-Interrupt warten, wird dabei der aktuelle Kernel-Stack
           uebernommen. Springen wir stattdessen manuell mit einem iret
           rein, klappt alles problemlos.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/kernel2/src/arch/i386/interrupts/int_stubs.S |    5 +++++
 src/kernel2/src/init.c                           |   12 ++++++------
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/kernel2/src/arch/i386/interrupts/int_stubs.S b/src/kernel2/src/arch/i386/interrupts/int_stubs.S
index d34e3b4..7243562 100644
--- a/src/kernel2/src/arch/i386/interrupts/int_stubs.S
+++ b/src/kernel2/src/arch/i386/interrupts/int_stubs.S
@@ -378,6 +378,11 @@ im_int_stub_all:
     .extern im_handler
     call im_handler
 
+    // Diese Sprungmarke wird beim Initialisieren des Kernels zum Starten der
+    // ersten Threads benoetigt
+.globl im_run_thread
+im_run_thread:
+
     // Der C-Handler gibt einen neuen Stackpointer fuer den Kernelstack des
     // aktuellen Tasks zurueck (der aktuelle Task kann sich geaendert haben,
     // wenn wir gerade einen Timer-Interrupt oder einen Syscall verarbeiten).
diff --git a/src/kernel2/src/init.c b/src/kernel2/src/init.c
index 82cfc94..a4d16d5 100644
--- a/src/kernel2/src/init.c
+++ b/src/kernel2/src/init.c
@@ -227,13 +227,13 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
         lock_wait(&final_lock);
     }
     
-    // Interrupts aktivieren.
-    im_enable();
 
-    // Hier warten die Prozessoren auf Interrupts
-    while (true) {
-        asm volatile("nop");
-    }
+    // Ersten Thread auf dieser CPU starten
+    current_thread = pm_scheduler_pop();
+    interrupt_stack_frame_t* isf = im_prepare_current_thread();
+    asm volatile("jmp im_run_thread" :: "a" (isf));
+
+    // Hier kommen wir nie hin
 }
 
 __attribute__((noreturn)) void panic(char * message, ...)
-- 
1.6.4.4