X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farmv7%2Fmm_virt.c;h=7d0c85adf94f0a7239911b19ccb71d2ac36707e9;hb=95a9132bcc024715a0a87cb323d58967ea5b1803;hp=2555b8a1b48ff8593abcc9e5a47cc91fa9ea975d;hpb=f4ea8dd4c261e7a3a10d768c01cd3a121b42a045;p=tpg%2Facess2.git diff --git a/Kernel/arch/armv7/mm_virt.c b/Kernel/arch/armv7/mm_virt.c index 2555b8a1..7d0c85ad 100644 --- a/Kernel/arch/armv7/mm_virt.c +++ b/Kernel/arch/armv7/mm_virt.c @@ -9,6 +9,8 @@ #include #include +#define TRACE_MAPS 0 + #define AP_KRW_ONLY 1 // Kernel page #define AP_KRO_ONLY 5 // Kernel RO page #define AP_RW_BOTH 3 // Standard RW @@ -390,7 +392,9 @@ void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask) int MM_Map(tVAddr VAddr, tPAddr PAddr) { tMM_PageInfo pi = {0}; -// Log("MM_Map %P=>%p", PAddr, VAddr); + #if TRACE_MAPS + Log("MM_Map %P=>%p", PAddr, VAddr); + #endif pi.PhysAddr = PAddr; pi.Size = 12; @@ -487,7 +491,7 @@ void MM_int_CloneTable(Uint32 *DestEnt, int Table) { tPAddr table; Uint32 *tmp_map; - Uint32 *cur = (void*)MM_TABLE0USER; + Uint32 *cur = (void*)MM_TABLE1USER; // Uint32 *cur = &FRACTAL(MM_TABLE1USER,0); int i; @@ -498,12 +502,13 @@ void MM_int_CloneTable(Uint32 *DestEnt, int Table) for( i = 0; i < 1024; i ++ ) { - switch(cur[i] & 3) +// Log_Debug("MMVirt", "cur[%i] (%p) = %x", Table*256+i, &cur[Table*256+i], cur[Table*256+i]); + switch(cur[Table*256+i] & 3) { case 0: tmp_map[i] = 0; break; case 1: tmp_map[i] = 0; - Log_Error("MMVirt", "TODO: Support large pages in MM_int_CloneTable"); + Log_Error("MMVirt", "TODO: Support large pages in MM_int_CloneTable (%p)", (Table*256+i)*0x1000); // Large page? break; case 2: @@ -529,6 +534,8 @@ tPAddr MM_Clone(void) Uint32 *new_lvl1_1, *new_lvl1_2, *cur; Uint32 *tmp_map; int i; + +// MM_DumpTables(0, KERNEL_BASE); ret = MM_AllocateRootTable(); @@ -538,7 +545,11 @@ tPAddr MM_Clone(void) tmp_map = new_lvl1_1; for( i = 0; i < 0x800-4; i ++ ) { -// Log("i = %i", i); + // HACK! Ignore the original identity mapping + if( i == 0 && Threads_GetTID() == 0 ) { + tmp_map[0] = 0; + continue; + } if( i == 0x400 ) tmp_map = &new_lvl1_2[-0x400]; switch( cur[i] & 3 ) @@ -594,6 +605,8 @@ tPAddr MM_Clone(void) sp = __SP & ~(MM_KSTACK_SIZE-1); j = (sp / 0x1000) % 1024; num = MM_KSTACK_SIZE/0x1000; + + Log("num = %i, sp = %p, j = %i", num, sp, j); // Copy stack pages for(; num--; j ++, sp += 0x1000) @@ -634,7 +647,7 @@ tVAddr MM_MapTemp(tPAddr PAddr) if( MM_int_GetPageInfo(ret, &pi) == 0 ) continue; -// Log("MapTemp %P at %p", PAddr, ret); + Log("MapTemp %P at %p by %p", PAddr, ret, __builtin_return_address(0)); MM_RefPhys(PAddr); // Counter the MM_Deallocate in FreeTemp MM_Map(ret, PAddr); @@ -682,7 +695,7 @@ tVAddr MM_MapHWPages(tPAddr PAddr, Uint NPages) // Map the pages for( i = 0; i < NPages; i ++ ) - MM_Map(ret+i*PAGE_SIZE, PAddr+i*PAddr); + MM_Map(ret+i*PAGE_SIZE, PAddr+i*PAGE_SIZE); // and return LEAVE('p', ret); return ret; @@ -694,8 +707,19 @@ tVAddr MM_MapHWPages(tPAddr PAddr, Uint NPages) tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PAddr) { - Log_Error("MMVirt", "TODO: Implement MM_AllocDMA"); - return 0; + tPAddr phys; + tVAddr ret; + + phys = MM_AllocPhysRange(Pages, MaxBits); + if(!phys) { + Log_Warning("MMVirt", "No space left for a %i page block (MM_AllocDMA)", Pages); + return 0; + } + + ret = MM_MapHWPages(phys, Pages); + *PAddr = phys; + + return ret; } void MM_UnmapHWPages(tVAddr Vaddr, Uint Number) @@ -787,14 +811,14 @@ void MM_int_DumpTableEnt(tVAddr Start, size_t Len, tMM_PageInfo *Info) { if( giMM_ZeroPage && Info->PhysAddr == giMM_ZeroPage ) { - Log("%p => %8s - 0x%7x %i %x", + Debug("%p => %8s - 0x%7x %i %x", Start, "ZERO", Len, Info->Domain, Info->AP ); } else { - Log("%p => %8x - 0x%7x %i %x", + Debug("%p => %8x - 0x%7x %i %x", Start, Info->PhysAddr-Len, Len, Info->Domain, Info->AP ); @@ -809,12 +833,13 @@ void MM_DumpTables(tVAddr Start, tVAddr End) pi_old.Size = 0; - Log("Page Table Dump:"); + Debug("Page Table Dump:"); range_start = Start; for( addr = Start; i == 0 || (addr && addr < End); i = 1 ) { + int rv; // Log("addr = %p", addr); - int rv = MM_int_GetPageInfo(addr, &pi); + rv = MM_int_GetPageInfo(addr, &pi); if( rv || pi.Size != pi_old.Size || pi.Domain != pi_old.Domain @@ -837,6 +862,6 @@ void MM_DumpTables(tVAddr Start, tVAddr End) } if(inRange) MM_int_DumpTableEnt(range_start, addr - range_start, &pi); - Log("Done"); + Debug("Done"); }