#include "panic.h" #include "arch.h" #include #include #include #include #include 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; } }