BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 381dc7b37e5dfe249412ce3559e8b0dcd56f6267 / memory / page.c

// Related

Nucleus

Barry Virtual Memory Regions and namespace 381dc7b (3 years, 3 months ago)
diff --git a/memory/page.c b/memory/page.c
index 6e1e67a..3aa4923 100644
--- a/memory/page.c
+++ b/memory/page.c
@@ -6,19 +6,7 @@
 
 #include <nucleus/object.h>
 #include <nucleus/memory.h>
-
-/* Structure for a Page in a Cache */
-struct Page {
-	Object obj;
-	off_t offset;
-	page_t frame;
-};
-
-/* Information for find callback */
-struct FindData {
-	off_t offset;
-	Page *result;
-};
+#include "namespace.h"
 
 static void page_delete(Object *);
 
@@ -37,19 +25,6 @@ page_delete(Object *obj)
 	free_frame(PAGE_ADDR(page->frame));
 }
 
-/* Callback for finding a Page by offset */
-static int
-compare_page_offset(void *object, void *data)
-{
-	Page *page = object;
-	struct FindData *find = data;
-	if (page->offset == find->offset) {
-		find->result = get(page);
-		return 1;
-	}
-	return 0;
-}
-
 /* Create a new Page entry */
 Page *
 create_page(ObjectList *cache, page_t frame, off_t offset)
@@ -58,6 +33,7 @@ create_page(ObjectList *cache, page_t frame, off_t offset)
 	page->frame = frame;
 	page->offset = offset;
 	add(cache, page);
+	put(page);
 	return page;
 }
 
@@ -65,12 +41,23 @@ create_page(ObjectList *cache, page_t frame, off_t offset)
 Page *
 find_page(ObjectList *cache, off_t offset)
 {
-	struct FindData data = {
-		.offset = offset,
-		.result = NULL,
-	};
-	iterate(cache, compare_page_offset, &data);
-	return data.result;
+	Page *page;
+	foreach (cache, page) {
+		if (page->offset == offset)
+			break;
+	}
+	return page;
+}
+
+/* Install a page into a virtual address space */
+void
+install_page(uintptr_t addr, Page *page, int prot)
+{
+	int access = PTE_PRESENT | PTE_USER;
+	if (prot & PROT_WRITE)
+		access |= PTE_WRITE;
+	set_page(PAGE_ADDR(addr), page->frame | access);
+	flush_tlb(PAGE_ADDR(addr));
 }
 
 /* Get the virtual address for the mapping of a page */