From 470e39e8e8510306b48e3be6bb48c22f80179766 Mon Sep 17 00:00:00 2001 From: ngiddings Date: Mon, 19 Apr 2021 06:55:27 -0500 Subject: [PATCH] Added support for page types in mmgr --- include/mmgr.h | 15 +++++++++++++++ src/x86/mmgr.c | 25 ++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/include/mmgr.h b/include/mmgr.h index 12e86c8..e3dfd15 100644 --- a/include/mmgr.h +++ b/include/mmgr.h @@ -10,6 +10,13 @@ enum page_flag_t PAGE_USERMODE = 1 << 2 }; +enum page_type_t +{ + PAGE_NOT_PRESENT = 0, + PAGE_ANON = 1, + PAGE_COPY_ON_WRITE = 2 +}; + extern const size_t page_size; /** @@ -55,3 +62,11 @@ int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int * @return physaddr_t */ physaddr_t unmap_page(void *page); + +/** + * @brief + * + * @param page + * @return enum page_type_t + */ +enum page_type_t page_type(void *page); diff --git a/src/x86/mmgr.c b/src/x86/mmgr.c index 572abc2..4e4a692 100644 --- a/src/x86/mmgr.c +++ b/src/x86/mmgr.c @@ -20,7 +20,7 @@ struct page_table_entry_t uint32_t pat : 1; uint32_t global : 1; uint32_t shared : 1; - uint32_t ignored : 2; + uint32_t type : 2; uint32_t physical_address : 20; }; @@ -32,7 +32,7 @@ int start_paging(physaddr_t start, physaddr_t end, uint32_t *directory, uint32_t { physaddr_t p = start; size_t count = 0; - while(p < end) + while (p < end) { uint32_t table_entry = p + 3; int index = p / page_size; @@ -42,7 +42,7 @@ int start_paging(physaddr_t start, physaddr_t end, uint32_t *directory, uint32_t count++; } directory[0] = ((uint32_t)identity_table) + 3; - directory[1022] = ((uint32_t)table) + 3; + directory[1022] = ((uint32_t)table) + 3 + 1024; directory[1023] = ((uint32_t)directory) + 3; asm("mov %0, %%cr3" : @@ -115,6 +115,7 @@ int map_page(struct page_stack_t *page_stack, void *page, physaddr_t frame, int page_tables[table_index].present = 1; page_tables[table_index].usermode = (flags & PAGE_USERMODE) ? 1 : 0; page_tables[table_index].rw = (flags & PAGE_RW) ? 1 : 0; + page_tables[table_index].type = PAGE_ANON; asm volatile("invlpg (%0)" : : "r"(page) @@ -126,7 +127,7 @@ physaddr_t unmap_page(void *page) { if ((size_t)page % page_size != 0) { - return S_OUT_OF_BOUNDS; + return S_INVALID_ARGUMENT; } size_t table_index = (size_t)page / page_size; size_t directory_index = table_index / (page_size / sizeof(struct page_table_entry_t)); @@ -144,4 +145,18 @@ physaddr_t unmap_page(void *page) : "memory"); return frame; } -} \ No newline at end of file +} + +enum page_type_t page_type(void *page) +{ + size_t table_index = (size_t)page / page_size; + size_t directory_index = table_index / (page_size / sizeof(struct page_table_entry_t)); + if (!page_directory[directory_index].present || !page_tables[table_index].present) + { + return PAGE_NOT_PRESENT; + } + else + { + return page_tables[table_index].type; + } +}