]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/arm/mem_space-arm.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / mem_space-arm.cpp
index 4edecd670146ead75baf7cb25e8e60e2a8da874e..5d118ccd3476005b78a8217270cdbad830c0ed56 100644 (file)
@@ -96,6 +96,13 @@ Mem_space::xlate_flush(unsigned char rights)
   return a;
 }
 
+PUBLIC static inline
+Mword
+Mem_space::is_full_flush(unsigned char rights)
+{
+  return rights & L4_fpage::RX;
+}
+
 PUBLIC static inline
 unsigned char
 Mem_space::xlate_flush_result(Mword attribs)
@@ -112,20 +119,35 @@ Mem_space::xlate_flush_result(Mword attribs)
 
 // Mapping utilities
 
-
 PUBLIC inline NEEDS["mem_unit.h"]
 void
 Mem_space::tlb_flush(bool force = false)
 {
   if (!Have_asids)
     Mem_unit::tlb_flush();
-  else if (force && c_asid())
+  else if (force && c_asid() != ~0UL)
     Mem_unit::tlb_flush(c_asid());
 
   // else do nothing, we manage ASID local flushes in v_* already
   // Mem_unit::tlb_flush();
 }
 
+PUBLIC static inline NEEDS["mem_unit.h"]
+void
+Mem_space::tlb_flush_spaces(bool all, Mem_space *s1, Mem_space *s2)
+{
+  if (all || !Have_asids)
+    Mem_unit::tlb_flush();
+  else
+    {
+      if (s1)
+       s1->tlb_flush(true);
+      if (s2)
+       s2->tlb_flush(true);
+    }
+}
+
+
 PUBLIC inline
 void
 Mem_space::enable_reverse_lookup()
@@ -153,7 +175,7 @@ Page_table *Mem_space::current_pdir()
   return Page_table::current();
 }
 
-IMPLEMENT inline NEEDS ["kmem.h", Mem_space::c_asid, Mem_space::need_tlb_flush]
+IMPLEMENT inline NEEDS ["kmem.h", Mem_space::c_asid]
 void Mem_space::switchin_context(Mem_space *from)
 {
 #if 0
@@ -164,7 +186,7 @@ void Mem_space::switchin_context(Mem_space *from)
 
   if (from != this)
     make_current();
-  else if (need_tlb_flush())
+  else
     tlb_flush(true);
 #if 0
   _dir->invalidate((void*)Kmem::ipc_window(0), Config::SUPERPAGE_SIZE * 4,
@@ -394,7 +416,7 @@ PUBLIC
 Mem_space::Mem_space (Ram_quota *q, Dir_type* pdir)
   : _quota(q), _dir (pdir)
 {
-  asid(0);
+  asid(~0UL);
   enable_reverse_lookup ();
 }
 
@@ -470,10 +492,7 @@ Mem_space::c_asid() const
 PRIVATE inline static
 unsigned long
 Mem_space::next_asid(unsigned cpu)
-{ 
-  unsigned long ret = _next_free_asid.cpu(cpu)++;
-  return ret; 
-}
+{ return _next_free_asid.cpu(cpu)++; }
 
 PRIVATE inline NEEDS[Mem_space::next_asid]
 unsigned long