Address translation: De-templatize the GenericTLB class.
--HG-- extra : convert_revision : b605a90a4a1071e39f49085a839fdcd175e09fdb
This commit is contained in:
parent
3ab1913077
commit
a3367adaff
5 changed files with 39 additions and 54 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -45,17 +45,26 @@ namespace MipsISA
|
|||
void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
};
|
||||
|
||||
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)
|
||||
{}
|
||||
};
|
||||
};
|
||||
|
|
|
@ -78,17 +78,17 @@ namespace X86ISA
|
|||
void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
};
|
||||
|
||||
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)
|
||||
{}
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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__
|
||||
|
|
Loading…
Reference in a new issue