Fix clean all script for renamed armv7 arch
[tpg/acess2.git] / Kernel / arch / armv7 / mm_virt.c
index c191c68..b6d022d 100644 (file)
@@ -195,8 +195,6 @@ int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi)
        return 1;
 }
 
-extern tShortSpinlock  glDebug_Lock;
-
 int MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi)
 {
        Uint32  *table0, *table1;
@@ -324,9 +322,6 @@ void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask)
        tMM_PageInfo    pi;
        if( MM_int_GetPageInfo(VAddr, &pi) )
                return;
-       
-               
-
 }
 
 int MM_Map(tVAddr VAddr, tPAddr PAddr)
@@ -386,22 +381,118 @@ tPAddr MM_ClearUser(void)
 
 tVAddr MM_MapTemp(tPAddr PAddr)
 {
-       // TODO: Implement MapTemp
+       tVAddr  ret;
+       tMM_PageInfo    pi;
+       
+       for( ret = MM_TMPMAP_BASE; ret < MM_TMPMAP_END - PAGE_SIZE; ret += PAGE_SIZE )
+       {
+               if( MM_int_GetPageInfo(ret, &pi) == 0 )
+                       continue;
+       
+               MM_Map(ret, PAddr);
+               
+               return ret;
+       }
+       Log_Warning("MMVirt", "MM_MapTemp: All slots taken");
        return 0;
 }
 
 void MM_FreeTemp(tVAddr VAddr)
 {
        // TODO: Implement FreeTemp
+       if( VAddr < MM_TMPMAP_BASE || VAddr >= MM_TMPMAP_END ) {
+               Log_Warning("MMVirt", "MM_FreeTemp: Passed an addr not from MM_MapTemp (%p)", VAddr);
+               return ;
+       }
+       
+       MM_Deallocate(VAddr);
+}
+
+tVAddr MM_MapHWPages(tPAddr PAddr, Uint NPages)
+{
+       tVAddr  ret;
+        int    i;
+       tMM_PageInfo    pi;
+
+       // Scan for a location
+       for( ret = MM_HWMAP_BASE; ret < MM_HWMAP_END - NPages * PAGE_SIZE; ret += PAGE_SIZE )
+       {
+               // Check if there is `NPages` free pages
+               for( i = 0; i < NPages; i ++ )
+               {
+                       if( MM_int_GetPageInfo(ret + i*PAGE_SIZE, &pi) == 0 )
+                               break;
+               }
+               // Nope, jump to after the used page found and try again
+               if( i != NPages ) {
+                       ret += i * PAGE_SIZE;
+                       continue ;
+               }
+       
+               // Map the pages        
+               for( i = 0; i < NPages; i ++ )
+                       MM_Map(ret+i*PAGE_SIZE, PAddr+i*PAddr);
+               // and return
+               return ret;
+       }
+       Log_Warning("MMVirt", "MM_MapHWPages: No space for a %i page block", NPages);
+       return 0;
 }
 
-tVAddr MM_NewKStack(int bGlobal)
+tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PAddr)
 {
-       // TODO: Implement NewKStack
-       // TODO: Should I support global stacks? if only for the idle thread
+       Log_Error("MMVirt", "TODO: Implement MM_AllocDMA");
        return 0;
 }
 
+void MM_UnmapHWPages(tVAddr Vaddr, Uint Number)
+{
+       Log_Error("MMVirt", "TODO: Implement MM_UnmapHWPages");
+}
+
+tVAddr MM_NewKStack(int bShared)
+{
+       tVAddr  min_addr, max_addr;
+       tVAddr  addr, ofs;
+
+       if( bShared ) {
+               min_addr = MM_GLOBALSTACKS;
+               max_addr = MM_GLOBALSTACKS_END;
+       }
+       else {
+               min_addr = MM_KSTACK_BASE;
+               max_addr = MM_KSTACK_END;
+       }
+
+       // Locate a free slot
+       for( addr = min_addr; addr < max_addr; addr += MM_KSTACK_SIZE )
+       {
+               tMM_PageInfo    pi;
+               if( MM_int_GetPageInfo(addr+MM_KSTACK_SIZE-PAGE_SIZE, &pi) )    break;
+       }
+
+       // Check for an error   
+       if(addr >= max_addr) {
+               return 0;
+       }
+
+       // 1 guard page
+       for( ofs = PAGE_SIZE; ofs < MM_KSTACK_SIZE; ofs += PAGE_SIZE )
+       {
+               if( MM_Allocate(addr + ofs) == 0 )
+               {
+                       while(ofs)
+                       {
+                               ofs -= PAGE_SIZE;
+                               MM_Deallocate(addr + ofs);
+                       }
+                       Log_Warning("MMVirt", "MM_NewKStack: Unable to allocate");
+                       return 0;
+               }
+       }
+       return addr + ofs;
+}
+
 void MM_DumpTables(tVAddr Start, tVAddr End)
 {
        

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