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

[Lost] [Patch] kernel2: Fix für mmc_current_context()



! kernel2: Der aktuelle Kontext ist nicht zwingend der Kontext der aktiven 
Threads (z.B. Thread wurde bereits im Scheduler gewechselt, cr3 wird erst 
beim Verlassen des Interrupthandlers gewechselt). Den aktuellen Kontext in 
cpu_t speichern.
Index: trunk/src/kernel2/src/init.c
===================================================================
--- trunk.orig/src/kernel2/src/init.c
+++ trunk/src/kernel2/src/init.c
@@ -135,6 +135,7 @@ void init(int multiboot_magic, struct mu
     cpu_get_current()->thread = &init_thread;
     if (bsp == TRUE) {
         *init_context = mmc_create_kernel_context();
+        mmc_activate(init_context);

         // Freigabe erteilen, damit die APs ihre Stacks mappen koennen.
         unlock(&mm_prepare_lock);
Index: trunk/src/kernel2/include/mm.h
===================================================================
--- trunk/src/kernel2/include/mm.h	(Revision 908)
+++ trunk/src/kernel2/include/mm.h	(Arbeitskopie)
@@ -95,7 +95,7 @@
 
 void mmc_activate(mmc_context_t* context);
 
-#define mmc_current_context() (cpu_get_current()->thread->process->context)
+#define mmc_current_context() (*cpu_get_current()->mm_context)
 
 #endif
 
Index: trunk/src/kernel2/include/arch/i386/cpu.h
===================================================================
--- trunk/src/kernel2/include/arch/i386/cpu.h	(Revision 908)
+++ trunk/src/kernel2/include/arch/i386/cpu.h	(Arbeitskopie)
@@ -108,6 +108,7 @@
     cpu_tss_t tss;
     pm_thread_t* thread;
     vaddr_t apic_base;
+    mmc_context_t* mm_context;
 } cpu_t;
 
 typedef interrupt_stack_frame_t machine_state_t;
Index: trunk/src/kernel2/src/arch/i386/mm/mm_context.c
===================================================================
--- trunk/src/kernel2/src/arch/i386/mm/mm_context.c     (Revision 908)
+++ trunk/src/kernel2/src/arch/i386/mm/mm_context.c     (Arbeitskopie)
@@ -135,6 +135,7 @@
 void mmc_activate(mmc_context_t* context)
 {
     mmc_sync(context);
+    cpu_get_current()->mm_context = context;
     asm("movl %0, %%cr3" : : "R" (context->page_directory));
 }