Kernel - Fixing up doxygen commenting
[tpg/acess2.git] / Kernel / arch / armv7 / mm_virt.c
index 2555b8a..7d0c85a 100644 (file)
@@ -9,6 +9,8 @@
 #include <mm_virt.h>
 #include <hal_proc.h>
 
+#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");
 }
 

UCC git Repository :: git.ucc.asn.au