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

[tyndur-devel] [PATCH 06/11] kernel2: Synchronisieren von mm-Kontexten mit dem Kernel-Kontext



+ mmc_sync: Wird unter amd64 tendenziell eher selten gebraucht,
  da der Kernel-Speicher sich kaum über 512GiB bewegen wird. Diese
  Möglichkeit wollen wir dem Kernel aber dennoch nicht nehmen.

Signed-off-by: Andreas Freimuth <m.nemo@xxxxxxx>
---
 src/kernel2/src/arch/amd64/mm/mm_context.c |   37 ++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/src/kernel2/src/arch/amd64/mm/mm_context.c b/src/kernel2/src/arch/amd64/mm/mm_context.c
index 7d4670b..5438e78 100644
--- a/src/kernel2/src/arch/amd64/mm/mm_context.c
+++ b/src/kernel2/src/arch/amd64/mm/mm_context.c
@@ -51,6 +51,43 @@
 /// Bestimmt ob das NX-Bit benutzt werden soll.
 bool mmc_use_no_exec = false;
 
+mmc_context_t kernel_ctx = {
+    .version = 0,
+    .lock = LOCK_UNLOCKED
+};
+
+/**
+ * Synchronisiere einen MM-Kontext mit dem Kernel-Kontext
+ *
+ * @param ctx MM-Kontext
+ */
+void mmc_sync(mmc_context_t* ctx)
+{
+    // TODO ctx und kernel_ctx locken (Philosophenproblem)
+    if(ctx->version < kernel_ctx.version) {
+
+        mmc_pm_entry_t* user_pm = MAPPED_PHYS_MEM_GET(ctx->pml4);
+        mmc_pm_entry_t* kernel_pm = MAPPED_PHYS_MEM_GET(kernel_ctx.pml4);
+
+        // Kopiere die vom Kernel belegten Page Maps
+        unsigned int kernelStartIndex = PAGE_MAP_INDEX(KERNEL_MEM_START);
+
+        memcpy(&user_pm[kernelStartIndex], &kernel_pm[kernelStartIndex],
+            sizeof(mmc_pm_entry_t) *
+                NUM_PAGE_MAPS(KERNEL_MEM_END - KERNEL_MEM_START));
+
+
+        // Kopiere Identity Map
+        unsigned int idMapStartIndex =
+            PAGE_MAP_INDEX(MAPPED_PHYS_MEM_START & ~ADDRESS_SIGN_EXTEND);
+
+        memcpy(&user_pm[idMapStartIndex], &kernel_pm[idMapStartIndex],
+            sizeof(mmc_pm_entry_t) *
+                NUM_PAGE_MAPS(-1L - MAPPED_PHYS_MEM_START));
+        ctx->version = kernel_ctx.version;
+    }
+}
+
 /**
  * Erstellt einen neuen MM-Kontext (PM) für einen Prozess
  *
-- 
1.7.3.4