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

[tyndur-devel] [PATCH] kernel2: Fix fuer Unmapping beim RPC



! kernel2: Der aktuelle Speicherkontext muss auch beim Unmappen immer
  noch nicht zwingend der Kontext des aktuellen Prozesses sein
+ kernel2: Panic wenn versucht wird, das Mapping einer Kernelpage in
  einem inaktiven Kontext zu aendern

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/arch/i386/mm/mm_context.c |   12 +++++++++++-
 src/kernel2/src/syscalls/rpc.c            |    2 +-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/kernel2/src/arch/i386/mm/mm_context.c b/src/kernel2/src/arch/i386/mm/mm_context.c
index 20edcfa..07a5be8 100644
--- a/src/kernel2/src/arch/i386/mm/mm_context.c
+++ b/src/kernel2/src/arch/i386/mm/mm_context.c
@@ -271,7 +271,17 @@ static bool map_page
         panic("Adressen sind nicht 4K-aligned (virt = %x, phys = %x)", 
             vaddr, paddr);
     }
-    
+
+    // Kernelpages duerfen immer nur im gerade aktiven Kontext gemappt werden.
+    // Ales andere ergibt keinen Sinn, weil diese Bereiche ohnehin zwischen
+    // allen Kontexten synchron gehalten werden muessen.
+    if ((context != &mmc_current_context()) &&
+        ((uintptr_t) vaddr >= KERNEL_MEM_START) &&
+        ((uintptr_t) vaddr <  KERNEL_MEM_END))
+    {
+        panic("Versuch, Kernelpages in inaktivem Kontext zu mappen");
+    }
+
     // Falls es sich im den aktuellen Kontext handelt, muss das Page directory
     // nicht gemappt werden, sonst schon.
 
diff --git a/src/kernel2/src/syscalls/rpc.c b/src/kernel2/src/syscalls/rpc.c
index 53f5396..70e0920 100644
--- a/src/kernel2/src/syscalls/rpc.c
+++ b/src/kernel2/src/syscalls/rpc.c
@@ -282,7 +282,7 @@ static int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
     callee_isf->eip = (uintptr_t) callee->process->rpc_handler;
 
     // Temporaere Mappings wieder aufheben
-    mmc_unmap(&current_process->context, first_stack_page,
+    mmc_unmap(&mmc_current_context(), first_stack_page,
         NUM_PAGES(rounded_data_size));
 
     vmm_kernel_unmap(callee_isf, sizeof(*callee_isf));
-- 
1.6.0.2