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

[tyndur-devel] [PATCH] kernel2: Code zum vorbereiten eines Threads in Funkiton auslagern



* kernel2: Wenn wir den Code, der die Ausfuehrung eines Threads
           vorbereitet aus dem Interrupt-Handler in eine eigene Funktion
           auslagern, koennen wir die spaeter auch zum Initialisieren
           des Multitaskings benutzen.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/kernel2/include/im.h        |    1 +
 src/kernel2/src/interrupts/im.c |   38 +++++++++++++++++++++++++-------------
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/kernel2/include/im.h b/src/kernel2/include/im.h
index abe6ffb..05f7200 100644
--- a/src/kernel2/include/im.h
+++ b/src/kernel2/include/im.h
@@ -56,6 +56,7 @@ void im_disable_irq(uint8_t irq);
 
 void im_end_of_interrupt(uint8_t interrupt);
 interrupt_stack_frame_t* im_handler(interrupt_stack_frame_t* isf);
+interrupt_stack_frame_t* im_prepare_current_thread(void);
 
 bool im_add_handler(uint32_t intr, pm_process_t* handler);
 
diff --git a/src/kernel2/src/interrupts/im.c b/src/kernel2/src/interrupts/im.c
index 0379d30..57e260f 100644
--- a/src/kernel2/src/interrupts/im.c
+++ b/src/kernel2/src/interrupts/im.c
@@ -184,20 +184,8 @@ interrupt_stack_frame_t* im_handler(interrupt_stack_frame_t* isf)
 
     thread = current_thread;
     if (thread != old_thread) {
-        interrupt_stack_frame_t* user_isf = thread->user_isf;
         old_thread->kernel_stack = isf;
-        new_isf = thread->kernel_stack;
-
-        cpu_get_current()->tss.ss0 = 2 << 3;
-        if (user_isf->eflags & 0x20000) {
-            cpu_get_current()->tss.esp0 =
-                (uintptr_t) user_isf + sizeof(struct vm86_isf);
-        } else {
-            cpu_get_current()->tss.esp0 =
-                (uintptr_t) user_isf + sizeof(interrupt_stack_frame_t);
-        }
-
-        mmc_activate(&thread->process->context);
+        new_isf = im_prepare_current_thread();
     }
 
     im_end_of_interrupt(int_num);
@@ -205,6 +193,30 @@ interrupt_stack_frame_t* im_handler(interrupt_stack_frame_t* isf)
 }
 
 /**
+ * Aktuellen Thread zum laufen vorbereiten nach einem Thread-Wechsel. Konkret
+ * TSS befuellen, in den richtigen Speicherkontext wechseln, und den Interrupt-
+ * Stack-Frame raussuchen.
+ */
+interrupt_stack_frame_t* im_prepare_current_thread(void)
+{
+    pm_thread_t* thread = current_thread;
+    interrupt_stack_frame_t* user_isf = thread->user_isf;
+
+    cpu_get_current()->tss.ss0 = 2 << 3;
+    if (user_isf->eflags & 0x20000) {
+        cpu_get_current()->tss.esp0 =
+            (uintptr_t) user_isf + sizeof(struct vm86_isf);
+    } else {
+        cpu_get_current()->tss.esp0 =
+            (uintptr_t) user_isf + sizeof(interrupt_stack_frame_t);
+    }
+
+    mmc_activate(&thread->process->context);
+
+    return thread->kernel_stack;
+}
+
+/**
  * Wird beim Loeschen eines Prozesses aufgerufen. Entfernt den Prozess aus der
  * Interrupthandlertabelle.
  */
-- 
1.6.4.4