Address translation: Make the page table more flexible.

The page table now stores actual page table entries. It is still a templated
class here, but this will be corrected in the near future.

--HG--
extra : convert_revision : 804dcc6320414c2b3ab76a74a15295bd24e1d13d
This commit is contained in:
Gabe Black
2007-08-26 20:33:57 -07:00
parent 80d51650c8
commit 9b49a78cfd
22 changed files with 298 additions and 310 deletions

View File

@@ -56,8 +56,9 @@ void UnimpFault::invoke(ThreadContext * tc)
{
panic("Unimpfault: %s\n", panicStr.c_str());
}
#if !FULL_SYSTEM
void PageTableFault::invoke(ThreadContext *tc)
void GenericPageTableFault::invoke(ThreadContext *tc)
{
Process *p = tc->getProcessPtr();
@@ -65,4 +66,9 @@ void PageTableFault::invoke(ThreadContext *tc)
panic("Page table fault when accessing virtual address %#x\n", vaddr);
}
void GenericAlignmentFault::invoke(ThreadContext *tc)
{
panic("Alignment fault when accessing virtual address %#x\n", vaddr);
}
#endif

View File

@@ -77,13 +77,23 @@ class UnimpFault : public FaultBase
};
#if !FULL_SYSTEM
class PageTableFault : public FaultBase
class GenericPageTableFault : public FaultBase
{
private:
Addr vaddr;
public:
FaultName name() const {return "M5 page table fault";}
PageTableFault(Addr va) : vaddr(va) {}
FaultName name() const {return "Generic page table fault";}
GenericPageTableFault(Addr va) : vaddr(va) {}
void invoke(ThreadContext * tc);
};
class GenericAlignmentFault : public FaultBase
{
private:
Addr vaddr;
public:
FaultName name() const {return "Generic alignment fault";}
GenericAlignmentFault(Addr va) : vaddr(va) {}
void invoke(ThreadContext * tc);
};
#endif

View File

@@ -34,21 +34,17 @@
#include "sim/tlb.hh"
Fault
GenericITB::translate(RequestPtr &req, ThreadContext *tc)
GenericTLBBase::translate(RequestPtr req, ThreadContext * tc)
{
#if FULL_SYSTEM
panic("Generic ITB translation shouldn't be used in full system mode.\n");
panic("Generic translation shouldn't be used in full system mode.\n");
#else
return tc->getProcessPtr()->pTable->translate(req);
Process * p = tc->getProcessPtr();
Fault fault = p->pTable->translate(req);
if(fault != NoFault)
return fault;
return NoFault;
#endif
}
Fault
GenericDTB::translate(RequestPtr &req, ThreadContext *tc, bool write)
{
#if FULL_SYSTEM
panic("Generic DTB translation shouldn't be used in full system mode.\n");
#else
return tc->getProcessPtr()->pTable->translate(req);
#endif
};

View File

@@ -31,36 +31,64 @@
#ifndef __SIM_TLB_HH__
#define __SIM_TLB_HH__
#include "base/misc.hh"
#include "mem/request.hh"
#include "sim/sim_object.hh"
#include "sim/faults.hh"
#include "sim/sim_object.hh"
class ThreadContext;
class Packet;
class GenericTLB : public SimObject
class GenericTLBBase : public SimObject
{
protected:
GenericTLBBase(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) : SimObject(name)
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 Fault(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)
{}
};
class GenericITB : public GenericTLB
template <bool doSizeCheck=true, bool doAlignmentCheck=true>
class GenericDTB : public GenericTLB<doSizeCheck, doAlignmentCheck>
{
public:
GenericITB(const std::string &name) : GenericTLB(name)
GenericDTB(const std::string &name) :
GenericTLB<doSizeCheck, doAlignmentCheck>(name)
{}
Fault translate(RequestPtr &req, ThreadContext *tc);
};
class GenericDTB : public GenericTLB
{
public:
GenericDTB(const std::string &name) : GenericTLB(name)
{}
Fault translate(RequestPtr &req, ThreadContext *tc, bool write);
};
#endif // __ARCH_SPARC_TLB_HH__