/**************************************************************************************
Copyright (c) 2002
The UbixOS Project
$Id$
**************************************************************************************/
#include <vmm/paging.h>
unsigned int *pageDirectory = 0x0;
int memoryStart = 0x100000;
void initPaging() {
int i = 0;
unsigned int *pageTable;
int freePage = 0x0;
pageDirectory = (unsigned int*)allocPage();
for (i=0;i<pageLength;i++) {
pageDirectory[i] = 0x0;
}
pageTable = (unsigned int*)allocPage();
pageDirectory[0] = (unsigned int)pageTable | pageDefault;
for (i=0;i<1024;i++) {
pageTable[i] = 0x0;
}
for (i=0;i<1024;i++) {
pageTable[i] = freePage | 7;
freePage += 0x1000;
}
asm(
"movl %0,%%eax \n"
"movl %%eax,%%cr3 \n"
"movl %%cr0,%%eax \n"
"orl $0x80000000,%%eax \n"
"movl %%eax,%%cr0 \n"
: : "d" ((unsigned int *)(pageDirectory))
);
}
unsigned int allocPage() {
unsigned int page;
if (memoryStart%4096 != 0) {
memoryStart += 4096 - memoryStart%4096;
}
page = memoryStart;
memoryStart += 4096;
return(page);
}
void pageFault() {
while (1);
}