[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