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"
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)
{

View 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)
{}
};
};

View 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)
{}
};
};

View 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");

View file

@ -39,56 +39,14 @@
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__