[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