diff --git a/sys/vmm/setpageattributes.c b/sys/vmm/setpageattributes.c index 05fecd3..5926ebc 100644 --- a/sys/vmm/setpageattributes.c +++ b/sys/vmm/setpageattributes.c @@ -37,31 +37,36 @@ Notes: ************************************************************************/ -int vmm_setPageAttributes(uint32_t memAddr, uint16_t attributes) { - uint16_t directoryIndex = 0x0, tableIndex = 0x0; - uint32_t *pageTable = 0x0; +int vmm_setPageAttributes( uint32_t memAddr, uint16_t attributes ) { - /* Calculate The Page Directory Index */ - directoryIndex = (memAddr >> 22); + uint16_t directoryIndex = 0x0; + uint16_t tableIndex = 0x0; - /* Calculate The Page Table Index */ - tableIndex = ((memAddr >> 12) & 0x3FF); + uint32_t *pageTable = 0x0; - /* Set Table Pointer */ - if ((pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * directoryIndex))) == 0x0) - kpanic("Error: pageTable == NULL, File: %s, Line: %i\n", __FILE__, __LINE__); + // Calculate The Page Directory Index + directoryIndex = ( memAddr >> 22 ); - /* Set Attribute If Page Is Mapped */ - if (pageTable[tableIndex] != 0x0) - pageTable[tableIndex] = ((pageTable[tableIndex] & 0xFFFFF000) | attributes); + // Calculate The Page Table Index + tableIndex = ( ( memAddr >> 1 ) & 0x3FF ); - /* Reload The Page Table; */ - asm volatile( - "push %eax \n" - "movl %cr3,%eax\n" - "movl %eax,%cr3\n" - "pop %eax \n" - ); - /* Return */ - return (0x0); + // Set Table Pointer + if( ( pageTable = ( uint32_t * ) ( PT_BASE_ADDR + ( 0x1000 * directoryIndex ) ) ) == 0x0 ) + kpanic( "Error: pageTable == NULL, File: %s, Line: %i\n", __FILE__, __LINE__ ); + + // Set Attribute If Page Is Mapped + if( pageTable[tableIndex] != 0x0 ) + pageTable[tableIndex] = ( ( pageTable[tableIndex] & 0xFFFFF000 ) | attributes ); + + // Reload The Page Table; + asm volatile( + "push %eax \n" + "movl %cr3,%eax\n" + "movl %eax,%cr3\n" + "pop %eax \n" + ); + + // Return + return( 0x0 ); + } diff --git a/sys/vmm/unmappage.c b/sys/vmm/unmappage.c index dd77cb0..87e344d 100644 --- a/sys/vmm/unmappage.c +++ b/sys/vmm/unmappage.c @@ -27,6 +27,7 @@ */ #include +#include /************************************************************************ @@ -45,40 +46,50 @@ To Create A New Virtual Space So Now It Has A Flag ************************************************************************/ -void vmm_unmapPage(uint32_t pageAddr, unmapFlags_t flags) { - int pageDirectoryIndex = 0, pageTableIndex = 0; - uint32_t *pageTable = 0x0; - uint32_t *pageDirectory = 0x0; +void vmm_unmapPage( uint32_t pageAddr, unmapFlags_t flags ) { - pageDirectory = PD_BASE_ADDR; + int pageDirectoryIndex = 0; + int pageTableIndex = 0; - /* Get The Index To The Page Directory */ - pageDirectoryIndex = (pageAddr >> 22); + uint32_t *pageTable = 0x0; + uint32_t *pageDirectory = 0x0; - if ((pageDirectory[pageDirectoryIndex] & PAGE_PRESENT) != PAGE_PRESENT) - return; + pageDirectory = PD_BASE_ADDR; - //Calculate The Page Table Index - pageTableIndex = ((pageAddr >> 12) & 0x3FF); + // Get The Index To The Page Directory + pageDirectoryIndex = ( pageAddr >> 22 ); - /* Set pageTable To The Virtual Address Of Table */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + if( ( pageDirectory[pageDirectoryIndex] & PAGE_PRESENT ) != PAGE_PRESENT ) { - /* Free The Physical Page If Flags Is 0 */ - if (flags == 0) - freePage((uint32_t) (pageTable[pageTableIndex] & 0xFFFFF000)); + kprintf( "Attemped to unmap non-mapped page: [0x%X]", pageAddr ); - /* Unmap The Page */ - pageTable[pageTableIndex] = 0x0; + return; - /* Rehash The Page Directory */ - asm volatile( - "movl %cr3,%eax\n" - "movl %eax,%cr3\n" - ); + } - /* Return */ - return; + // Calculate The Page Table Index + pageTableIndex = ( ( pageAddr >> 12 ) & 0x3FF ); + + // Set pageTable To The Virtual Address Of Table + pageTable = ( uint32_t * ) ( PT_BASE_ADDR + ( 0x1000 * pageDirectoryIndex ) ); + + // Free The Physical Page If Flags Is 0 + if( flags == 0 ) + freePage( ( uint32_t ) ( pageTable[pageTableIndex] & 0xFFFFF000 ) ); + + // Unmap The Page + pageTable[pageTableIndex] = 0x0; + + // Rehash The Page Directory + asm volatile( + "movl %cr3,%eax\n" + "movl %eax,%cr3\n" + ); + + // Return + + return; + } /************************************************************************ @@ -98,17 +109,24 @@ To Create A New Virtual Space So Now It Has A Flag ************************************************************************/ -void vmm_unmapPages(void *ptr, uint32_t size, unmapFlags_t flags) { - uInt32 baseAddr = (uInt32) ptr & 0xFFFFF000; - uInt32 dI = 0x0, tI = 0x0; - uInt32 y = 0x0; - uInt32 *pageTable = 0x0; +void vmm_unmapPages( void *ptr, uint32_t size, unmapFlags_t flags ) { - dI = (baseAddr / (1024 * 4096)); - tI = ((baseAddr - (dI * (1024 * 4096))) / 4096); - pageTable = (uInt32 *) (PT_BASE_ADDR + (4096 * dI)); - for (y = tI; y < (tI + ((size + 4095) / 4096)); y++) { - pageTable[y] = 0x0; - } - return; + uInt32 baseAddr = ( uInt32 ) ptr & 0xFFFFF000; + uInt32 dI = 0x0; + uInt32 tI = 0x0; + uInt32 y = 0x0; + uInt32 *pageTable = 0x0; + + dI = ( baseAddr / ( 1024 * 4096 ) ); + tI = ( ( baseAddr - ( dI * ( 1024 * 4096 ) ) ) / 4096 ); + pageTable = ( uInt32 * ) ( PT_BASE_ADDR + ( 4096 * dI ) ); + + for( y = tI; y < ( tI + ( ( size + 4095 ) / 4096 ) ); y++ ) { + + pageTable[y] = 0x0; + + } + + return; + }