X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fmm_virt.c;h=4ec08471f1346e80a5e124ed5684e1860b8f46a0;hb=e6d539f85a06fb3d25b985d1a27d8648d23736f0;hp=8e5ef9c8c890c64648e754288bc3cfba56b8b6ad;hpb=be1e298482fe9343cdeebaee9f088e081970e2e3;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/mm_virt.c b/Kernel/arch/x86_64/mm_virt.c index 8e5ef9c8..4ec08471 100644 --- a/Kernel/arch/x86_64/mm_virt.c +++ b/Kernel/arch/x86_64/mm_virt.c @@ -3,6 +3,7 @@ * * Virtual Memory Manager */ +#define DEBUG 0 #include #include #include @@ -118,6 +119,10 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) // Error_Backtrace(Regs->RIP, Regs->RBP); MM_DumpTables(0, -1); + + __asm__ __volatile__ ("cli"); + for( ;; ) + HALT(); } /** @@ -209,7 +214,7 @@ int MM_Map(tVAddr VAddr, tPAddr PAddr) { tPAddr tmp; - Log("MM_Map: (VAddr=0x%x, PAddr=0x%x)", VAddr, PAddr); + ENTER("xVAddr xPAddr", VAddr, PAddr); // Check PML4 //Log(" MM_Map: &PAGEMAPLVL4(%x) = %x", VAddr >> 39, &PAGEMAPLVL4(VAddr >> 39)); @@ -253,8 +258,8 @@ int MM_Map(tVAddr VAddr, tPAddr PAddr) PAGETABLE(VAddr >> PTAB_SHIFT) = PAddr | 3; INVLPG( VAddr ); - Log("MM_Map: RETURN 1"); - + + LEAVE('i', 1); return 1; } @@ -281,19 +286,35 @@ tPAddr MM_Allocate(tVAddr VAddr) { tPAddr ret; - Log("MM_Allocate: (VAddr=%x)", VAddr); - Log("MM_Allocate: MM_AllocPhys()"); + ENTER("xVAddr", VAddr); + + // NOTE: This is hack, but I like my dumps to be neat + #if 1 + if( !MM_Map(VAddr, 0) ) // Make sure things are allocated + { + Warning("MM_Allocate: Unable to map, tables did not initialise"); + LEAVE('i', 0); + return 0; + } + MM_Unmap(VAddr); + #endif + ret = MM_AllocPhys(); - Log("MM_Allocate: ret = %x", ret); - if(!ret) return 0; + LOG("ret = %x", ret); + if(!ret) { + LEAVE('i', 0); + return 0; + } if( !MM_Map(VAddr, ret) ) { - Warning("MM_Allocate: Unable to map", ret); + Warning("MM_Allocate: Unable to map. Strange, we should have errored earlier"); MM_DerefPhys(ret); + LEAVE('i'); return 0; } + LEAVE('x', ret); return ret; } @@ -472,6 +493,8 @@ tPAddr MM_Clone(void) ret = MM_AllocPhys(); if(!ret) return 0; + Log_KernelPanic("MM", "TODO: Implement MM_Clone"); + // #2 Alter the fractal pointer // #3 Set Copy-On-Write to all user pages // #4 Return @@ -533,10 +556,28 @@ void MM_ClearUser(void) tVAddr MM_NewWorkerStack(void) { + Log_KernelPanic("MM", "TODO: Implement MM_NewWorkerStack"); return 0; } +/** + * \brief Allocate a new kernel stack + */ tVAddr MM_NewKStack(void) { + tVAddr base = MM_KSTACK_BASE; + Uint i; + for( ; base < MM_KSTACK_TOP; base += KERNEL_STACK_SIZE ) + { + if(MM_GetPhysAddr(base) != 0) + continue; + + Log("MM_NewKStack: Found one at %p", base + KERNEL_STACK_SIZE); + for( i = 0; i < KERNEL_STACK_SIZE; i += 0x1000) + MM_Allocate(base+i); + + return base + KERNEL_STACK_SIZE; + } + Log_Warning("MM", "MM_NewKStack - No address space left\n"); return 0; }