X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=8c59ea0fba5d3c11cd65f7d8b646f91c822576af;hb=de86ddb7cb10ee403732f9207aba756f267ef3de;hp=8902837c2f2fc6b8f4299f426d8d22d18be88c94;hpb=2d83a99f3202f0e4688b58405f67604a24420861;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 8902837c..8c59ea0f 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -55,8 +55,9 @@ #define PF_PRESENT 0x1 #define PF_WRITE 0x2 #define PF_USER 0x4 +#define PF_GLOBAL 0x80 #define PF_COW 0x200 -#define PF_PAGED 0x400 +#define PF_NOPAGE 0x400 #define INVLPG(addr) __asm__ __volatile__ ("invlpg (%0)"::"r"(addr)) @@ -78,6 +79,7 @@ void MM_PreinitVirtual(void); void MM_InstallVirtual(void); void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs); void MM_DumpTables(tVAddr Start, tVAddr End); +tVAddr MM_ClearUser(void); tPAddr MM_DuplicatePage(tVAddr VAddr); // === GLOBALS === @@ -95,8 +97,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; @@ -217,6 +219,9 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) ); Warning("User Pagefault: Instruction at %04x:%08x accessed %p", Regs->cs, Regs->eip, Addr); __asm__ __volatile__ ("sti"); // Restart IRQs + #if 1 + Error_Backtrace(Regs->eip, Regs->ebp); + #endif Threads_SegFault(Addr); return ; } @@ -272,7 +277,7 @@ void MM_DumpTables(tVAddr Start, tVAddr End) tPAddr expected = 0; tVAddr curPos; Uint page; - const tPAddr MASK = ~0xF98; + const tPAddr MASK = ~0xF78; Start >>= 12; End >>= 12; @@ -302,14 +307,16 @@ void MM_DumpTables(tVAddr Start, tVAddr End) || (gaPageTable[page] & MASK) != expected) { if(expected) { - Log(" 0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)", - rangeStart, curPos - 1, + Log(" 0x%08x => 0x%08x - 0x%08x (%s%s%s%s%s)", + rangeStart, gaPageTable[rangeStart>>12] & ~0xFFF, - (expected & ~0xFFF) - 1, - (expected & PF_PAGED ? "p" : "-"), + curPos - rangeStart, + (expected & PF_NOPAGE ? "P" : "-"), (expected & PF_COW ? "C" : "-"), + (expected & PF_GLOBAL ? "G" : "-"), (expected & PF_USER ? "U" : "-"), - (expected & PF_WRITE ? "W" : "-") + (expected & PF_WRITE ? "W" : "-"), + gaPageTable[page] & MASK, expected ); expected = 0; } @@ -323,11 +330,11 @@ void MM_DumpTables(tVAddr Start, tVAddr End) } if(expected) { - Log("0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)", - rangeStart, curPos - 1, + Log("0x%08x => 0x%08x - 0x%08x (%s%s%s%s)", + rangeStart, gaPageTable[rangeStart>>12] & ~0xFFF, - (expected & ~0xFFF) - 1, - (expected & PF_PAGED ? "p" : "-"), + curPos - rangeStart, + (expected & PF_NOPAGE ? "p" : "-"), (expected & PF_COW ? "C" : "-"), (expected & PF_USER ? "U" : "-"), (expected & PF_WRITE ? "W" : "-") @@ -533,7 +540,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; @@ -541,37 +548,40 @@ tPAddr MM_Clone(void) //LOG("Allocated Directory (%x)", *gpTmpCR3); memsetd( gaTmpDir, 0, 1024 ); - // Copy Tables - for( i = 0; i < 768; i ++) - { - // Check if table is allocated - if( !(gaPageDir[i] & PF_PRESENT) ) { - gaTmpDir[i] = 0; - page += 1024; - continue; - } - - // Allocate new table - gaTmpDir[i] = MM_AllocPhys() | (gaPageDir[i] & 7); - INVLPG( &gaTmpTable[page] ); - // Fill - for( j = 0; j < 1024; j ++, page++ ) + if( Threads_GetPID() != 0 ) + { + // Copy Tables + for( i = 0; i < 768; i ++) { - if( !(gaPageTable[page] & PF_PRESENT) ) { - gaTmpTable[page] = 0; + // Check if table is allocated + if( !(gaPageDir[i] & PF_PRESENT) ) { + gaTmpDir[i] = 0; + page += 1024; continue; } - // Refrence old page - MM_RefPhys( gaPageTable[page] & ~0xFFF ); - // Add to new table - if(gaPageTable[page] & PF_WRITE) { - gaTmpTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW; - gaPageTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW; - INVLPG( page << 12 ); + // Allocate new table + gaTmpDir[i] = MM_AllocPhys() | (gaPageDir[i] & 7); + INVLPG( &gaTmpTable[page] ); + // Fill + for( j = 0; j < 1024; j ++, page++ ) + { + if( !(gaPageTable[page] & PF_PRESENT) ) { + gaTmpTable[page] = 0; + continue; + } + + // Refrence old page + MM_RefPhys( gaPageTable[page] & ~0xFFF ); + // Add to new table + if(gaPageTable[page] & PF_WRITE) { + gaTmpTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW; + gaPageTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW; + INVLPG( page << 12 ); + } + else + gaTmpTable[page] = gaPageTable[page]; } - else - gaTmpTable[page] = gaPageTable[page]; } } @@ -641,7 +651,7 @@ tPAddr MM_Clone(void) } ret = *gpTmpCR3 & ~0xFFF; - RELEASE( &gilTempFractal ); + Mutex_Release( &glTempFractal ); //LEAVE('x', ret); return ret; @@ -653,17 +663,32 @@ tPAddr MM_Clone(void) */ tVAddr MM_NewKStack(void) { - tVAddr base = KERNEL_STACKS; + tVAddr base; Uint i; - for(;base> 12 ] = MM_AllocPhys(); gaTmpTable[ (base + addr) >> 12 ] = pages[addr>>12] | 3; } *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); @@ -900,11 +927,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 ++ ) { @@ -914,11 +941,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: Use a sleep queue here instead } } @@ -1053,8 +1080,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++ ) { @@ -1062,7 +1088,7 @@ void MM_UnmapHWPages(tVAddr VAddr, Uint Number) gaPageTable[ i + j ] = 0; } - RELEASE( &gilTempMappings ); + Mutex_Release( &glTempMappings ); } // --- EXPORTS ---