#include <vmm/vmm.h> #include <vmm/paging.h> #include <ubixos/spinlock.h> #include <string.h> 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 */ if( ( pdI >= PD_INDEX( VMM_USER_START ) ) && ( pdI <= PD_INDEX( VMM_USER_END ) ) ) { pageDirectory[pdI] = ( uint32_t ) vmm_findFreePage( pid ) | PAGE_DEFAULT; } else { pageDirectory[pdI] = ( uint32_t ) vmm_findFreePage( pid ) | KERNEL_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_PRESENT ) { 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 ); }