diff --git a/sys/vmm/getphysicaladdr.c b/sys/vmm/getphysicaladdr.c index eb9c5f4..de66905 100644 --- a/sys/vmm/getphysicaladdr.c +++ b/sys/vmm/getphysicaladdr.c @@ -35,36 +35,42 @@ */ /* returns the real address of page is page aligned */ -uint32_t vmm_getPhysicalAddr(uint32_t pageAddr) { - int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; - uint32_t *pageTable = 0x0; +uint32_t vmm_getPhysicalAddr( uint32_t pageAddr ) { - //Calculate The Page Directory Index - pageDirectoryIndex = (pageAddr >> 22); + int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; - //Calculate The Page Table Index - pageTableIndex = ((pageAddr >> 12) & 0x3FF); + uint32_t *pageTable = 0x0; - /* Set pageTable To The Virtual Address Of Table */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + // Calculate The Page Directory Index + pageDirectoryIndex = ( pageAddr >> 22 ); - /* Return The Physical Address Of The Page */ - return ((uint32_t) (pageTable[pageTableIndex] & 0xFFFFF000)); + // Calculate The Page Table Index + pageTableIndex = ( ( pageAddr >> 12 ) & 0x3FF ); + + // Set pageTable To The Virtual Address Of Table + pageTable = ( uint32_t * ) ( PT_BASE_ADDR + ( PAGE_SIZE * pageDirectoryIndex ) ); + + // Return The Physical Address Of The Page + return( ( uint32_t ) ( pageTable[pageTableIndex] & 0xFFFFF000 ) ); + } /* Returns the real address not page aligned */ -uint32_t vmm_getRealAddr(uint32_t addr) { - int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; - uint32_t *pageTable = 0x0; +uint32_t vmm_getRealAddr( uint32_t addr ) { - //Calculate The Page Directory Index - pageDirectoryIndex = (addr >> 22); + int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; - //Calculate The Page Table Index - pageTableIndex = ((addr >> 12) & 0x3FF); + uint32_t *pageTable = 0x0; - /* Set pageTable To The Virtual Address Of Table */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + // Calculate The Page Directory Index + pageDirectoryIndex = ( addr >> 22 ); + + // Calculate The Page Table Index + pageTableIndex = ( ( addr >> 12 ) & 0x3FF ); + + // Set pageTable To The Virtual Address Of Table + pageTable = ( uint32_t * ) (PT_BASE_ADDR + ( PAGE_SIZE * pageDirectoryIndex ) ); /* Return The Physical Address Of The Page */ - return ((uint32_t) (pageTable[pageTableIndex] & 0xFFFFF000) + (addr & 0xFFF)); + return( ( uint32_t ) ( pageTable[pageTableIndex] & 0xFFFFF000 ) + ( addr & 0xFFF ) ); + } diff --git a/sys/vmm/pagefault.c b/sys/vmm/pagefault.c index c95860b..eed80fc 100644 --- a/sys/vmm/pagefault.c +++ b/sys/vmm/pagefault.c @@ -51,98 +51,134 @@ *****************************************************************************************/ /* void vmm_pageFault(uInt32 memAddr,uInt32 eip,uInt32 esp) { */ -void vmm_pageFault(struct trapframe *frame, uint32_t cr2) { - uInt32 i = 0x0, pageTableIndex = 0x0, pageDirectoryIndex = 0x0; - uInt32 *pageDir = 0x0, *pageTable = 0x0; - uInt32 *src = 0x0, *dst = 0x0; +void vmm_pageFault( struct trapframe *frame, uint32_t cr2 ) { - uint32_t esp = frame->tf_esp; - uint32_t eip = frame->tf_eip; - uint32_t memAddr = cr2; + uInt32 i = 0x0, pageTableIndex = 0x0, pageDirectoryIndex = 0x0; + uInt32 *pageDir = 0x0, *pageTable = 0x0; + uInt32 *src = 0x0, *dst = 0x0; -//MrOlsen 2017-12-15 - - kprintf("CR2: [0x%X], EIP: 0x%X, ERR: 0x%X, PID: %i\n", cr2, frame->tf_eip, frame->tf_err, _current->id); + uint32_t esp = frame->tf_esp; + uint32_t eip = frame->tf_eip; + uint32_t memAddr = cr2; - /* Try to aquire lock otherwise spin till we do */ - spinLock(&pageFaultSpinLock); + //MrOlsen 2017-12-15 - + kprintf( "CR2: [0x%X], EIP: 0x%X, ERR: 0x%X, PID: %i\n", cr2, frame->tf_eip, frame->tf_err, _current->id ); - /* Set page dir pointer to the address of the visable page directory */ - pageDir = (uint32_t *) PD_BASE_ADDR; + // Try to aquire lock otherwise spin till we do + spinLock( &pageFaultSpinLock ); - /* UBU - This is a temp panic for 0x0 read write later on I will handle this differently */ - if (memAddr == 0x0) { - kprintf("Segfault At Address: [0x%X], ESP: [0x%X], PID: [%i], EIP: [0x%X]\n", memAddr, esp, _current->id, eip); - kpanic("Error We Wrote To 0x0\n"); - } + // Set page dir pointer to the address of the visable page directory + pageDir = ( uint32_t * ) PD_BASE_ADDR; - /* Calculate The Page Directory Index */ - pageDirectoryIndex = PD_INDEX(memAddr); + // UBU - This is a temp panic for 0x0 read write later on I will handle this differently + if( memAddr == 0x0 ) { - /* Calculate The Page Table Index */ - pageTableIndex = PT_INDEX(memAddr); + kprintf( "Segfault At Address: [0x%X], ESP: [0x%X], PID: [%i], EIP: [0x%X]\n", memAddr, esp, _current->id, eip ); - /* UBU - This is a temporary routine for handling access to a page of a non existant page table */ - if (pageDir[pageDirectoryIndex] == 0x0) { - kprintf("Segfault At Address: [0x%X][0x%X][%i][0x%X], Not A Valid Page Table\n", memAddr, esp, _current->id, eip); - spinUnlock(&pageFaultSpinLock); - endTask(_current->id); - } - else { - /* Set pageTable To Point To Virtual Address Of Page Table */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * pageDirectoryIndex)); + kpanic( "Error We Wrote To 0x0\n" ); - /* Test if this is a COW on page */ - if (((uint32_t) pageTable[pageTableIndex] & PAGE_COW) == PAGE_COW) { - /* Set Src To Base Address Of Page To Copy */ - src = (uInt32 *) (memAddr & 0xFFFFF000); - /* Allocate A Free Page For Destination */ - /* USE vmInfo */ - dst = (uInt32 *) vmm_getFreeVirtualPage(_current->id, 1, 0x1); - /* Copy Memory */ - for (i = 0; i < PD_ENTRIES; i++) { - dst[i] = src[i]; - } - /* Adjust The COW Counter For Physical Page */ - adjustCowCounter(((uInt32) pageTable[pageTableIndex] & 0xFFFFF000), -1); - /* Remap In New Page */ - pageTable[pageTableIndex] = (uInt32) (vmm_getPhysicalAddr((uInt32) dst) | (memAddr & 0xFFF)); - /* Unlink From Memory Map Allocated Page */ - vmm_unmapPage((uInt32) dst, 1); - } - else if (pageTable[pageTableIndex] != 0x0) { - kprintf("Security failed pagetable not user permission\n"); - kprintf("pageDir: [0x%X]\n", pageDir[pageDirectoryIndex]); - kprintf("pageTable: [0x%X:0x%X:0x%X:0x%X]\n", pageTable[pageTableIndex], pageTableIndex, pageDirectoryIndex, eip); - kprintf("Segfault At Address: [0x%X][0x%X][%i][0x%X] Non Mapped.\n", memAddr, esp, _current->id, eip); - kpanic("SIT HERE FOR NOW"); - die_if_kernel("SEGFAULT", frame, 0xC); - spinUnlock(&pageFaultSpinLock); - endTask(_current->id); - } - else if (memAddr < (_current->td.vm_dsize + _current->td.vm_daddr)) { - kprintf("THIS IS BAD"); - die_if_kernel("SEGFAULT", frame, 0xC); - pageTable[pageTableIndex] = (uInt32) vmm_findFreePage(_current->id) | PAGE_DEFAULT; - } - else { - spinUnlock(&pageFaultSpinLock); - /* Need To Create A Routine For Attempting To Access Non Mapped Memory */ - kprintf("pageDir: [0x%X]\n", pageDir[pageDirectoryIndex]); - kprintf("pageTable: [0x%X:0x%X:0x%X:0x%X]\n", pageTable[pageTableIndex], pageTableIndex, pageDirectoryIndex, eip); - kprintf("Segfault At Address: [0x%X][0x%X][%i][0x%X] Non Mapped!\n", memAddr, esp, _current->id, eip); - die_if_kernel("SEGFAULT", frame, 0xC); - kpanic("SIT HERE FOR NOW"); - kprintf("Out Of Stack Space: [0x%X]\n", memAddr & 0xFF0000); - endTask(_current->id); - } - } - asm volatile( - "movl %cr3,%eax\n" - "movl %eax,%cr3\n" - ); + } - /* Release the spin lock */ - spinUnlock(&pageFaultSpinLock); - kprintf("CR2-RET"); - return; + // Calculate The Page Directory Index + pageDirectoryIndex = PD_INDEX( memAddr ); + + // Calculate The Page Table Index + pageTableIndex = PT_INDEX( memAddr ); + + // UBU - This is a temporary routine for handling access to a page of a non existant page table + if( pageDir[pageDirectoryIndex] == 0x0 ) { + + kprintf( "Segfault At Address: [0x%X][0x%X][%i][0x%X], Not A Valid Page Table\n", memAddr, esp, _current->id, eip ); + + spinUnlock( &pageFaultSpinLock ); + + endTask( _current->id ); + + } else { + + // Set pageTable To Point To Virtual Address Of Page Table + pageTable = ( uint32_t * ) ( PT_BASE_ADDR + ( PAGE_SIZE * pageDirectoryIndex ) ); + + // Test if this is a COW on page + if( ( ( uint32_t ) pageTable[pageTableIndex] & PAGE_COW ) == PAGE_COW ) { + + // Set Src To Base Address Of Page To Copy + src = ( uInt32 * ) ( memAddr & 0xFFFFF000 ); + + // Allocate A Free Page For Destination + // USE vmInfo + dst = ( uInt32 * ) vmm_getFreeVirtualPage( _current->id, 1, 0x1 ); + + // Copy Memory + for( i = 0; i < PD_ENTRIES; i++ ) { + + dst[i] = src[i]; + + } + + // Adjust The COW Counter For Physical Page + adjustCowCounter( ( ( uInt32 ) pageTable[pageTableIndex] & 0xFFFFF000 ), -1 ); + + // Remap In New Page + pageTable[pageTableIndex] = ( uInt32 ) ( vmm_getPhysicalAddr( ( uInt32 ) dst ) | ( memAddr & 0xFFF ) ); + + // Unlink From Memory Map Allocated Page + vmm_unmapPage( ( uInt32 ) dst, 1 ); + + } else if( pageTable[pageTableIndex] != 0x0 ) { + + kprintf( "Security failed pagetable not user permission\n" ); + kprintf( "pageDir: [0x%X]\n", pageDir[pageDirectoryIndex] ); + kprintf( "pageTable: [0x%X:0x%X:0x%X:0x%X]\n", pageTable[pageTableIndex], pageTableIndex, pageDirectoryIndex, eip ); + kprintf( "Segfault At Address: [0x%X][0x%X][%i][0x%X] Non Mapped.\n", memAddr, esp, _current->id, eip ); + + kpanic( "SIT HERE FOR NOW" ); + + die_if_kernel( "SEGFAULT", frame, 0xC ); + + spinUnlock( &pageFaultSpinLock ); + + endTask( _current->id ); + + } else if( memAddr < ( _current->td.vm_dsize + _current->td.vm_daddr ) ) { + + kprintf( "THIS IS BAD" ); + + die_if_kernel( "SEGFAULT", frame, 0xC ); + + pageTable[pageTableIndex] = ( uInt32 ) vmm_findFreePage( _current->id ) | PAGE_DEFAULT; + + } else { + + spinUnlock(&pageFaultSpinLock); + + // Need To Create A Routine For Attempting To Access Non Mapped Memory + kprintf( "pageDir: [0x%X]\n", pageDir[pageDirectoryIndex] ); + kprintf( "pageTable: [0x%X:0x%X:0x%X:0x%X]\n", pageTable[pageTableIndex], pageTableIndex, pageDirectoryIndex, eip ); + kprintf( "Segfault At Address: [0x%X][0x%X][%i][0x%X] Non Mapped!\n", memAddr, esp, _current->id, eip ); + + die_if_kernel( "SEGFAULT", frame, 0xC ); + + kpanic( "SIT HERE FOR NOW" ); + + kprintf( "Out Of Stack Space: [0x%X]\n", memAddr & 0xFF0000 ); + + endTask( _current->id ); + + } + + } + + asm volatile( + "movl %cr3,%eax\n" + "movl %eax,%cr3\n" + ); + + // Release the spin lock + spinUnlock( &pageFaultSpinLock ); + + kprintf("CR2-RET"); + + return; + } diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index 44eb690..2d42f1c 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -57,134 +57,172 @@ *****************************************************************************************/ int vmm_pagingInit() { - uint32_t i = 0x0; - uint32_t *pageTable = 0x0; - /* Allocate A Page Of Memory For Kernels Page Directory */ - kernelPageDirectory = (uint32_t *) vmm_findFreePage( sysID); + uint32_t i = 0x0; + uint32_t *pageTable = 0x0; - if (kernelPageDirectory == 0x0) { - K_PANIC("Error: vmm_findFreePage Failed"); - } /* end if */ + // Allocate A Page Of Memory For Kernels Page Directory + kernelPageDirectory = ( uint32_t * ) vmm_findFreePage( sysID ); - /* Clear The Memory To Ensure There Is No Garbage */ - bzero(kernelPageDirectory, PAGE_SIZE); + if( kernelPageDirectory == 0x0 ) { - /* Allocate a page for the first 4MB of memory */ - if ((pageTable = (uint32_t *) vmm_findFreePage( sysID)) == 0x0) - K_PANIC("Error: vmm_findFreePage Failed"); + K_PANIC( "Error: vmm_findFreePage Failed" ); - /* Make Sure The Page Table Is Clean */ - bzero(pageTable, PAGE_SIZE); + } /* end if */ - kernelPageDirectory[0] = (uint32_t) ((uint32_t) (pageTable) | PAGE_DEFAULT); + // Clear The Memory To Ensure There Is No Garbage + bzero( kernelPageDirectory, PAGE_SIZE ); - /* - * Map the first 1MB of Memory to the kernel MM space because our kernel starts - * at 0x30000 - * Do not map page at address 0x0 this is reserved for null... - */ + // Allocate a page for the first 4MB of memory + if( ( pageTable = ( uint32_t * ) vmm_findFreePage( sysID ) ) == 0x0 ) { - /* MrOlsen (2016-01-15) NOTE: I'm Mapping It For Now Until I Can Figure Out Why FS:0x0 */ - for (i = 0x0; i < (PD_ENTRIES / 0x4); i++) { - pageTable[i] = (uint32_t) ((i * 0x1000) | PAGE_DEFAULT); //FIXME: This is temp becauseo f bios callKERNEL_PAGE_DEFAULT); //MrOlsen 2018-01-14 PAGE_DEFAULT - } /* end for */ + K_PANIC( "Error: vmm_findFreePage Failed" ); - /* Allocate a page for the second 4MB of memory */ - if ((pageTable = (uint32_t *) vmm_findFreePage( sysID)) == 0x0) - K_PANIC("Error: vmm_findFreePage Failed"); + } - /* Make Sure The Page Table Is Clean */ - bzero(pageTable, PAGE_SIZE); + // Make Sure The Page Table Is Clean + bzero( pageTable, PAGE_SIZE ); - kernelPageDirectory[1] = (uint32_t) ((uint32_t) (pageTable) | PAGE_DEFAULT); + kernelPageDirectory[0] = ( uint32_t ) ( ( uint32_t ) ( pageTable ) | PAGE_DEFAULT ); - /* - * Create page tables for the top 1GB of VM space. This space is set aside - * for kernel space and will be shared with each process - */ + /* + * Map the first 1MB of Memory to the kernel MM space because our kernel starts + * at 0x30000 + * Do not map page at address 0x0 this is reserved for null... + */ - for (i = PD_INDEX(VMM_KERN_START); i <= PD_INDEX(VMM_KERN_END); i++) { - if ((pageTable = (uint32_t *) vmm_findFreePage( sysID)) == 0x0) - K_PANIC("Error: vmm_findFreePage Failed"); + // MrOlsen (2016-01-15) NOTE: I'm Mapping It For Now Until I Can Figure Out Why FS:0x0 + for( i = 0x0; i < ( PD_ENTRIES / 0x4 ); i++ ) { - /* Make Sure The Page Table Is Clean */ - bzero(pageTable, PAGE_SIZE); + pageTable[i] = ( uint32_t ) ( ( i * 0x1000 ) | PAGE_DEFAULT ); //FIXME: This is temp becauseo f bios callKERNEL_PAGE_DEFAULT); //MrOlsen 2018-01-14 PAGE_DEFAULT - /* Map In The Page Directory */ - kernelPageDirectory[i] = (uint32_t) ((uint32_t) (pageTable) | KERNEL_PAGE_DEFAULT | PAGE_GLOBAL); - } /* end for */ + } /* end for */ - kernelPageDirectory[1023] = (uint32_t) ((uint32_t) (pageTable) | KERNEL_PAGE_DEFAULT); - pageTable = (uint32_t *) (kernelPageDirectory[1023] & 0xFFFFF000); + // Allocate a page for the second 4MB of memory + if( ( pageTable = ( uint32_t * ) vmm_findFreePage( sysID ) ) == 0x0 ) { - pageTable[1023] = (vmm_findFreePage(sysID) | KERNEL_PAGE_DEFAULT | PAGE_STACK); - pageTable[1022] = (vmm_findFreePage(sysID) | KERNEL_PAGE_DEFAULT | PAGE_STACK); + K_PANIC( "Error: vmm_findFreePage Failed" ); - /* - * Map Page Tables Into VM Space - * The First Page Table (4MB) Maps To All Page Directories - */ - if (kernelPageDirectory[PD_INDEX(PT_BASE_ADDR)] == 0) { - if ((pageTable = (uint32_t *) vmm_findFreePage( sysID)) == 0x0) - K_PANIC("Error: vmm_findFreePage Failed"); + } - bzero(pageTable, PAGE_SIZE); + // Make Sure The Page Table Is Clean + bzero( pageTable, PAGE_SIZE ); - kernelPageDirectory[PD_INDEX(PT_BASE_ADDR)] = (uint32_t) ((uint32_t) (pageTable) | KERNEL_PAGE_DEFAULT); - } + kernelPageDirectory[1] = ( uint32_t ) ( ( uint32_t ) ( pageTable ) | PAGE_DEFAULT ); - pageTable = (uint32_t *) (kernelPageDirectory[PD_INDEX(PT_BASE_ADDR)] & 0xFFFFF000); + /* + * Create page tables for the top 1GB of VM space. This space is set aside + * for kernel space and will be shared with each process + */ - for (i = 0; i < PD_ENTRIES; i++) { - pageTable[i] = kernelPageDirectory[i]; - } /* end for */ + for( i = PD_INDEX( VMM_KERN_START ); i <= PD_INDEX( VMM_KERN_END ); i++ ) { - /* - * Map Page Directory Into VM Space - * First Page After Page Tables - */ - if (kernelPageDirectory[PD_INDEX(PD_BASE_ADDR)] == 0) { - if ((pageTable = (uint32_t *) vmm_findFreePage( sysID)) == 0x0) - K_PANIC("Error: vmm_findFreePage Failed"); + if( ( pageTable = ( uint32_t * ) vmm_findFreePage( sysID ) ) == 0x0 ) { - bzero(pageTable, PAGE_SIZE); + K_PANIC( "Error: vmm_findFreePage Failed" ); - kernelPageDirectory[PD_INDEX(PD_BASE_ADDR)] = (uint32_t) ((uint32_t) (pageTable) | KERNEL_PAGE_DEFAULT); - } + } - pageTable = (uint32_t *) (kernelPageDirectory[PD_INDEX(PD_BASE_ADDR)] & 0xFFFFF000); - pageTable[0] = (uint32_t) ((uint32_t) (kernelPageDirectory) | KERNEL_PAGE_DEFAULT); + // Make Sure The Page Table Is Clean + bzero( pageTable, PAGE_SIZE ); - /* Allocate New Stack Space */ - if ((pageTable = (uint32_t *) vmm_findFreePage(sysID)) == 0x0) - K_PANIC("ERROR: vmm_findFreePage Failed"); + // Map In The Page Directory + kernelPageDirectory[i] = ( uint32_t ) ( ( uint32_t ) ( pageTable ) | KERNEL_PAGE_DEFAULT | PAGE_GLOBAL ); - /* Now Lets Turn On Paging With This Initial Page Table */ - asm volatile( - "movl %0,%%eax \n" - "movl %%eax,%%cr3 \n" - "movl %%cr0,%%eax \n" - "orl $0x80010000,%%eax \n" /* Turn on memory protection */ - "movl %%eax,%%cr0 \n" - : - : "d"((uint32_t *) (kernelPageDirectory)) - ); + } /* end for */ - /* Remap The Memory List */ - for (i = VMM_MMAP_ADDR_RMODE; i <= (0x101000 + (numPages * sizeof(mMap))); i += 0x1000) { - if ((vmm_remapPage(i, (VMM_MMAP_ADDR_PMODE + (i - 0x101000)), PAGE_DEFAULT, sysID, 0)) == 0x0) - K_PANIC("vmmRemapPage failed\n"); - } + kernelPageDirectory[1023] = ( uint32_t ) ( ( uint32_t ) ( pageTable ) | KERNEL_PAGE_DEFAULT ); + pageTable = ( uint32_t * ) ( kernelPageDirectory[1023] & 0xFFFFF000 ); - /* Set New Address For Memory Map Since Its Relocation */ - vmmMemoryMap = (mMap *) VMM_MMAP_ADDR_PMODE; + pageTable[1023] = ( vmm_findFreePage( sysID ) | KERNEL_PAGE_DEFAULT | PAGE_STACK ); + pageTable[1022] = ( vmm_findFreePage( sysID ) | KERNEL_PAGE_DEFAULT | PAGE_STACK ); - /* Print information on paging */ - kprintf("paging0 - Address: [0x%X], PagingISR Address: [0x%X]\n", kernelPageDirectory, &_vmm_pageFault); + /* + * Map Page Tables Into VM Space + * The First Page Table (4MB) Maps To All Page Directories + */ - /* Return so we know everything went well */ - return (0x0); + if( kernelPageDirectory[PD_INDEX(PT_BASE_ADDR)] == 0 ) { + + if( ( pageTable = ( uint32_t * ) vmm_findFreePage( sysID ) ) == 0x0 ) { + + K_PANIC( "Error: vmm_findFreePage Failed" ); + + } + + bzero( pageTable, PAGE_SIZE ); + + kernelPageDirectory[PD_INDEX( PT_BASE_ADDR )] = ( uint32_t ) ( ( uint32_t ) ( pageTable ) | KERNEL_PAGE_DEFAULT ); + + } + + pageTable = ( uint32_t * ) ( kernelPageDirectory[PD_INDEX( PT_BASE_ADDR )] & 0xFFFFF000 ); + + for( i = 0; i < PD_ENTRIES; i++ ) { + + pageTable[i] = kernelPageDirectory[i]; + + } /* end for */ + + /* + * Map Page Directory Into VM Space + * First Page After Page Tables + */ + if( kernelPageDirectory[PD_INDEX( PD_BASE_ADDR )] == 0 ) { + + if( ( pageTable = ( uint32_t * ) vmm_findFreePage( sysID ) ) == 0x0 ) { + + K_PANIC( "Error: vmm_findFreePage Failed" ); + + } + + bzero( pageTable, PAGE_SIZE ); + + kernelPageDirectory[PD_INDEX( PD_BASE_ADDR )] = ( uint32_t ) ( ( uint32_t ) ( pageTable ) | KERNEL_PAGE_DEFAULT ); + + } + + pageTable = ( uint32_t * ) ( kernelPageDirectory[PD_INDEX( PD_BASE_ADDR )] & 0xFFFFF000 ); + pageTable[0] = ( uint32_t ) ( ( uint32_t ) ( kernelPageDirectory ) | KERNEL_PAGE_DEFAULT ); + + // Allocate New Stack Space + if( ( pageTable = ( uint32_t * ) vmm_findFreePage( sysID ) ) == 0x0 ) { + + K_PANIC( "ERROR: vmm_findFreePage Failed" ); + + } + + // Now Lets Turn On Paging With This Initial Page Table + asm volatile( + "movl %0,%%eax \n" + "movl %%eax,%%cr3 \n" + "movl %%cr0,%%eax \n" + "orl $0x80010000,%%eax \n" /* Turn on memory protection */ + "movl %%eax,%%cr0 \n" + : + : "d"((uint32_t *) (kernelPageDirectory)) + ); + + // Remap The Memory List + for( i = VMM_MMAP_ADDR_RMODE; i <= ( 0x101000 + ( numPages * sizeof( mMap ) ) ); i += 0x1000 ) { + + if( ( vmm_remapPage( i, ( VMM_MMAP_ADDR_PMODE + ( i - 0x101000 ) ), PAGE_DEFAULT, sysID, 0 ) ) == 0x0 ) { + + K_PANIC( "vmmRemapPage failed\n" ); + + } + + } + + // Set New Address For Memory Map Since Its Relocation + vmmMemoryMap = ( mMap * ) VMM_MMAP_ADDR_PMODE; + + // Print information on paging + kprintf( "paging0 - Address: [0x%X], PagingISR Address: [0x%X]\n", kernelPageDirectory, &_vmm_pageFault ); + + // Return so we know everything went well + return( 0x0 ); + } /* END */ /*****************************************************************************************