X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fmm_virt.c;h=0b8565738a0f8d46a8ae9354e0978140fc9a4b4e;hb=5255c9f07cb2e0e43cf283e256c964eaa7970c8e;hp=ae8784b19d12af9b7747bc085c7f43bbd48e52f8;hpb=16786b0b2d78359e052bd088f86aee90e1140737;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/mm_virt.c b/Kernel/arch/x86_64/mm_virt.c index ae8784b1..0b856573 100644 --- a/Kernel/arch/x86_64/mm_virt.c +++ b/Kernel/arch/x86_64/mm_virt.c @@ -634,13 +634,29 @@ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) // --- Tempory Mappings --- tVAddr MM_MapTemp(tPAddr PAddr) { - Log_KernelPanic("MM", "TODO: Implement MM_MapTemp"); + const int max_slots = (MM_TMPMAP_END - MM_TMPMAP_BASE) / PAGE_SIZE; + tVAddr ret = MM_TMPMAP_BASE; + int i; + + for( i = 0; i < max_slots; i ++, ret += PAGE_SIZE ) + { + tPAddr *ent; + if( MM_GetPageEntryPtr( ret, 0, 1, 0, &ent) < 0 ) { + continue ; + } + + if( *ent & 1 ) + continue ; + + *ent = PAddr | 3; + return ret; + } return 0; } void MM_FreeTemp(tVAddr VAddr) { - Log_KernelPanic("MM", "TODO: Implement MM_FreeTemp"); + MM_Deallocate(VAddr); return ; } @@ -650,7 +666,13 @@ tPAddr MM_Clone(void) { tPAddr ret; int i; - tVAddr kstackbase = Proc_GetCurThread()->KernelStack - KERNEL_STACK_SIZE + 0x1000; + tVAddr kstackbase; + + // tThread->KernelStack is the top + // There is 1 guard page below the stack + kstackbase = Proc_GetCurThread()->KernelStack - KERNEL_STACK_SIZE + 0x1000; + + Log("MM_Clone: kstackbase = %p", kstackbase); // #1 Create a copy of the PML4 ret = MM_AllocPhys(); @@ -661,8 +683,6 @@ tPAddr MM_Clone(void) TMPCR3() = ret | 3; INVLPG_ALL(); -// Log_KernelPanic("MM", "TODO: Implement MM_Clone"); - // #3 Set Copy-On-Write to all user pages for( i = 0; i < 256; i ++) { @@ -686,13 +706,17 @@ tPAddr MM_Clone(void) if( i == 509 ) continue; // 510 0xFFFFFE8.. - Temp fractal mapping if( i == 510 ) continue; + + TMPMAPLVL4(i) = PAGEMAPLVL4(i); + if( TMPMAPLVL4(i) & 1 ) + MM_RefPhys( TMPMAPLVL4(i) & PADDR_MASK ); } // #5 Set fractal mapping TMPMAPLVL4(509) = ret | 3; TMPMAPLVL4(510) = 0; // Temp - // #6 Create kernel stack + // #6 Create kernel stack (-1 to account for the guard) TMPMAPLVL4(320) = 0; for( i = 0; i < KERNEL_STACK_SIZE/0x1000-1; i ++ ) { @@ -709,6 +733,7 @@ tPAddr MM_Clone(void) TMPCR3() = 0; INVLPG_ALL(); Mutex_Release(&glMM_TempFractalLock); + Log("MM_Clone: RETURN %P\n", ret); return ret; }