diff --git a/sys/i386/trap.c b/sys/i386/trap.c index 3e4333e..785b559 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -141,8 +141,12 @@ cr2 = rcr2(); kprintf("trap_code: %i(0x%X), EIP: 0x%X, CR2: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip, cr2); - - die_if_kernel("trapCode", frame, frame->tf_trapno); - endTask(_current->id); - sched_yield(); + if (frame->tf_trapno == 0xc) { + vmm_pageFault(frame, cr2); + } + else { + die_if_kernel("trapCode", frame, frame->tf_trapno); + endTask(_current->id); + sched_yield(); + } } diff --git a/sys/vmm/createvirtualspace.c b/sys/vmm/createvirtualspace.c index 4469f0d..297d83c 100644 --- a/sys/vmm/createvirtualspace.c +++ b/sys/vmm/createvirtualspace.c @@ -148,8 +148,11 @@ /* Flush The Page From Garbage In Memory */ bzero(newPageTable, PAGE_SIZE); - for (x = 0; x < PD_ENTRIES; x++) + for (x = 0; x < PD_ENTRIES; x++) { + if (x == 0x21) + kprintf("[0x%X]", newPageDirectory[x]); newPageTable[x] = newPageDirectory[x]; + } /* Unmap Page From Virtual Space */ vmm_unmapPage((uint32_t) newPageTable, 1); diff --git a/sys/vmm/getfreevirtualpage.c b/sys/vmm/getfreevirtualpage.c index 743a7f7..36894b4 100644 --- a/sys/vmm/getfreevirtualpage.c +++ b/sys/vmm/getfreevirtualpage.c @@ -102,6 +102,9 @@ pageTableSrc[pdI] = (pageDir[pdI] & 0xFFFFF000) | PAGE_DEFAULT; /* Is This Why Page Needs To Be User As Well? */ pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); + if (pdI == 0x21) + kprintf("GOT YOU: %i", _current->id); + //kprintf("PAGE NOT %i,", __LINE__); diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index f3f6863..f1bcfda 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -224,6 +224,8 @@ destPageDirectoryIndex = PD_INDEX(dest); if ((pageDir[destPageDirectoryIndex] & PAGE_PRESENT) != PAGE_PRESENT) { + if (destPageDirectoryIndex == 0x21) + kpanic("v_rP"); //kprintf("Page Not Present: 0x%X, Source: 0x%X, Dest: 0x%X, dPDI: 0x%X\n", dest, source, dest, destPageDirectoryIndex); /* If Page Table Is Non Existant Then Set It Up */ /* UBU Why does the page table need to be user writable? */ @@ -303,7 +305,10 @@ spinLock(&fkpSpinLock); /* Lets Search For A Free Page */ - for (x = 768; x < 1024; x++) { + for (x = PD_INDEX(VMM_KERN_START); x <= PD_INDEX(VMM_KERN_END); x++) { + + if (x == 0x21) + kpanic("gFKP"); /* Set Page Table Address */ pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (4096 * x)); @@ -401,7 +406,7 @@ K_PANIC("Returned NULL"); } for (x = (_current->oInfo.vmStart / (1024 * 4096)); x < 1024; x++) { - +kapnic("v_mFT"); pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (4096 * x)); for (y = 0; y < 1024; y++) { @@ -483,12 +488,37 @@ uInt16 x = 0x0, y = 0x0; int c = 0x0; uint32_t *pageTableSrc = 0x0; + uint32_t *pageDirectory = 0x0; + + pageDirectory = (uint32_t *) PD_BASE_ADDR; spinLock(&fkpSpinLock); + /* Lets Search For A Free Page */ - for (x = 960; x < 1024; x++) { + for (x = PD_INDEX(VMM_KERN_START); x <= PD_INDEX(VMM_KERN_END); x++) { + + if ((pageDirectory[x] & PAGE_PRESENT) != PAGE_PRESENT) { /* If Page Directory Is Not Yet Allocated Allocate It */ + + pageDirectory[x] = (uint32_t) vmm_findFreePage(_current->id) | PAGE_DEFAULT; + + /* Also Add It To Virtual Space So We Can Make Changes Later */ + pageTable = (uint32_t *) (PT_BASE_ADDR + (PD_INDEX( PT_BASE_ADDR ) * 0x1000)); /* Table that maps that 4MB */ + + pageTableSrc[x] = (pageDirectory[x] & 0xFFFFF000) | PAGE_DEFAULT; + pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); + + /* Reload Page Directory */ + asm( + "movl %cr3,%eax\n" + "movl %eax,%cr3\n" + ); + + bzero(pageTableSrc, PAGE_SIZE); + } + /* Set Page Table Address */ pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (0x1000 * x)); + for (y = 0; y < 1024; y++) { /* Loop Through The Page Table Find An UnAllocated Page */ if ((uint32_t) pageTableSrc[y] == (uint32_t) 0x0) {