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

[tyndur-devel] [PATCH 1/4] kernel2: mmc_vfree



+ kernel2: mmc_vfree gibt einen virtuellen Speicherbereich sowohl
  virtuell als auch physisch frei

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

diff --git a/src/kernel2/include/mm.h b/src/kernel2/include/mm.h
index 617713c..9ab51f0 100644
--- a/src/kernel2/include/mm.h
+++ b/src/kernel2/include/mm.h
@@ -125,6 +125,16 @@ vaddr_t mmc_valloc_limits(mmc_context_t* context, size_t num_pages,
  */
 vaddr_t mmc_valloc(mmc_context_t* context, size_t num_pages, int flags);
 
+/**
+ * Gibt einen virtuell (aber nicht zwingend physisch) zusammenhaengenden
+ * Speicherbereich sowohl virtuell als auch physisch frei.
+ *
+ * @param context Speicherkontext, aus dem die Seiten freigegeben werden sollen
+ * @param vaddr Virtuelle Adresse der ersten freizugebenden Seite
+ * @param num_pages Anzahl der freizugebenden Seiten
+ */
+void mmc_vfree(mmc_context_t* context, vaddr_t vaddr, size_t num_pages);
+
 void mmc_activate(mmc_context_t* context);
 
 #define mmc_current_context() (*cpu_get_current()->mm_context)
diff --git a/src/kernel2/src/arch/i386/mm/mm_context.c b/src/kernel2/src/arch/i386/mm/mm_context.c
index 07a5be8..261b8ea 100644
--- a/src/kernel2/src/arch/i386/mm/mm_context.c
+++ b/src/kernel2/src/arch/i386/mm/mm_context.c
@@ -686,3 +686,23 @@ vaddr_t mmc_valloc(mmc_context_t* context, size_t num_pages, int flags)
             KERNEL_MEM_START, KERNEL_MEM_END, flags);
     }
 }
+
+/**
+ * Gibt einen virtuell (aber nicht zwingend physisch) zusammenhaengenden
+ * Speicherbereich sowohl virtuell als auch physisch frei.
+ *
+ * @param context Speicherkontext, aus dem die Seiten freigegeben werden sollen
+ * @param vaddr Virtuelle Adresse der ersten freizugebenden Seite
+ * @param num_pages Anzahl der freizugebenden Seiten
+ */
+void mmc_vfree(mmc_context_t* context, vaddr_t vaddr, size_t num_pages)
+{
+    int i;
+    paddr_t paddr;
+
+    for (i = 0; i < num_pages; i++) {
+        paddr = mmc_resolve(context, vaddr + (i * PAGE_SIZE));
+        pmm_free(paddr, 1);
+    }
+    mmc_unmap(context, vaddr, num_pages);
+}
-- 
1.6.0.2