Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Kernel / arch / armv7 / mm_virt.c
index d74313f..90655b6 100644 (file)
@@ -37,7 +37,8 @@ typedef struct
 #define FRACTAL(table1, addr)  ((table1)[ (0xFF8/4*1024) + ((addr)>>22)])
 #define USRFRACTAL(addr)       (*((Uint32*)(0x7FDFF000) + ((addr)>>22)))
 #define TLBIALL()      __asm__ __volatile__ ("mcr p15, 0, %0, c8, c7, 0" : : "r" (0))
-#define TLBIMVA(addr)  __asm__ __volatile__ ("mcr p15, 0, %0, c8, c7, 1" : : "r" (addr))
+#define TLBIMVA(addr)  __asm__ __volatile__ ("mcr p15, 0, %0, c8, c7, 1;dsb;isb" : : "r" (((addr)&~0xFFF)|1):"memory")
+#define DCCMVAC(addr)  __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 1" : : "r" ((addr)&~0xFFF))
 
 // === PROTOTYPES ===
 void   MM_int_GetTables(tVAddr VAddr, Uint32 **Table0, Uint32 **Table1);
@@ -163,7 +164,10 @@ int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi)
                        if( (*desc & 3) == 1 )  LEAVE_RET('i', 1);
                        if( pi->PhysAddr == 0 ) {
                                *desc = 0;
-                               TLBIMVA(VAddr & 0xFFFFF000);
+                               TLBIMVA( VAddr );
+                               DCCMVAC( (tVAddr) desc );
+//                             #warning "HACK: TLBIALL"
+//                             TLBIALL();                              
                                LEAVE('i', 0);
                                return 0;
                        }
@@ -174,7 +178,10 @@ int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi)
                        if( pi->bShared)        *desc |= 1 << 10;       // S
                        *desc |= (pi->AP & 3) << 4;     // AP
                        *desc |= ((pi->AP >> 2) & 1) << 9;      // APX
-                       TLBIMVA(VAddr & 0xFFFFF000);
+                       TLBIMVA( VAddr );       
+//                     #warning "HACK: TLBIALL"
+//                     TLBIALL();
+                       DCCMVAC( (tVAddr) desc );
                        LEAVE('i', 0);
                        return 0;
                }
@@ -482,7 +489,6 @@ void MM_Deallocate(tVAddr VAddr)
        tMM_PageInfo    pi;
        
        if( MM_int_GetPageInfo(VAddr, &pi) )    return ;
-
        if( pi.PhysAddr == 0 )  return;
        MM_DerefPhys(pi.PhysAddr);
        
@@ -671,13 +677,15 @@ tPAddr MM_Clone(void)
                        memcpy(tmp_page, (void*)sp, 0x1000);
                        MM_FreeTemp( (tVAddr) tmp_page );
                }
-       
+
                MM_FreeTemp( (tVAddr)table );
        }
 
        MM_FreeTemp( (tVAddr)new_lvl1_1 );
        MM_FreeTemp( (tVAddr)new_lvl1_2 );
 
+//     Log("MM_Clone: ret = %P", ret);
+
        return ret;
 }
 
@@ -929,16 +937,18 @@ void MM_int_DumpTableEnt(tVAddr Start, size_t Len, tMM_PageInfo *Info)
 {
        if( giMM_ZeroPage && Info->PhysAddr == giMM_ZeroPage )
        {
-               Debug("%p => %8s - 0x%7x %i %x",
+               Debug("%p => %8s - 0x%7x %i %x %s",
                        Start, "ZERO", Len,
-                       Info->Domain, Info->AP
+                       Info->Domain, Info->AP,
+                       Info->bGlobal ? "G" : "nG"
                        );
        }
        else
        {
-               Debug("%p => %8x - 0x%7x %i %x",
+               Debug("%p => %8x - 0x%7x %i %x %s",
                        Start, Info->PhysAddr-Len, Len,
-                       Info->Domain, Info->AP
+                       Info->Domain, Info->AP,
+                       Info->bGlobal ? "G" : "nG"
                        );
        }
 }
@@ -949,9 +959,7 @@ void MM_DumpTables(tVAddr Start, tVAddr End)
        tMM_PageInfo    pi, pi_old;
         int    i = 0, inRange=0;
        
-       pi_old.Size = 0;
-       pi_old.AP = 0;
-       pi_old.PhysAddr = 0;
+       memset(&pi_old, 0, sizeof(pi_old));
 
        Debug("Page Table Dump (%p to %p):", Start, End);
        range_start = Start;
@@ -964,6 +972,7 @@ void MM_DumpTables(tVAddr Start, tVAddr End)
                 || pi.Size != pi_old.Size
                 || pi.Domain != pi_old.Domain
                 || pi.AP != pi_old.AP
+                || pi.bGlobal != pi_old.bGlobal
                 || pi_old.PhysAddr != pi.PhysAddr )
                {
                        if(inRange) {

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