diff options
Diffstat (limited to '')
-rw-r--r-- | kernel/src/arch/i686/paging.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/kernel/src/arch/i686/paging.c b/kernel/src/arch/i686/paging.c new file mode 100644 index 0000000..b0fd4ca --- /dev/null +++ b/kernel/src/arch/i686/paging.c @@ -0,0 +1,71 @@ +#include "panic.h" +#include "arch.h" +#include <arch/i686/paging.h> +#include <stdbool.h> +#include <stdint.h> +#include <string.h> +#include <print.h> + +extern struct page_directory_t page_directory[1024]; +extern struct page_table_t page_tables[1024][1024]; +// static uintptr_t KERNEL_MAPPING = 0xC0000000; + +void setup_pgdir(struct page_directory_t pgdir[1024]) { + for(int i = 0; i < 1024; i++) { + pgdir[i].present = 0; + pgdir[i].rw_flag = 1; + pgdir[i].access_lvl = 0; + } +} + +void paging_ident(struct page_table_t tbl[1024]) { + size_t size = 1024; + for(size_t i = 0; i < size; i++) { + tbl[i].rw_flag = 1; + tbl[i].access_lvl = 0; + tbl[i].phys_addr = i; + tbl[i].present = 1; + } +} + +void map_page(struct page_table_t tbl[1024], void *addr) { + uintptr_t ptr = (uintptr_t) addr; + ptr &= 0xfffff000; + ptr >>= 16; + for(size_t i = 0; i < 4096; i++) { + tbl[i].rw_flag = 1; + tbl[i].access_lvl = 0; + tbl[i].phys_addr = ptr / 4096 + i; + tbl[i].present = 1; + } +} + +void unmap_page(struct page_table_t tbl[1024]) { + for(size_t i = 0; i < 4096; i++) { + tbl[i].rw_flag = 1; + tbl[i].access_lvl = 0; + tbl[i].phys_addr = 0; + tbl[i].present = 0; + } +} + +void ident_map_addr(void *addr, size_t len) { + uintptr_t ptr = (uintptr_t) addr; + int i = ptr / 0x400000; + // int c = len / 0x1000 + (len % 0x1000 ? 1 : 0); + // for (; c > 0; c--, i++) { + // paging_ident(page_tables[i]); + // } + paging_ident(page_tables[i]); +} + +void ident_unmap_addr(void *addr, size_t len) { + uintptr_t ptr = (uintptr_t) addr; + int i = ptr / 0x1000; + int c = len / 0x1000 + (len % 0x1000 ? 1 : 0); + for (; c > 0; c--, i++) { + page_tables[i / 1024][i % 1024].present = 0; + page_tables[i / 1024][i % 1024].rw_flag = 1; + page_tables[i / 1024][i % 1024].access_lvl = 0; + } +} |