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

[tyndur-devel] [PATCH 2/2] kernel2: mmc_map_user



+ kernel2: Neue Funktion, um virtuell zusammenhängenden Speicher
  zusätzlich woanders hinzumappen (mit vorgegebener Adresse statt
  irgendwohin wie bei mmc_automap_user)

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

diff --git a/src/kernel2/include/mm.h b/src/kernel2/include/mm.h
index 9330863..559733c 100644
--- a/src/kernel2/include/mm.h
+++ b/src/kernel2/include/mm.h
@@ -101,6 +101,22 @@ paddr_t mmc_resolve(mmc_context_t* context, vaddr_t vaddr);
 vaddr_t mmc_find_free_pages(mmc_context_t* context, size_t num,
     uintptr_t lower_limit, uintptr_t upper_limit);
 
+/**
+ * Mappt einen Speicherbereich eines anderen Tasks in einen MM-Kontext an eine
+ * gegebene virtuelle Adresse im Zielkontext
+ *
+ * @param target_ctx Kontext, in den gemappt werden soll
+ * @param source_ctx Kontext, aus dem Speicher gemappt werden soll
+ * @param start Virtuelle Startadresse des zu mappenden Speicherbereichs
+ *      bezueglich source_ctx
+ * @param count Anzahl der zu mappenden Seiten
+ * @param target_vaddr Virtuelle Startadresse im Zielkontext
+ * @param flags Flags fuer die Pagetable
+ */
+bool mmc_map_user(mmc_context_t* target_ctx, mmc_context_t* source_ctx,
+    vaddr_t source_vaddr, size_t count, vaddr_t target_vaddr,
+    int flags);
+
 vaddr_t mmc_automap(mmc_context_t* context, paddr_t start, size_t count,
     uintptr_t lower_limit, uintptr_t upper_limit, int flags);
 vaddr_t mmc_automap_user(mmc_context_t* target_ctx, mmc_context_t* source_ctx,
diff --git a/src/kernel2/src/arch/i386/mm/mm_context.c b/src/kernel2/src/arch/i386/mm/mm_context.c
index 55ab12b..22a58e5 100644
--- a/src/kernel2/src/arch/i386/mm/mm_context.c
+++ b/src/kernel2/src/arch/i386/mm/mm_context.c
@@ -597,6 +597,40 @@ vaddr_t mmc_automap(mmc_context_t* context, paddr_t start, size_t count,
 
 /**
  * Mappt einen Speicherbereich eines anderen Tasks in einen MM-Kontext an eine
+ * gegebene virtuelle Adresse im Zielkontext
+ *
+ * @param target_ctx Kontext, in den gemappt werden soll
+ * @param source_ctx Kontext, aus dem Speicher gemappt werden soll
+ * @param start Virtuelle Startadresse des zu mappenden Speicherbereichs
+ *      bezueglich source_ctx
+ * @param count Anzahl der zu mappenden Seiten
+ * @param target_vaddr Virtuelle Startadresse im Zielkontext
+ * @param flags Flags fuer die Pagetable
+ */
+bool mmc_map_user(mmc_context_t* target_ctx, mmc_context_t* source_ctx,
+    vaddr_t source_vaddr, size_t count, vaddr_t target_vaddr,
+    int flags)
+{
+    size_t i;
+    paddr_t paddr;
+    vaddr_t vaddr;
+
+    // FIXME Hier wird unter Umstaenden ziemlich oft dieselbe Pagetable gemappt
+    // und wieder ungemappt (in mmc_resolve)
+    for (i = 0; i < count; i++) {
+        paddr = mmc_resolve(source_ctx, source_vaddr + (i * PAGE_SIZE));
+        vaddr = target_vaddr + (i * PAGE_SIZE);
+        if (!mmc_map(target_ctx, vaddr, paddr, flags, 1)) {
+            mmc_unmap(target_ctx, target_vaddr, i);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+/**
+ * Mappt einen Speicherbereich eines anderen Tasks in einen MM-Kontext an eine
  * freie Adresse in einem vorgegebenen Adressberech.
  *
  * @param target_ctx Kontext, in den gemappt werden soll
@@ -612,9 +646,6 @@ vaddr_t mmc_automap_user(mmc_context_t* target_ctx, mmc_context_t* source_ctx,
     vaddr_t start, size_t count, uintptr_t lower_limit, uintptr_t upper_limit,
     int flags)
 {
-    size_t i;
-    paddr_t paddr;
-    vaddr_t vaddr;
     vaddr_t free_page =
         mmc_find_free_pages(target_ctx, count, lower_limit, upper_limit);
 
@@ -622,15 +653,8 @@ vaddr_t mmc_automap_user(mmc_context_t* target_ctx, mmc_context_t* source_ctx,
         return NULL;
     }
 
-    // FIXME Hier wird unter Umstaenden ziemlich oft dieselbe Pagetable gemappt
-    // und wieder ungemappt (in mmc_resolve)
-    for (i = 0; i < count; i++) {
-        paddr = mmc_resolve(source_ctx, start + (i * PAGE_SIZE));
-        vaddr = free_page + (i * PAGE_SIZE);
-        if (!mmc_map(target_ctx, vaddr, paddr, flags, 1)) {
-            mmc_unmap(target_ctx, free_page, i);
-            return NULL;
-        }
+    if (!mmc_map_user(target_ctx, source_ctx, start, count, free_page, flags)) {
+        return NULL;
     }
 
     return free_page;
-- 
1.6.0.2