sim: Move the BaseTLB to src/arch/generic/
[gem5.git] / src / arch / mips / tlb.hh
index cff805bef08198e29b7108f29533a5ef90254c6c..c7cd5e63189c8eacd64682c9c8e5f30d69791779 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2006 The Regents of The University of Michigan
+ * Copyright (c) 2001-2005 The Regents of The University of Michigan
+ * Copyright (c) 2007 MIPS Technologies, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * Authors: Gabe Black
+ * Authors: Nathan Binkert
+ *          Steve Reinhardt
+ *          Jaidev Patwardhan
+ *          Korey Sewell
  */
 
 #ifndef __ARCH_MIPS_TLB_HH__
 #define __ARCH_MIPS_TLB_HH__
 
-#include "params/MipsDTB.hh"
-#include "params/MipsITB.hh"
-#include "sim/tlb.hh"
+#include <map>
 
-namespace MipsISA
+#include "arch/generic/tlb.hh"
+#include "arch/mips/isa_traits.hh"
+#include "arch/mips/pagetable.hh"
+#include "arch/mips/utility.hh"
+#include "arch/mips/vtophys.hh"
+#include "base/statistics.hh"
+#include "mem/request.hh"
+#include "params/MipsTLB.hh"
+#include "sim/sim_object.hh"
+
+class ThreadContext;
+
+/* MIPS does not distinguish between a DTLB and an ITLB -> unified TLB
+   However, to maintain compatibility with other architectures, we'll
+   simply create an ITLB and DTLB that will point to the real TLB */
+namespace MipsISA {
+
+class TLB : public BaseTLB
 {
-    struct TlbEntry
-    {
-        Addr _pageStart;
-        TlbEntry() {}
-        TlbEntry(Addr asn, Addr vaddr, Addr paddr) : _pageStart(paddr) {}
+  protected:
+    typedef std::multimap<Addr, int> PageTable;
+    PageTable lookupTable;      // Quick lookup into page table
 
-        Addr pageStart()
-        {
-            return _pageStart;
-        }
+    MipsISA::PTE *table;        // the Page Table
+    int size;                   // TLB Size
+    int nlu;                    // not last used entry (for replacement)
 
-        void serialize(std::ostream &os);
-        void unserialize(Checkpoint *cp, const std::string &section);
-    };
+    void nextnlu() { if (++nlu >= size) nlu = 0; }
+    MipsISA::PTE *lookup(Addr vpn, uint8_t asn) const;
 
-    class TLB : public GenericTLB
-    {
-      public:
-        typedef MipsTLBParams Params;
-        TLB(const Params *p) : GenericTLB(p)
-        {}
+    mutable Stats::Scalar read_hits;
+    mutable Stats::Scalar read_misses;
+    mutable Stats::Scalar read_acv;
+    mutable Stats::Scalar read_accesses;
+    mutable Stats::Scalar write_hits;
+    mutable Stats::Scalar write_misses;
+    mutable Stats::Scalar write_acv;
+    mutable Stats::Scalar write_accesses;
+    Stats::Formula hits;
+    Stats::Formula misses;
+    Stats::Formula accesses;
 
-        Fault translate(RequestPtr req, ThreadContext *tc, bool=false);
-    };
+  public:
+    typedef MipsTLBParams Params;
+    TLB(const Params *p);
 
-    class ITB : public TLB
-    {
-      public:
-        typedef MipsITBParams Params;
-        ITB(const Params *p) : TLB(p)
-        {}
-    };
+    int probeEntry(Addr vpn,uint8_t) const;
+    MipsISA::PTE *getEntry(unsigned) const;
+    virtual ~TLB();
+
+    void takeOverFrom(BaseTLB *otlb) {}
 
-    class DTB : public TLB
+    int smallPages;
+    int getsize() const { return size; }
+
+    MipsISA::PTE &index(bool advance = true);
+    void insert(Addr vaddr, MipsISA::PTE &pte);
+    void insertAt(MipsISA::PTE &pte, unsigned Index, int _smallPages);
+    void flushAll();
+    void demapPage(Addr vaddr, uint64_t asn)
     {
-      public:
-        typedef MipsDTBParams Params;
-        DTB(const Params *p) : TLB(p)
-        {}
-    };
+        panic("demapPage unimplemented.\n");
+    }
+
+    // static helper functions... really
+    static bool validVirtualAddress(Addr vaddr);
+
+    static Fault checkCacheability(RequestPtr &req);
+
+    // Checkpointing
+    void serialize(std::ostream &os);
+    void unserialize(Checkpoint *cp, const std::string &section);
+
+    void regStats();
+
+    Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode);
+    void translateTiming(RequestPtr req, ThreadContext *tc,
+            Translation *translation, Mode mode);
+
+    /** Function stub for CheckerCPU compilation issues. MIPS does not
+     *  support the Checker model at the moment.
+     */
+    Fault translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode);
+    Fault finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const;
+
+  private:
+    Fault translateInst(RequestPtr req, ThreadContext *tc);
+    Fault translateData(RequestPtr req, ThreadContext *tc, bool write);
 };
 
-#endif // __ARCH_MIPS_TLB_HH__
+}
+
+
+
+#endif // __MIPS_MEMORY_HH__