syscall: Resolve conflicts between m5threads and Gabe's recent SE changes.
[gem5.git] / src / arch / sparc / pagetable.hh
index 2e27258a40f27853ee15763ccc23a60fb33c918e..cbdabe4c3ccd2fce66cef8ee8340745f44425014 100644 (file)
 #ifndef __ARCH_SPARC_PAGETABLE_HH__
 #define __ARCH_SPARC_PAGETABLE_HH__
 
+#include <cassert>
+
 #include "arch/sparc/isa_traits.hh"
+#include "base/bitfield.hh"
 #include "base/misc.hh"
 #include "config/full_system.hh"
 
 class Checkpoint;
 
-namespace SparcISA
-{
+namespace SparcISA {
+
 struct VAddr
 {
     VAddr(Addr a) { panic("not implemented yet."); }
 };
 
+class TteTag
+{
+  private:
+    uint64_t entry;
+    bool populated;
+
+  public:
+    TteTag() : entry(0), populated(false) {}
+    TteTag(uint64_t e) : entry(e), populated(true) {}
+
+    const TteTag &
+    operator=(uint64_t e) 
+    {
+        populated = true;
+        entry = e;
+        return *this;
+    }
+
+    bool valid() const {assert(populated); return !bits(entry,62,62); }
+    Addr va()    const {assert(populated); return bits(entry,41,0); }
+};
+
+
 class PageTableEntry
 {
   public:
@@ -59,13 +85,13 @@ class PageTableEntry
     uint64_t entry4u;
     bool populated;
 
-
   public:
-    PageTableEntry() : entry(0), type(invalid), populated(false) {}
+    PageTableEntry()
+        : entry(0), type(invalid), populated(false)
+    {}
 
     PageTableEntry(uint64_t e, EntryType t = sun4u)
         : entry(e), type(t), populated(true)
-
     {
         populate(entry, type);
     }
@@ -80,72 +106,90 @@ class PageTableEntry
         if (type == sun4u)
             entry4u = entry;
         else {
-            uint64_t entry4u = 0;
-            entry4u |= entry & ULL(0x8000000000000000);              //valid
-            entry4u |= (entry & 0x3) << 61;                     //size[1:0]
-            entry4u |= (entry & ULL(0x4000000000000000)) >> 2;       //nfo
-            entry4u |= (entry & 0x1000) << 47;                  //ie
-            //entry4u |= (entry & 0x3F00000000000000) >> 7;       //soft2
-            entry4u |= (entry & 0x4) << 48;                     //size[2]
-                                                                //diag?
-            entry4u |= (entry & ULL(0x0000FFFFFFFFE000));            //paddr
-            entry4u |= (entry & 0x400) >> 5;                    //cp
-            entry4u |= (entry & 0x200) >> 5;                    //cv
-            entry4u |= (entry & 0x800) >> 8;                    //e
-            entry4u |= (entry & 0x100) >> 6;                    //p
-            entry4u |= (entry & 0x40) >> 5;                     //w
+            entry4u = 0;
+            entry4u |= mbits(entry,63,63);         //valid
+            entry4u |= bits(entry,1,0) << 61;      //size[1:0]
+            entry4u |= bits(entry,62,62) << 60;    //nfo
+            entry4u |= bits(entry,12,12) << 59;    //ie
+            entry4u |= bits(entry,2,2) << 48;      //size[2]
+            entry4u |= mbits(entry,39,13);         //paddr
+            entry4u |= bits(entry,61,61) << 6;;    // locked
+            entry4u |= bits(entry,10,10) << 5;     //cp
+            entry4u |= bits(entry,9,9) << 4;       //cv
+            entry4u |= bits(entry,11,11) << 3;     //e
+            entry4u |= bits(entry,8,8) << 2;       //p
+            entry4u |= bits(entry,6,6) << 1;       //w
         }
     }
 
-    void clear()
+    void
+    clear()
     {
         populated = false;
     }
 
     static int pageSizes[6];
 
-
     uint64_t operator()() const { assert(populated); return entry4u; }
-    const PageTableEntry &operator=(uint64_t e) { populated = true;
-                                                  entry4u = e; return *this; }
-
-    const PageTableEntry &operator=(const PageTableEntry &e)
-    { populated = true; entry4u = e.entry4u; return *this; }
-
-    bool    valid()    const { return entry4u & ULL(0x8000000000000000) && populated; }
-    uint8_t _size()     const { assert(populated);
-                               return ((entry4u & 0x6) >> 61) |
-                                      ((entry4u & ULL(0x000080000000000)) >> 46); }
-    Addr    size()     const { return pageSizes[_size()]; }
-    bool    ie()       const { return entry4u >> 59 & 0x1; }
-    Addr    pfn()      const { assert(populated);
-                               return entry4u >> 13 & ULL(0xFFFFFFFFFF); }
-    Addr    paddr()    const { assert(populated);
-                               return entry4u & ULL(0x0000FFFFFFFFE000); }
-    bool    locked()   const { assert(populated);
-                               return entry4u & 0x40; }
-    bool    cv()       const { assert(populated);
-                               return entry4u & 0x10; }
-    bool    cp()       const { assert(populated);
-                               return entry4u & 0x20; }
-    bool    priv()     const { assert(populated);
-                               return entry4u & 0x4; }
-    bool    writable() const { assert(populated);
-                               return entry4u & 0x2; }
-    bool    nofault()  const { assert(populated);
-                               return entry4u & ULL(0x1000000000000000); }
-    bool    sideffect() const { assert(populated);
-                                return entry4u & 0x8; }
+    const PageTableEntry &
+    operator=(uint64_t e)
+    {
+        populated = true;
+        entry4u = e;
+        return *this;
+    }
+
+    const PageTableEntry &
+    operator=(const PageTableEntry &e)
+    {
+        populated = true;
+        entry4u = e.entry4u;
+        type = e.type;
+        return *this;
+    }
+
+    bool valid() const { return bits(entry4u,63,63) && populated; }
+
+    uint8_t
+    _size() const
+    {
+        assert(populated);
+        return bits(entry4u, 62,61) | bits(entry4u, 48,48) << 2;
+    }
+
+    Addr size()     const { assert(_size() < 6); return pageSizes[_size()]; }
+    Addr sizeMask() const { return size() - 1; }
+    bool ie()       const { return bits(entry4u, 59,59); }
+    Addr pfn()      const { assert(populated); return bits(entry4u,39,13); }
+    Addr paddr()    const { assert(populated); return mbits(entry4u, 39,13);}
+    bool locked()   const { assert(populated); return bits(entry4u,6,6); }
+    bool cv()       const { assert(populated); return bits(entry4u,4,4); }
+    bool cp()       const { assert(populated); return bits(entry4u,5,5); }
+    bool priv()     const { assert(populated); return bits(entry4u,2,2); }
+    bool writable() const { assert(populated); return bits(entry4u,1,1); }
+    bool nofault()  const { assert(populated); return bits(entry4u,60,60); }
+    bool sideffect() const { assert(populated); return bits(entry4u,3,3); }
+    Addr paddrMask() const { assert(populated); return paddr() & ~sizeMask(); }
+
+    Addr
+    translate(Addr vaddr) const
+    {
+        assert(populated);
+        Addr mask = sizeMask();
+        return (paddr() & ~mask) | (vaddr & mask);
+    }
 };
 
-struct TlbRange {
+struct TlbRange
+{
     Addr va;
     Addr size;
     int contextId;
     int partitionId;
     bool real;
 
-    inline bool operator<(const TlbRange &r2) const
+    inline bool
+    operator<(const TlbRange &r2) const
     {
         if (real && !r2.real)
             return true;
@@ -168,7 +212,9 @@ struct TlbRange {
             return true;
         return false;
     }
-    inline bool operator==(const TlbRange &r2) const
+
+    inline bool
+    operator==(const TlbRange &r2) const
     {
         return va == r2.va &&
                size == r2.size &&
@@ -179,19 +225,58 @@ struct TlbRange {
 };
 
 
-struct TlbEntry {
+struct TlbEntry
+{
+    TlbEntry()
+    {}
+
+    TlbEntry(Addr asn, Addr vaddr, Addr paddr)
+    {
+        uint64_t entry = 0;
+        entry |= 1ULL << 1; // Writable
+        entry |= 0ULL << 2; // Available in nonpriveleged mode
+        entry |= 0ULL << 3; // No side effects
+        entry |= 1ULL << 4; // Virtually cachable
+        entry |= 1ULL << 5; // Physically cachable
+        entry |= 0ULL << 6; // Not locked
+        entry |= mbits(paddr, 39, 13); // Physical address
+        entry |= 0ULL << 48; // size = 8k
+        entry |= 0uLL << 59; // Endianness not inverted
+        entry |= 0ULL << 60; // Not no fault only
+        entry |= 0ULL << 61; // size = 8k
+        entry |= 1ULL << 63; // valid
+        pte = PageTableEntry(entry);
+
+        range.va = vaddr;
+        range.size = 8*(1<<10);
+        range.contextId = asn;
+        range.partitionId = 0;
+        range.real = false;
+
+        valid = true;
+    }
+
     TlbRange range;
     PageTableEntry pte;
     bool used;
     bool valid;
 
+    Addr pageStart()
+    {
+        return pte.paddr();
+    }
+
+    void
+    updateVaddr(Addr new_vaddr)
+    {
+        range.va = new_vaddr;
+    }
+
     void serialize(std::ostream &os);
     void unserialize(Checkpoint *cp, const std::string &section);
-
 };
 
-
-}; // namespace SparcISA
+} // namespace SparcISA
 
 #endif // __ARCH_SPARC_PAGE_TABLE_HH__