diff options
Diffstat (limited to 'kernel/paging.c')
-rw-r--r-- | kernel/paging.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/paging.c b/kernel/paging.c new file mode 100644 index 0000000..22da7e8 --- /dev/null +++ b/kernel/paging.c @@ -0,0 +1,26 @@ +#include "paging.h" +#include "kernel.h" + +#define invlpg(page) asm volatile("invlpg (%0)" :: "r" (page)) + +void paging_reinit() { + map_p1.l[(uint32_t)&map_p2 >> 12] = (uint32_t)&entry_pagedir | P1_P | P1_W | P1_G; + + invlpg(&map_p2); + + for(unsigned int i = 0; i < 1024; i++) { + if(map_p2[i] & P2_P && !(map_p2[i] & P2_G)) { + map_p2[i] = 0; + } + + if(map_p1.b[0x300][i] & P1_P && !(map_p1.b[0x300][i] & P1_G)) { + map_p1.b[0x300][i] = 0; + } + + if(map_p1.b[0x3ff][i] & P1_P && !(map_p1.b[0x3ff][i] & P1_G)) { + map_p1.b[0x3ff][i] = 0; + } + } + + // TODO: Set CR4.PGE. +} |