diff options
author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2010-02-02 07:28:10 +0100 |
---|---|---|
committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2010-02-02 07:28:10 +0100 |
commit | 8abb673efbc4cccda9ed564eeebe4660a879647e (patch) | |
tree | 9709fd49dbc70838b77d290a338a1d230ea27f27 /kernel/paging.c | |
parent | 273967f16dad471478bbca2a14a5282faae95679 (diff) |
Reinitialize paging.
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. +} |