[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