diff --git a/sys/vmm/Makefile b/sys/vmm/Makefile index 601de40..ba7f146 100644 --- a/sys/vmm/Makefile +++ b/sys/vmm/Makefile @@ -6,7 +6,7 @@ include ../Makefile.incl # Objects -OBJS = page_fault.o pagefault.o getfreevirtualpage.o copyvirtualspace.o setpageattributes.o unmappage.o getphysicaladdr.o getfreepage.o createvirtualspace.o vmm_memory.o paging.o vmm_init.o vmm_mmap.o freevirtualpage.o +OBJS = vmm_allocpagedir.o page_fault.o pagefault.o getfreevirtualpage.o copyvirtualspace.o setpageattributes.o unmappage.o getphysicaladdr.o getfreepage.o createvirtualspace.o vmm_memory.o paging.o vmm_init.o vmm_mmap.o freevirtualpage.o all: $(OBJS) diff --git a/sys/vmm/vmm_allocpagetable.c b/sys/vmm/vmm_allocpagetable.c new file mode 100644 index 0000000..e978139 --- /dev/null +++ b/sys/vmm/vmm_allocpagetable.c @@ -0,0 +1,42 @@ +#include +#include +#include + + +int vmm_allocPageTable(uint32_t pdI, pidType pid) { + uint32_t *pageDirectory = PD_BASE_ADDR; + uint32_t *pageTable = 0x0; + + if ((pdI >= PD_ENTRIES) || ((pageDirectory[pdI] & PAGE_PRESENT) == PAGE_PRESENT)) + return(-1); + + + /* Lock The Page Directory So We Dont Collide With Another Thread */ + //spinLock(&pdSpinLock); + + /* Map Page Table Page Into Page Directory */ + pageDirectory[pdI] = (uint32_t) vmm_findFreePage(pid) | KERN_PAGE_DEFAULT; + + /* Map Page Table To Virtual Space So We Can Easily Manipulate It */ + pageTable = (uint32_t *) (PT_BASE_ADDR + (PD_INDEX( PT_BASE_ADDR ) * PAGE_SIZE)); + + if ((pageTable[pdI] & PAGE_PRESENT) == PAGE_PRESET) + kpanic("How did this happen"); + + pageTable[pdI] = pageDirectory[pdI]; + + /* Reload Page Directory */ + asm( + "movl %cr3,%eax\n" + "movl %eax,%cr3\n" + ); + + /* Clean The Page */ + pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * PAGE_SIZE)); + bzero(pageTable, PAGE_SIZE); + + //spinUnlock(&pdSpinLock); + + return(0x0); + +}