summaryrefslogtreecommitdiff
path: root/kernel/paging.c
blob: ca099362ad40adc61032266050f55519ce4501e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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_map_p2 | 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.
}