dev: consistently end device classes in 'Device'
[gem5.git] / src / arch / sparc / tlb_map.hh
index 226ef23a1b33017bb8ca71cd93d2ee845e09b0a5..c09e6eb952b1e025a1ef27e8cfe373098eedf967 100644 (file)
 #ifndef __ARCH_SPARC_TLB_MAP_HH__
 #define __ARCH_SPARC_TLB_MAP_HH__
 
-#include "arch/sparc/pagetable.hh"
 #include <map>
 
+#include "arch/sparc/pagetable.hh"
+
 namespace SparcISA
 {
 
@@ -46,15 +47,24 @@ class TlbMap
   public:
     typedef RangeMap::iterator iterator;
 
-    iterator find(const TlbRange &r)
+    iterator
+    find(const TlbRange &r)
     {
         iterator i;
 
         i = tree.upper_bound(r);
 
-        if (i == tree.begin())
-            // Nothing could match, so return end()
-            return tree.end();
+        if (i == tree.begin()) {
+            if (r.real == i->first.real &&
+                r.partitionId == i->first.partitionId &&
+                i->first.va < r.va + r.size &&
+                i->first.va+i->first.size >= r.va &&
+                (r.real || r.contextId == i->first.contextId))
+                return i;
+            else
+                // Nothing could match, so return end()
+                return tree.end();
+        }
 
         i--;
 
@@ -71,7 +81,8 @@ class TlbMap
         return tree.end();
     }
 
-    bool intersect(const TlbRange &r)
+    bool
+    intersect(const TlbRange &r)
     {
         iterator i;
         i = find(r);
@@ -81,53 +92,76 @@ class TlbMap
     }
 
 
-    iterator insert(TlbRange &r, TlbEntry *d)
+    iterator
+    insert(TlbRange &r, TlbEntry *d)
     {
         if (intersect(r))
             return tree.end();
 
-        return tree.insert(std::make_pair<TlbRange,TlbEntry*>(r, d)).first;
+        return tree.insert(std::make_pair(r, d)).first;
     }
 
-    size_t erase(TlbRange k)
+    size_t
+    erase(TlbRange k)
     {
         return tree.erase(k);
     }
 
-    void erase(iterator p)
+    void
+    erase(iterator p)
     {
         tree.erase(p);
     }
 
-    void erase(iterator p, iterator q)
+    void
+    erase(iterator p, iterator q)
     {
         tree.erase(p,q);
     }
 
-    void clear()
+    void
+    clear()
     {
         tree.erase(tree.begin(), tree.end());
     }
 
-    iterator begin()
+    iterator
+    begin()
     {
         return tree.begin();
     }
 
-    iterator end()
+    iterator
+    end()
     {
         return tree.end();
     }
 
-    size_t size()
+    size_t
+    size()
     {
         return tree.size();
     }
 
-    bool empty()
+    bool
+    empty()
     {
         return tree.empty();
     }
+
+    void
+    print()
+    {
+        iterator i;
+        i = tree.begin();
+        while (i != tree.end()) {
+           std::cout << std::hex << i->first.va << " " << i->first.size << " " <<
+                i->first.contextId << " " << i->first.partitionId << " " <<
+                i->first.real << " " << i->second << std::endl;
+            i++;
+        }
+    }
+
 };
 
 };