Address translation: De-templatize the GenericTLB class.

--HG--
extra : convert_revision : b605a90a4a1071e39f49085a839fdcd175e09fdb
This commit is contained in:
Gabe Black 2007-08-28 14:30:50 -07:00
parent 3ab1913077
commit a3367adaff
5 changed files with 39 additions and 54 deletions

View file

@ -35,6 +35,24 @@
#include "params/MipsITB.hh" #include "params/MipsITB.hh"
namespace MipsISA { 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 void
TlbEntry::serialize(std::ostream &os) TlbEntry::serialize(std::ostream &os)
{ {

View file

@ -45,17 +45,26 @@ namespace MipsISA
void unserialize(Checkpoint *cp, const std::string &section); void unserialize(Checkpoint *cp, const std::string &section);
}; };
class ITB : public GenericITB<> class TLB : public GenericTLB
{ {
public: 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: public:
DTB(const std::string &name) : GenericDTB<>(name) DTB(const std::string &name) : TLB(name)
{} {}
}; };
}; };

View file

@ -78,17 +78,17 @@ namespace X86ISA
void unserialize(Checkpoint *cp, const std::string &section); void unserialize(Checkpoint *cp, const std::string &section);
}; };
class ITB : public GenericITB<false, false> class ITB : public GenericTLB
{ {
public: 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: public:
DTB(const std::string &name) : GenericDTB<false, false>(name) DTB(const std::string &name) : GenericTLB(name)
{} {}
}; };
}; };

View file

@ -34,7 +34,7 @@
#include "sim/tlb.hh" #include "sim/tlb.hh"
Fault Fault
GenericTLBBase::translate(RequestPtr req, ThreadContext * tc) GenericTLB::translate(RequestPtr req, ThreadContext * tc, bool)
{ {
#if FULL_SYSTEM #if FULL_SYSTEM
panic("Generic translation shouldn't be used in full system mode.\n"); panic("Generic translation shouldn't be used in full system mode.\n");

View file

@ -39,56 +39,14 @@
class ThreadContext; class ThreadContext;
class Packet; class Packet;
class GenericTLBBase : public SimObject class GenericTLB : public SimObject
{ {
protected: 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: public:
GenericTLB(const std::string &name) : GenericTLBBase(name) Fault translate(RequestPtr req, ThreadContext *tc, bool=false);
{}
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)
{}
}; };
#endif // __ARCH_SPARC_TLB_HH__ #endif // __ARCH_SPARC_TLB_HH__