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 */