X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmm_virt.c;h=868fe86a55d2039c64e8ca52558fe0de84378dfa;hb=bd5e8623e509a443d7d6e1b959b79f85b0c285b7;hp=bd7b1dff66adb4474783db55a1d589fcf7d80857;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/mm_virt.c b/KernelLand/Kernel/arch/x86/mm_virt.c index bd7b1dff..868fe86a 100644 --- a/KernelLand/Kernel/arch/x86/mm_virt.c +++ b/KernelLand/Kernel/arch/x86/mm_virt.c @@ -171,6 +171,7 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) && gaPageTable[Addr>>12] & PF_COW ) { tPAddr paddr; + __asm__ __volatile__ ("sti"); if(MM_GetRefCount( gaPageTable[Addr>>12] & ~0xFFF ) == 1) { gaPageTable[Addr>>12] &= ~PF_COW; @@ -197,6 +198,7 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) // If it was a user, tell the thread handler if(ErrorCode & 4) { + __asm__ __volatile__ ("sti"); Log_Warning("MMVirt", "User %s %s memory%s", (ErrorCode&2?"write to":"read from"), (ErrorCode&1?"bad/locked":"non-present"), @@ -412,13 +414,14 @@ void MM_Deallocate(tVAddr VAddr) * \fn tPAddr MM_GetPhysAddr(tVAddr Addr) * \brief Checks if the passed address is accesable */ -tPAddr MM_GetPhysAddr(tVAddr Addr) +tPAddr MM_GetPhysAddr(const void *Addr) { - if( !(gaPageDir[Addr >> 22] & 1) ) + tVAddr addr = (tVAddr)Addr; + if( !(gaPageDir[addr >> 22] & 1) ) return 0; - if( !(gaPageTable[Addr >> 12] & 1) ) + if( !(gaPageTable[addr >> 12] & 1) ) return 0; - return (gaPageTable[Addr >> 12] & ~0xFFF) | (Addr & 0xFFF); + return (gaPageTable[addr >> 12] & ~0xFFF) | (addr & 0xFFF); } /** @@ -439,7 +442,8 @@ int MM_Map(tVAddr VAddr, tPAddr PAddr) //ENTER("xVAddr xPAddr", VAddr, PAddr); // Sanity check if( PAddr & 0xFFF || VAddr & 0xFFF ) { - Log_Warning("MM_Virt", "MM_Map - Physical or Virtual Addresses are not aligned"); + Log_Warning("MM_Virt", "MM_Map - Physical or Virtual Addresses are not aligned (0x%P and %p)", + PAddr, VAddr); //LEAVE('i', 0); return 0; } @@ -691,9 +695,9 @@ tPAddr MM_Clone(int bNoUserCopy) MM_RefPhys( gaTmpTable[i*1024+j] & ~0xFFF ); - tmp = (void *) MM_MapTemp( gaTmpTable[i*1024+j] & ~0xFFF ); + tmp = MM_MapTemp( gaTmpTable[i*1024+j] & ~0xFFF ); memcpy( tmp, (void *)( (i*1024+j)*0x1000 ), 0x1000 ); - MM_FreeTemp( (Uint)tmp ); + MM_FreeTemp( tmp ); } } @@ -714,7 +718,8 @@ tVAddr MM_NewKStack(void) for(base = MM_KERNEL_STACKS; base < MM_KERNEL_STACKS_END; base += MM_KERNEL_STACK_SIZE) { // Check if space is free - if(MM_GetPhysAddr(base) != 0) continue; + if(MM_GetPhysAddr( (void*) base) != 0) + continue; // Allocate //for(i = MM_KERNEL_STACK_SIZE; i -= 0x1000 ; ) for(i = 0; i < MM_KERNEL_STACK_SIZE; i += 0x1000 ) @@ -801,9 +806,9 @@ tVAddr MM_NewWorkerStack(Uint *StackContents, size_t ContentsSize) // NOTE: Max of 1 page // `page` is the last allocated page from the previious for loop - tmpPage = MM_MapTemp( page ); + tmpPage = (tVAddr)MM_MapTemp( page ); memcpy( (void*)( tmpPage + (0x1000 - ContentsSize) ), StackContents, ContentsSize); - MM_FreeTemp(tmpPage); + MM_FreeTemp( (void*)tmpPage ); //Log("MM_NewWorkerStack: RETURN 0x%x", base); return base + WORKER_STACK_SIZE; @@ -932,7 +937,7 @@ int MM_IsValidBuffer(tVAddr Addr, size_t Size) tPAddr MM_DuplicatePage(tVAddr VAddr) { tPAddr ret; - Uint temp; + void *temp; int wasRO = 0; //ENTER("xVAddr", VAddr); @@ -957,7 +962,7 @@ tPAddr MM_DuplicatePage(tVAddr VAddr) // Copy Data temp = MM_MapTemp(ret); - memcpy( (void*)temp, (void*)VAddr, 0x1000 ); + memcpy( temp, (void*)VAddr, 0x1000 ); MM_FreeTemp(temp); // Restore Writeable status @@ -973,7 +978,7 @@ tPAddr MM_DuplicatePage(tVAddr VAddr) * \brief Create a temporary memory mapping * \todo Show Luigi Barone (C Lecturer) and see what he thinks */ -tVAddr MM_MapTemp(tPAddr PAddr) +void * MM_MapTemp(tPAddr PAddr) { int i; @@ -996,7 +1001,7 @@ tVAddr MM_MapTemp(tPAddr PAddr) INVLPG( TEMP_MAP_ADDR + (i << 12) ); //LEAVE('p', TEMP_MAP_ADDR + (i << 12)); Mutex_Release( &glTempMappings ); - return TEMP_MAP_ADDR + (i << 12); + return (void*)( TEMP_MAP_ADDR + (i << 12) ); } Mutex_Release( &glTempMappings ); Threads_Yield(); // TODO: Use a sleep queue here instead @@ -1007,9 +1012,9 @@ tVAddr MM_MapTemp(tPAddr PAddr) * \fn void MM_FreeTemp(tVAddr PAddr) * \brief Free's a temp mapping */ -void MM_FreeTemp(tVAddr VAddr) +void MM_FreeTemp(void *VAddr) { - int i = VAddr >> 12; + int i = (tVAddr)VAddr >> 12; //ENTER("xVAddr", VAddr); if(i >= (TEMP_MAP_ADDR >> 12)) @@ -1066,21 +1071,20 @@ tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number) */ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) { - tPAddr maxCheck = (1 << MaxBits); tPAddr phys; tVAddr ret; ENTER("iPages iMaxBits pPhysAddr", Pages, MaxBits, PhysAddr); + if(MaxBits == -1) + MaxBits = PHYS_BITS; + // Sanity Check if(MaxBits < 12 || !PhysAddr) { LEAVE('i', 0); return 0; } - // Bound - if(MaxBits >= PHYS_BITS) maxCheck = -1; - // Fast Allocate if(Pages == 1 && MaxBits >= PHYS_BITS) {