Address translation: De-templatize the GenericTLB class.
authorGabe Black <gblack@eecs.umich.edu>
Tue, 28 Aug 2007 21:30:50 +0000 (14:30 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 28 Aug 2007 21:30:50 +0000 (14:30 -0700)
--HG--
extra : convert_revision : b605a90a4a1071e39f49085a839fdcd175e09fdb

src/arch/mips/tlb.cc
src/arch/mips/tlb.hh
src/arch/x86/tlb.hh
src/sim/tlb.cc
src/sim/tlb.hh

index 71111b8435c40054179110515a8d5f57b99e0f18..41a26aba1163c6e2025a77063e57f368f53b41d9 100644 (file)
 #include "params/MipsITB.hh"
 
 namespace MipsISA {
+    Fault
+    TLB::translate(RequestPtr req, ThreadContext *tc, bool)
+    {
+        Fault fault = GenericTLB::translate(req, tc);
+        if (fault != NoFault)
+            return fault;
+
+        typeof(req->getSize()) size = req->getSize();
+        Addr paddr = req->getPaddr();
+
+        if (!isPowerOf2(size))
+            panic("Invalid request size!\n");
+        if ((size - 1) & paddr)
+            return new GenericAlignmentFault(paddr);
+
+        return NoFault;
+    }
+
     void
     TlbEntry::serialize(std::ostream &os)
     {
index 6025de4c01f931e5f75cd7f1e7818a242c8ed8e9..682aa76542ad25ce6fa8aada19051cd14287717b 100644 (file)
@@ -45,17 +45,26 @@ namespace MipsISA
         void unserialize(Checkpoint *cp, const std::string &section);
     };
 
-    class ITB : public GenericITB<>
+    class TLB : public GenericTLB
     {
       public:
-        ITB(const std::string &name) : GenericITB<>(name)
+        TLB(const std::string &name) : GenericTLB(name)
+        {}
+
+        Fault translate(RequestPtr req, ThreadContext *tc, bool=false);
+    };
+
+    class ITB : public TLB
+    {
+      public:
+        ITB(const std::string &name) : TLB(name)
         {}
     };
 
-    class DTB : public GenericDTB<>
+    class DTB : public TLB
     {
       public:
-        DTB(const std::string &name) : GenericDTB<>(name)
+        DTB(const std::string &name) : TLB(name)
         {}
     };
 };
index 4cf65ac081ef00ad6cfb70c0a1c5042b59b567b6..6622f5dc22c48b62d2731a759dd12a872b039f93 100644 (file)
@@ -78,17 +78,17 @@ namespace X86ISA
         void unserialize(Checkpoint *cp, const std::string &section);
     };
 
-    class ITB : public GenericITB<false, false>
+    class ITB : public GenericTLB
     {
       public:
-        ITB(const std::string &name) : GenericITB<false, false>(name)
+        ITB(const std::string &name) : GenericTLB(name)
         {}
     };
 
-    class DTB : public GenericDTB<false, false>
+    class DTB : public GenericTLB
     {
       public:
-        DTB(const std::string &name) : GenericDTB<false, false>(name)
+        DTB(const std::string &name) : GenericTLB(name)
         {}
     };
 };
index 5ceec637e2582c6b0506b4c454849f8ba93b5a67..de677983960c5a9d662040bfedef8f61f7879b44 100644 (file)
@@ -34,7 +34,7 @@
 #include "sim/tlb.hh"
 
 Fault
-GenericTLBBase::translate(RequestPtr req, ThreadContext * tc)
+GenericTLB::translate(RequestPtr req, ThreadContext * tc, bool)
 {
 #if FULL_SYSTEM
         panic("Generic translation shouldn't be used in full system mode.\n");
index c4c171015566ec8469d9e5abaced85c75a1d4725..4239b4cf30bf6857cd1bb822aa652e9a39122ce0 100644 (file)
 class ThreadContext;
 class Packet;
 
-class GenericTLBBase : public SimObject
+class GenericTLB : public SimObject
 {
   protected:
-    GenericTLBBase(const std::string &name) : SimObject(name)
+    GenericTLB(const std::string &name) : SimObject(name)
     {}
 
-    Fault translate(RequestPtr req, ThreadContext *tc);
-};
-
-template <bool doSizeCheck=true, bool doAlignmentCheck=true>
-class GenericTLB : public GenericTLBBase
-{
-  public:
-    GenericTLB(const std::string &name) : GenericTLBBase(name)
-    {}
-
-    Fault translate(RequestPtr req, ThreadContext *tc, bool=false)
-    {
-        Fault fault = GenericTLBBase::translate(req, tc);
-        if (fault != NoFault)
-            return fault;
-
-        typeof(req->getSize()) size = req->getSize();
-        Addr paddr = req->getPaddr();
-
-        if(doSizeCheck && !isPowerOf2(size))
-            panic("Invalid request size!\n");
-        if (doAlignmentCheck && ((size - 1) & paddr))
-            return new GenericAlignmentFault(paddr);
-
-        return NoFault;
-    }
-};
-
-template <bool doSizeCheck=true, bool doAlignmentCheck=true>
-class GenericITB : public GenericTLB<doSizeCheck, doAlignmentCheck>
-{
   public:
-    GenericITB(const std::string &name) :
-        GenericTLB<doSizeCheck, doAlignmentCheck>(name)
-    {}
-};
-
-template <bool doSizeCheck=true, bool doAlignmentCheck=true>
-class GenericDTB : public GenericTLB<doSizeCheck, doAlignmentCheck>
-{
-  public:
-    GenericDTB(const std::string &name) :
-        GenericTLB<doSizeCheck, doAlignmentCheck>(name)
-    {}
+    Fault translate(RequestPtr req, ThreadContext *tc, bool=false);
 };
 
 #endif // __ARCH_SPARC_TLB_HH__