X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=dce4782867df7c8bfac5033c9e9bb03b2c4454d5;hb=7d881c2e5fef91a6570e46ef69a5d4a5cf0e8b4d;hp=4c2455e159740258f495a552b114840fbcc85c76;hpb=ccd6cf2af99fdc050888c70eb4d59f078a15a2da;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 4c2455e1..dce47828 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -95,8 +95,8 @@ tPAddr MM_DuplicatePage(tVAddr VAddr); #define gaPAE_TmpDir ((tTabEnt*)PAE_TMP_DIR_ADDR) #define gaPAE_TmpPDPT ((tTabEnt*)PAE_TMP_PDPT_ADDR) int gbUsePAE = 0; - int gilTempMappings = 0; - int gilTempFractal = 0; +tMutex glTempMappings; +tMutex glTempFractal; Uint32 gWorkerStacks[(NUM_WORKER_STACKS+31)/32]; int giLastUsedWorker = 0; @@ -252,6 +252,12 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) //Log("SS:ESP %04x:%08x", Regs->ss, Regs->esp); Log("CS:EIP %04x:%08x", Regs->cs, Regs->eip); Log("DS %04x ES %04x FS %04x GS %04x", Regs->ds, Regs->es, Regs->fs, Regs->gs); + { + Uint dr0, dr1; + __ASM__ ("mov %%dr0, %0":"=r"(dr0):); + __ASM__ ("mov %%dr1, %0":"=r"(dr1):); + Log("DR0 %08x DR1 %08x", dr0, dr1); + } Panic("Page Fault at 0x%x (Accessed 0x%x)", Regs->eip, Addr); } @@ -527,7 +533,7 @@ tPAddr MM_Clone(void) tVAddr kStackBase = Proc_GetCurThread()->KernelStack - KERNEL_STACK_SIZE; void *tmp; - LOCK( &gilTempFractal ); + Mutex_Acquire( &glTempFractal ); // Create Directory Table *gpTmpCR3 = MM_AllocPhys() | 3; @@ -635,7 +641,7 @@ tPAddr MM_Clone(void) } ret = *gpTmpCR3 & ~0xFFF; - RELEASE( &gilTempFractal ); + Mutex_Release( &glTempFractal ); //LEAVE('x', ret); return ret; @@ -707,7 +713,7 @@ tVAddr MM_NewWorkerStack() //Log(" MM_NewWorkerStack: base = 0x%x", base); // Acquire the lock for the temp fractal mappings - LOCK(&gilTempFractal); + Mutex_Acquire(&glTempFractal); // Set the temp fractals to TID0's address space *gpTmpCR3 = ((Uint)gaInitPageDir - KERNEL_BASE) | 3; @@ -731,7 +737,7 @@ tVAddr MM_NewWorkerStack() } *gpTmpCR3 = 0; // Release the temp mapping lock - RELEASE(&gilTempFractal); + Mutex_Release(&glTempFractal); // Copy the old stack oldstack = (esp + KERNEL_STACK_SIZE-1) & ~(KERNEL_STACK_SIZE-1); @@ -894,11 +900,11 @@ tVAddr MM_MapTemp(tPAddr PAddr) PAddr &= ~0xFFF; - //LOG("gilTempMappings = %i", gilTempMappings); + //LOG("glTempMappings = %i", glTempMappings); for(;;) { - LOCK( &gilTempMappings ); + Mutex_Acquire( &glTempMappings ); for( i = 0; i < NUM_TEMP_PAGES; i ++ ) { @@ -908,11 +914,11 @@ tVAddr MM_MapTemp(tPAddr PAddr) gaPageTable[ (TEMP_MAP_ADDR >> 12) + i ] = PAddr | 3; INVLPG( TEMP_MAP_ADDR + (i << 12) ); //LEAVE('p', TEMP_MAP_ADDR + (i << 12)); - RELEASE( &gilTempMappings ); + Mutex_Release( &glTempMappings ); return TEMP_MAP_ADDR + (i << 12); } - RELEASE( &gilTempMappings ); - Threads_Yield(); + Mutex_Release( &glTempMappings ); + Threads_Yield(); // TODO: Less expensive } } @@ -1047,8 +1053,7 @@ void MM_UnmapHWPages(tVAddr VAddr, Uint Number) i = VAddr >> 12; - LOCK( &gilTempMappings ); // Temp and HW share a directory, so they share a lock - + Mutex_Acquire( &glTempMappings ); // Temp and HW share a directory, so they share a lock for( j = 0; j < Number; j++ ) { @@ -1056,7 +1061,7 @@ void MM_UnmapHWPages(tVAddr VAddr, Uint Number) gaPageTable[ i + j ] = 0; } - RELEASE( &gilTempMappings ); + Mutex_Release( &glTempMappings ); } // --- EXPORTS ---