diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ce0602c --- /dev/null +++ b/.DS_Store Binary files differ diff --git a/doc/.DS_Store b/doc/.DS_Store new file mode 100644 index 0000000..8743fc5 --- /dev/null +++ b/doc/.DS_Store Binary files differ diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index 2d42f1c..58213f4 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -200,7 +200,7 @@ "orl $0x80010000,%%eax \n" /* Turn on memory protection */ "movl %%eax,%%cr0 \n" : - : "d"((uint32_t *) (kernelPageDirectory)) + : "d" ( ( uint32_t * ) ( kernelPageDirectory ) ) ); // Remap The Memory List @@ -236,88 +236,112 @@ 07/28/04 - If perms == 0x0 set to PAGE_DEFAULT *****************************************************************************************/ -int vmm_remapPage(uint32_t source, uint32_t dest, uint16_t perms, pidType pid, int haveLock) { +int vmm_remapPage( uint32_t source, uint32_t dest, uint16_t perms, pidType pid, int haveLock ) { - uint16_t destPageDirectoryIndex = 0x0, destPageTableIndex = 0x0; - uint32_t *pageDir = 0x0, *pageTable = 0x0; + uint16_t destPageDirectoryIndex = 0x0, destPageTableIndex = 0x0; + uint32_t *pageDir = 0x0, *pageTable = 0x0; - short i = 0x0; + short i = 0x0; - if (pid < sysID) - kpanic("Invalid PID %i", pid); + if( pid < sysID ) + kpanic( "Invalid PID %i", pid ); - if (source == 0x0) - K_PANIC("source == 0x0"); + if( source == 0x0 ) + K_PANIC( "source == 0x0" ); - if (dest == 0x0) - K_PANIC("dest == 0x0"); + if( dest == 0x0 ) + K_PANIC( "dest == 0x0" ); - if (haveLock == 0) { - if (dest >= VMM_USER_START && dest <= VMM_USER_END) - spinLock(&rmpSpinLock); - else - spinLock(&pdSpinLock); - } + if( haveLock == 0 ) { - if (perms == 0x0) - perms = KERNEL_PAGE_DEFAULT; + if( dest >= VMM_USER_START && dest <= VMM_USER_END ) { - /* Set Pointer pageDirectory To Point To The Virtual Mapping Of The Page Directory */ - pageDir = (uint32_t *) PD_BASE_ADDR; + spinLock( &rmpSpinLock ); - /* Get Index Into The Page Directory */ - destPageDirectoryIndex = PD_INDEX(dest); + } else { - if ((pageDir[destPageDirectoryIndex] & PAGE_PRESENT) != PAGE_PRESENT) { - //kprintf("[NpdI:0x%X]", destPageDirectoryIndex); - vmm_allocPageTable(destPageDirectoryIndex, pid); - } + spinLock( &pdSpinLock ); - /* Set Address To Page Table */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * destPageDirectoryIndex)); + } - /* Get The Index To The Page Table */ - destPageTableIndex = PT_INDEX(dest); + } - /* If The Page Is Mapped In Free It Before We Remap */ - if ((pageTable[destPageTableIndex] & PAGE_PRESENT) == PAGE_PRESENT) { - kpanic("A Page Is Already Mapped Here: 0x%X:0x%X", dest, destPageTableIndex); + if( perms == 0x0 ) + perms = KERNEL_PAGE_DEFAULT; - if ((pageTable[destPageTableIndex] & PAGE_STACK) == PAGE_STACK) - kprintf("Stack Page: [0x%X]\n", dest); + // Set Pointer pageDirectory To Point To The Virtual Mapping Of The Page Directory + pageDir = ( uint32_t * ) PD_BASE_ADDR; - if ((pageTable[destPageTableIndex] & PAGE_COW) != PAGE_COW) { - kprintf("Page NOT COW\n"); - kprintf("Page Present: [0x%X][0x%X]", dest, pageTable[destPageTableIndex]); - source = 0x0; - goto rmDone; - } + // Get Index Into The Page Directory + destPageDirectoryIndex = PD_INDEX( dest ); - /* Clear The Page First For Security Reasons */ - freePage(((uint32_t) pageTable[destPageTableIndex] & 0xFFFFF000)); + if( ( pageDir[destPageDirectoryIndex] & PAGE_PRESENT ) != PAGE_PRESENT ) { - } + //kprintf("[NpdI:0x%X]", destPageDirectoryIndex); + vmm_allocPageTable( destPageDirectoryIndex, pid ); - /* Set The Source Address In The Destination */ - pageTable[destPageTableIndex] = (uint32_t) (source | perms); + } - /* Reload The Page Table; */ - rmDone: asm volatile( + // Set Address To Page Table + pageTable = ( uint32_t * ) ( PT_BASE_ADDR + ( PAGE_SIZE * destPageDirectoryIndex ) ); + + // Get The Index To The Page Table + destPageTableIndex = PT_INDEX( dest ); + + // If The Page Is Mapped In Free It Before We Remap + if( ( pageTable[destPageTableIndex] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + kpanic( "A Page Is Already Mapped Here: 0x%X:0x%X", dest, destPageTableIndex ); + + if( ( pageTable[destPageTableIndex] & PAGE_STACK ) == PAGE_STACK ) + kprintf( "Stack Page: [0x%X]\n", dest ); + + if( ( pageTable[destPageTableIndex] & PAGE_COW ) != PAGE_COW ) { + + kprintf( "Page NOT COW\n" ); + kprintf( "Page Present: [0x%X][0x%X]", dest, pageTable[destPageTableIndex] ); + + source = 0x0; + + goto rmDone; + + } + + // Clear The Page First For Security Reasons + freePage(((uint32_t) pageTable[destPageTableIndex] & 0xFFFFF000)); + + } + + // Set The Source Address In The Destination + pageTable[destPageTableIndex] = ( uint32_t ) (source | perms); + + // Reload The Page Table; + rmDone: + + asm volatile( "push %eax \n" "movl %cr3,%eax\n" "movl %eax,%cr3\n" "pop %eax \n" - ); + ); - /* Return */ - if (haveLock == 0x0) { - if (dest >= VMM_USER_START && dest <= VMM_USER_END) - spinUnlock(&rmpSpinLock); - else - spinUnlock(&pdSpinLock); - } + // Return + if( haveLock == 0x0 ) { - return (source); + if( dest >= VMM_USER_START && dest <= VMM_USER_END ) { + + spinUnlock( &rmpSpinLock ); + + } else { + + spinUnlock( &pdSpinLock ); + + } + + } + + return( source ); + } /************************************************************************ @@ -329,61 +353,86 @@ 07/30/02 - This Returns A Free Page In The Kernel Space ***********************************************************************/ -void *vmm_getFreeKernelPage(pidType pid, uint16_t count) { - int pdI = 0x0, ptI = 0x0, c = 0, lc = 0; +void *vmm_getFreeKernelPage( pidType pid, uint16_t count ) { - uint32_t *pageDirectory = PD_BASE_ADDR; + int pdI = 0x0, ptI = 0x0, c = 0, lc = 0; - uint32_t *pageTable = 0x0; + uint32_t *pageDirectory = PD_BASE_ADDR; - uint32_t startAddress = 0x0; + uint32_t *pageTable = 0x0; - /* Lock The Page Dir & Tables For All Since Kernel Space Is Shared */ - spinLock(&pdSpinLock); + uint32_t startAddress = 0x0; - /* Lets Search For A Free Page */ - for (pdI = PD_INDEX(VMM_KERN_START); pdI <= PD_INDEX(VMM_KERN_END); pdI++) { + // Lock The Page Dir & Tables For All Since Kernel Space Is Shared + spinLock( &pdSpinLock ); - if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) - if (vmm_allocPageTable(pdI, pid) == -1) - kpanic("Failed To Allocate Page Dir: 0x%X", pdI); + // Lets Search For A Free Page + for( pdI = PD_INDEX( VMM_KERN_START ); pdI <= PD_INDEX( VMM_KERN_END ); pdI++ ) { - /* Set Page Table Address */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * pdI)); + if( ( pageDirectory[pdI] & PAGE_PRESENT ) != PAGE_PRESENT ) + if( vmm_allocPageTable( pdI, pid ) == -1 ) + kpanic( "Failed To Allocate Page Dir: 0x%X", pdI ); - /* Loop Through The Page Table For A Free Page */ - for (ptI = 0; ptI < PT_ENTRIES; ptI++) { + // Set Page Table Address + pageTable = ( uint32_t * ) ( PT_BASE_ADDR + ( PAGE_SIZE * pdI ) ); - /* Check For Unalocated Page */ - if ((pageTable[ptI] & PAGE_PRESENT) != PAGE_PRESENT) { - if (startAddress == 0x0) - startAddress = ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (ptI * PAGE_SIZE)); - c++; - } else { - startAddress = 0x0; - c = 0; - } + // Loop Through The Page Table For A Free Page + for( ptI = 0; ptI < PT_ENTRIES; ptI++ ) { - if (c == count) - goto gotPages; + // Check For Unalocated Page + if( ( pageTable[ptI] & PAGE_PRESENT ) != PAGE_PRESENT ) { - } - } + if( startAddress == 0x0 ) { - startAddress = 0x0; - goto noPagesAvail; + startAddress = ( ( pdI * ( PD_ENTRIES * PAGE_SIZE ) ) + ( ptI * PAGE_SIZE ) ); - gotPages: for (c = 0; c < count; c++) { - if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), (startAddress + (PAGE_SIZE * c)), KERNEL_PAGE_DEFAULT, pid, 1)) == 0x0) - K_PANIC("vmmRemapPage failed: gfkp-1\n"); + } - vmm_clearVirtualPage((uint32_t) (startAddress + (PAGE_SIZE * c))); + c++; - } + } else { - noPagesAvail: spinUnlock(&pdSpinLock); + startAddress = 0x0; - return (startAddress); + c = 0; + + } + + + if ( c == count ) { + + goto gotPages; + + } + + + } + + } + + startAddress = 0x0; + goto noPagesAvail; + + gotPages: + + for( c = 0; c < count; c++ ) { + + if( (vmm_remapPage( ( uint32_t ) vmm_findFreePage( pid ), ( startAddress + ( PAGE_SIZE * c ) ), KERNEL_PAGE_DEFAULT, pid, 1 ) ) == 0x0 ) { + + K_PANIC("vmmRemapPage failed: gfkp-1\n"); + + } + + vmm_clearVirtualPage( ( uint32_t ) ( startAddress + ( PAGE_SIZE * c ) ) ); + + } + + noPagesAvail: + + spinUnlock( &pdSpinLock ); + + return( startAddress ); + } /************************************************************************ @@ -395,287 +444,390 @@ Notes: ************************************************************************/ -int vmm_clearVirtualPage(uint32_t pageAddr) { - uint32_t *src = 0x0; - int counter = 0x0; +int vmm_clearVirtualPage( uint32_t pageAddr ) { - /* Set Source Pointer To Virtual Page Address */ - src = (uint32_t *) pageAddr; + uint32_t *src = 0x0; - /* Clear Out The Page */ - for (counter = 0x0; counter < PD_ENTRIES; counter++) { - src[counter] = (uint32_t) 0x0; - } + int counter = 0x0; - /* Return */ - return (0x0); + // Set Source Pointer To Virtual Page Address + src = ( uint32_t * ) pageAddr; + + // Clear Out The Page + for( counter = 0x0; counter < PD_ENTRIES; counter++ ) { + + src[counter] = ( uint32_t ) 0x0; + + } + + // Return + return( 0x0 ); + } -void *vmm_mapFromTask(pidType pid, void *ptr, uint32_t size) { - kTask_t *child = 0x0; - uint32_t i = 0x0, x = 0x0, y = 0x0, count = ((size + 4095) / 0x1000), c = 0x0; - uInt32 dI = 0x0, tI = 0x0; - uint32_t baseAddr = 0x0, offset = 0x0; - uint32_t *childPageDir = (uint32_t *) 0x5A00000; - uint32_t *childPageTable = 0x0; - uint32_t *pageTableSrc = 0x0; - offset = (uint32_t) ptr & 0xFFF; - baseAddr = (uint32_t) ptr & 0xFFFFF000; - child = schedFindTask(pid); - //Calculate The Page Table Index And Page Directory Index - dI = (baseAddr / (1024 * 4096)); - tI = ((baseAddr - (dI * (1024 * 4096))) / 4096); +void *vmm_mapFromTask( pidType pid, void *ptr, uint32_t size ) { - kprintf("cr3: 0x%X\n", child->tss.cr3); - if (vmm_remapPage(child->tss.cr3, 0x5A00000, KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) - K_PANIC("vmm_remapPage: Failed"); + kTask_t *child = 0x0; - for (i = 0; i < PD_ENTRIES; i++) { + uint32_t i = 0x0, x = 0x0, y = 0x0, count = ((size + 4095) / 0x1000), c = 0x0; + uInt32 dI = 0x0, tI = 0x0; + uint32_t baseAddr = 0x0, offset = 0x0; + uint32_t *childPageDir = (uint32_t *) 0x5A00000; + uint32_t *childPageTable = 0x0; + uint32_t *pageTableSrc = 0x0; - if ((childPageDir[i] & PAGE_PRESENT) == PAGE_PRESENT) { - //kprintf("mapping: 0x%X\n", i); - if (vmm_remapPage(childPageDir[i], 0x5A01000 + (i * 0x1000), KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) - K_PANIC("Returned NULL"); - } - } - kprintf("mapping completed\n"); - //for (x = (_current->oInfo.vmStart / (1024 * 4096)); x < 1024; x++) { - for (x = PD_INDEX(VMM_KERN_START); x < PD_INDEX(VMM_KERN_END); x++) { - //kpanic("v_mFT"); - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (4096 * x)); + offset = ( uint32_t ) ptr & 0xFFF; - for (y = 0; y < 1024; y++) { + baseAddr = ( uint32_t ) ptr & 0xFFFFF000; - //Loop Through The Page Table Find An UnAllocated Page - if ((uint32_t) pageTableSrc[y] == (uint32_t) 0x0) { + child = schedFindTask( pid ); - if (count > 1) { + // Calculate The Page Table Index And Page Directory Index + dI = ( baseAddr / ( 1024 * 4096 ) ); + tI = ( ( baseAddr - ( dI * ( 1024 * 4096 ) ) ) / 4096 ); - for (c = 0; ((c < count) && (y + c < 1024)); c++) { + kprintf( "cr3: 0x%X\n", child->tss.cr3 ); - if ((uint32_t) pageTableSrc[y + c] != (uint32_t) 0x0) { + if( vmm_remapPage( child->tss.cr3, 0x5A00000, KERNEL_PAGE_DEFAULT, _current->id, 0 ) == 0x0 ) + K_PANIC("vmm_remapPage: Failed"); - c = -1; - break; + for( i = 0; i < PD_ENTRIES; i++ ) { - } + if( ( childPageDir[i] & PAGE_PRESENT ) == PAGE_PRESENT ) { - } + //kprintf("mapping: 0x%X\n", i); - if (c != -1) { + if( vmm_remapPage( childPageDir[i], 0x5A01000 + (i * 0x1000 ), KERNEL_PAGE_DEFAULT, _current->id, 0 ) == 0x0 ) + K_PANIC( "Returned NULL" ); - for (c = 0; c < count; c++) { + } - if ((tI + c) >= 0x1000) { + } - dI++; - tI = 0 - c; + kprintf( "mapping completed\n" ); - } + //for (x = (_current->oInfo.vmStart / (1024 * 4096)); x < 1024; x++) { + for( x = PD_INDEX( VMM_KERN_START ); x < PD_INDEX( VMM_KERN_END ); x++ ) { - if ((childPageDir[dI] & PAGE_PRESENT) == PAGE_PRESENT) { - //kprintf("dI: 0x%X\n", dI); - childPageTable = (uint32_t *) (0x5A01000 + (0x1000 * dI)); + //kpanic("v_mFT"); + pageTableSrc = ( uint32_t * ) ( PT_BASE_ADDR + ( 4096 * x ) ); - if ((childPageTable[tI + c] & PAGE_PRESENT) == PAGE_PRESENT) { - if (vmm_remapPage(childPageTable[tI + c], ((x * (1024 * 4096)) + ((y + c) * 4096)), KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) - K_PANIC("remap == NULL"); - } - } + for( y = 0; y < 1024; y++ ) { - } + //Loop Through The Page Table Find An UnAllocated Page + if( ( uint32_t ) pageTableSrc[y] == ( uint32_t ) 0x0 ) { - vmm_unmapPage(0x5A00000, 1); + if( count > 1 ) { - for (i = 0; i < 0x1000; i++) { - vmm_unmapPage((0x5A01000 + (i * 0x1000)), 1); - } + for( c = 0; ( ( c < count ) && ( y + c < 1024 ) ); c++ ) { - return ((void *) ((x * (1024 * 4096)) + (y * 4096) + offset)); + if( ( uint32_t ) pageTableSrc[y + c] != ( uint32_t ) 0x0 ) { - } + c = -1; - } else { + break; - //Map A Physical Page To The Virtual Page - childPageTable = (uint32_t *) (0x5A01000 + (0x1000 * dI)); - if ((childPageDir[dI] & PAGE_PRESENT) == PAGE_PRESENT) { - //kprintf("eDI: 0x%X", dI); - if ((childPageTable[tI] & PAGE_PRESENT) == PAGE_PRESENT) { - if (vmm_remapPage(childPageTable[tI], ((x * (1024 * 4096)) + (y * 4096)), KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) - K_PANIC("remap Failed"); - } - } + } - //Return The Address Of The Mapped In Memory - vmm_unmapPage(0x5A00000, 1); + } - for (i = 0; i < 0x1000; i++) { - vmm_unmapPage((0x5A01000 + (i * 0x1000)), 1); - } + if( c != -1 ) { - return ((void *) ((x * (1024 * 4096)) + (y * 4096) + offset)); + for( c = 0; c < count; c++ ) { - } + if( ( tI + c ) >= 0x1000 ) { - } + dI++; - } + tI = 0 - c; // XXX - How can I do negative when this is unsigned? - } + } - return (0x0); + if( ( childPageDir[dI] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + //kprintf("dI: 0x%X\n", dI); + childPageTable = ( uint32_t * ) ( 0x5A01000 + ( 0x1000 * dI ) ); + + if( ( childPageTable[tI + c] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + if( vmm_remapPage( childPageTable[tI + c], ( ( x * ( 1024 * 4096 ) ) + ( ( y + c ) * 4096 ) ), KERNEL_PAGE_DEFAULT, _current->id, 0 ) == 0x0 ) + K_PANIC( "remap == NULL" ); + + } + + } + + } + + vmm_unmapPage( 0x5A00000, 1 ); + + for( i = 0; i < 0x1000; i++ ) { + + vmm_unmapPage( ( 0x5A01000 + ( i * 0x1000 ) ), 1 ); + + } + + return( ( void * ) ( ( x * ( 1024 * 4096 ) ) + ( y * 4096 ) + offset ) ); + + } + + } else { + + // Map A Physical Page To The Virtual Page + childPageTable = ( uint32_t * ) ( 0x5A01000 + ( 0x1000 * dI ) ); + + if( ( childPageDir[dI] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + //kprintf("eDI: 0x%X", dI); + + if( ( childPageTable[tI] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + if( vmm_remapPage( childPageTable[tI], ( ( x * (1024 * 4096 ) ) + ( y * 4096 ) ), KERNEL_PAGE_DEFAULT, _current->id, 0 ) == 0x0 ) + K_PANIC( "remap Failed" ); + + } + + } + + // Return The Address Of The Mapped In Memory + vmm_unmapPage( 0x5A00000, 1 ); + + for( i = 0; i < 0x1000; i++ ) { + + vmm_unmapPage( ( 0x5A01000 + ( i * 0x1000 ) ), 1 ); + + } + + return( ( void * ) ( ( x * ( 1024 * 4096 ) ) + ( y * 4096 ) + offset ) ); + + } + + } + + } + + } + + return( 0x0 ); + } -void *vmm_getFreeMallocPage(uInt16 count) { - uInt16 x = 0x0, y = 0x0; - int c = 0x0; - uint32_t *pageTableSrc = 0x0; - uint32_t *pageDirectory = 0x0; +void *vmm_getFreeMallocPage( uInt16 count ) { - pageDirectory = (uint32_t *) PD_BASE_ADDR; + uInt16 x = 0x0, y = 0x0; - spinLock(&fkpSpinLock); + int c = 0x0; - /* Lets Search For A Free Page */ - 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 */ - vmm_allocPageTable(x, sysID); + uint32_t *pageTableSrc = 0x0; - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * x)); + uint32_t *pageDirectory = 0x0; - for (y = 0; y < 1024; y++) { - /* Loop Through The Page Table Find An UnAllocated Page */ - if ((uint32_t) pageTableSrc[y] == (uint32_t) 0x0) { - if (count > 1) { - for (c = 0; c < count; c++) { - if (y + c < 1024) { - if ((uint32_t) pageTableSrc[y + c] != (uint32_t) 0x0) { - c = -1; - break; - } - } - } - if (c != -1) { - for (c = 0; c < count; c++) { - if (vmm_remapPage((uint32_t) vmm_findFreePage( sysID), ((x * 0x400000) + ((y + c) * 0x1000)), KERNEL_PAGE_DEFAULT, sysID, 0) == 0x0) - K_PANIC("remap Failed"); + pageDirectory = ( uint32_t * ) PD_BASE_ADDR; - vmm_clearVirtualPage((uint32_t) ((x * 0x400000) + ((y + c) * 0x1000))); - } - spinUnlock(&fkpSpinLock); - return ((void *) ((x * (PAGE_SIZE * PD_ENTRIES)) + (y * PAGE_SIZE))); - } - } else { - /* Map A Physical Page To The Virtual Page */ - if (vmm_remapPage((uint32_t) vmm_findFreePage( sysID), ((x * 0x400000) + (y * 0x1000)), KERNEL_PAGE_DEFAULT, sysID, 0) == 0x0) - K_PANIC("Failed"); + spinLock( &fkpSpinLock ); - /* Clear This Page So No Garbage Is There */ - vmm_clearVirtualPage((uint32_t) ((x * 0x400000) + (y * 0x1000))); - /* Return The Address Of The Newly Allocate Page */ - spinUnlock(&fkpSpinLock); - return ((void *) ((x * (PAGE_SIZE * PD_ENTRIES)) + (y * PAGE_SIZE))); - } - } - } - } - /* If No Free Page Was Found Return NULL */ - spinUnlock(&fkpSpinLock); - return (0x0); + // Lets Search For A Free Page + 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 */ + vmm_allocPageTable( x, sysID ); + + pageTableSrc = ( uint32_t * ) ( PT_BASE_ADDR + ( PAGE_SIZE * x ) ); + + for( y = 0; y < 1024; y++ ) { + + // Loop Through The Page Table Find An UnAllocated Page + if( ( uint32_t ) pageTableSrc[y] == ( uint32_t ) 0x0 ) { + + if( count > 1 ) { + + for( c = 0; c < count; c++ ) { + + if( y + c < 1024 ) { + + if( ( uint32_t ) pageTableSrc[y + c] != ( uint32_t ) 0x0 ) { + + c = -1; + + break; + + } + + } else { // If it goes past the end of the page table break and loop + + c = -1; + + break; + } + + } + + if( c != -1 ) { + + for( c = 0; c < count; c++ ) { + + if( vmm_remapPage( ( uint32_t ) vmm_findFreePage( sysID ), ( ( x * 0x400000 ) + ( ( y + c ) * 0x1000 ) ), KERNEL_PAGE_DEFAULT, sysID, 0 ) == 0x0 ) + K_PANIC( "remap Failed" ); + + vmm_clearVirtualPage( ( uint32_t ) ( ( x * 0x400000 ) + ( ( y + c ) * 0x1000 ) ) ); + + } + + spinUnlock( &fkpSpinLock ); + + return( ( void * ) ( ( x * ( PAGE_SIZE * PD_ENTRIES ) ) + ( y * PAGE_SIZE ) ) ); + + } + + } else { + + // Map A Physical Page To The Virtual Page + if( vmm_remapPage( ( uint32_t ) vmm_findFreePage( sysID ), ( ( x * 0x400000 ) + ( y * 0x1000 ) ), KERNEL_PAGE_DEFAULT, sysID, 0 ) == 0x0 ) + K_PANIC( "Failed" ); + + // Clear This Page So No Garbage Is There + vmm_clearVirtualPage( (uint32_t ) ( ( x * 0x400000 ) + ( y * 0x1000 ) ) ); + + // Return The Address Of The Newly Allocate Page + spinUnlock( &fkpSpinLock ); + + return( ( void * ) ( ( x * ( PAGE_SIZE * PD_ENTRIES ) ) + ( y * PAGE_SIZE ) ) ); + + } + + } + + } + + } + + // If No Free Page Was Found Return NULL + spinUnlock( &fkpSpinLock ); + return( 0x0 ); + } -int obreak(struct thread *td, struct obreak_args *uap) { - uint32_t i = 0x0; - vm_offset_t old = 0x0; - vm_offset_t base = 0x0; - vm_offset_t new = 0x0; +int obreak( struct thread *td, struct obreak_args *uap ) { - /* - #ifdef _VMM_DEBUG - */ - kprintf("vm_offset_t: [%i]\n", sizeof(vm_offset_t)); - kprintf("nsize: [0x%X]\n", uap->nsize); - kprintf("vm_daddr: [0x%X]\n", td->vm_daddr); - kprintf("vm_dsize: [0x%X]\n", td->vm_dsize); - kprintf("total: [0x%X]\n", td->vm_daddr + td->vm_dsize); - /* - #endif - */ + uint32_t i = 0x0; - new = round_page((vm_offset_t )uap->nsize); + vm_offset_t old = 0x0; + vm_offset_t base = 0x0; + vm_offset_t new = 0x0; - base = round_page((vm_offset_t ) td->vm_daddr); - old = base + ctob(td->vm_dsize); + /* + * #ifdef _VMM_DEBUG + */ + kprintf( "vm_offset_t: [%i]\n", sizeof( vm_offset_t ) ); + kprintf( "nsize: [0x%X]\n", uap->nsize ); + kprintf( "vm_daddr: [0x%X]\n", td->vm_daddr ); + kprintf( "vm_dsize: [0x%X]\n", td->vm_dsize ); + kprintf( "total: [0x%X]\n", td->vm_daddr + td->vm_dsize ); - if (new < base) - K_PANIC("EINVAL"); + /* + * #endif + */ - if (new > old) { - for (i = old; i < new; i += 0x1000) { - if (vmm_remapPage(vmm_findFreePage(_current->id), i, PAGE_DEFAULT, _current->id, 0) == 0x0) - K_PANIC("remap Failed"); - } - td->vm_dsize += btoc(new - old); - } else if (new < old) { - K_PANIC("new < old"); - td->vm_dsize -= btoc(old - new); - } + new = round_page( ( vm_offset_t )uap->nsize ); - return (0x0); + base = round_page( (vm_offset_t ) td->vm_daddr ); + + old = base + ctob( td->vm_dsize ); + + if( new < base ) + K_PANIC( "EINVAL" ); + + if( new > old ) { + + for( i = old; i < new; i += 0x1000 ) { + + if( vmm_remapPage( vmm_findFreePage( _current->id ), i, PAGE_DEFAULT, _current->id, 0 ) == 0x0 ) + K_PANIC( "remap Failed" ); + + } + + td->vm_dsize += btoc( new - old ); + + } else if( new < old ) { + + K_PANIC( "new < old" ); + + td->vm_dsize -= btoc( old - new ); + + } + + return( 0x0 ); + } -int vmm_cleanVirtualSpace(uint32_t addr) { - int x = 0x0; - int y = 0x0; +int vmm_cleanVirtualSpace( uint32_t addr ) { - uint32_t *pageTableSrc = 0x0; - uint32_t *pageDir = 0x0; + int x = 0x0; + int y = 0x0; - pageDir = (uint32_t *) PD_BASE_ADDR; + uint32_t *pageTableSrc = 0x0; + uint32_t *pageDir = 0x0; - for (x = (addr / (PD_ENTRIES * PAGE_SIZE)); x <= PD_INDEX(VMM_USER_END); x++) { - if ((pageDir[x] & PAGE_PRESENT) == PAGE_PRESENT) { - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * x)); + pageDir = ( uint32_t * ) PD_BASE_ADDR; - for (y = 0; y < PT_ENTRIES; y++) { - if ((pageTableSrc[y] & PAGE_PRESENT) == PAGE_PRESENT) { - if ((pageTableSrc[y] & PAGE_COW) == PAGE_COW) { - adjustCowCounter(((uint32_t) pageTableSrc[y] & 0xFFFFF000), -1); - pageTableSrc[y] = 0x0; - } - /* - else if ((pageTableSrc[y] & PAGE_STACK) == PAGE_STACK) { - //TODO: We need to fix this so we can clean the stack! - //kprintf("Page Stack!: 0x%X", (x * 0x400000) + (y * 0x1000)); - // pageTableSrc[y] = 0x0; - //MrOlsen (2016-01-18) NOTE: WHat should I Do Here? kprintf( "STACK: (%i:%i)", x, y ); - } - */ - else { - /* - int vmmMemoryMapIndex = ((pageTableSrc[y] & 0xFFFFF000) / 4096); - vmmMemoryMap[vmmMemoryMapIndex].cowCounter = 0x0; - vmmMemoryMap[vmmMemoryMapIndex].pid = vmmID; - vmmMemoryMap[vmmMemoryMapIndex].status = memAvail; - systemVitals->freePages++; - */ - pageTableSrc[y] = 0x0; - } - } - } - } - } + for( x = ( addr / ( PD_ENTRIES * PAGE_SIZE ) ); x <= PD_INDEX( VMM_USER_END ); x++ ) { - asm( + if( ( pageDir[x] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + pageTableSrc = ( uint32_t * ) ( PT_BASE_ADDR + ( PAGE_SIZE * x ) ); + + for( y = 0; y < PT_ENTRIES; y++ ) { + + if( ( pageTableSrc[y] & PAGE_PRESENT ) == PAGE_PRESENT ) { + + if( ( pageTableSrc[y] & PAGE_COW ) == PAGE_COW ) { + + adjustCowCounter( ( ( uint32_t ) pageTableSrc[y] & 0xFFFFF000 ), -1 ); + + pageTableSrc[y] = 0x0; + + } + + /* + else if ((pageTableSrc[y] & PAGE_STACK) == PAGE_STACK) { + //TODO: We need to fix this so we can clean the stack! + //kprintf("Page Stack!: 0x%X", (x * 0x400000) + (y * 0x1000)); + // pageTableSrc[y] = 0x0; + //MrOlsen (2016-01-18) NOTE: WHat should I Do Here? kprintf( "STACK: (%i:%i)", x, y ); + } + */ + else { + /* + int vmmMemoryMapIndex = ((pageTableSrc[y] & 0xFFFFF000) / 4096); + vmmMemoryMap[vmmMemoryMapIndex].cowCounter = 0x0; + vmmMemoryMap[vmmMemoryMapIndex].pid = vmmID; + vmmMemoryMap[vmmMemoryMapIndex].status = memAvail; + systemVitals->freePages++; + */ + + pageTableSrc[y] = 0x0; + + } + + } + + } + + } + + } + + + asm( "movl %cr3,%eax\n" "movl %eax,%cr3\n" - ); + ); - #ifdef VMM_DEBUG - kprintf("Here!?"); - #endif + #ifdef VMM_DEBUG + kprintf("Here!?"); + #endif - return (0x0); + return( 0x0 ); + }