Power ISA: Add an alignment fault to Power ISA and check alignment in TLB.

This commit is contained in:
Timothy M. Jones 2010-02-12 19:53:19 +00:00
parent 64999b4343
commit dd60902152
3 changed files with 48 additions and 2 deletions

View file

@ -76,6 +76,22 @@ class MachineCheckFault : public PowerFault
};
class AlignmentFault : public PowerFault
{
public:
AlignmentFault()
: PowerFault("Alignment")
{
}
bool
isAlignmentFault() const
{
return true;
}
};
static inline Fault
genMachineCheckFault()
{

View file

@ -281,9 +281,27 @@ TLB::regStats()
}
Fault
TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode)
TLB::translateInst(RequestPtr req, ThreadContext *tc)
{
// Instruction accesses must be word-aligned
if (req->getVaddr() & 0x3) {
DPRINTF(TLB, "Alignment Fault on %#x, size = %d\n", req->getVaddr(),
req->getSize());
return new AlignmentFault();
}
Process * p = tc->getProcessPtr();
Fault fault = p->pTable->translate(req);
if (fault != NoFault)
return fault;
return NoFault;
}
Fault
TLB::translateData(RequestPtr req, ThreadContext *tc, bool write)
{
#if !FULL_SYSTEM
Process * p = tc->getProcessPtr();
Fault fault = p->pTable->translate(req);
@ -291,6 +309,16 @@ TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode)
return fault;
return NoFault;
}
Fault
TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode)
{
#if !FULL_SYSTEM
if (mode == Execute)
return translateInst(req, tc);
else
return translateData(req, tc, mode == Write);
#else
fatal("translate atomic not yet implemented\n");
#endif

View file

@ -156,6 +156,8 @@ class TLB : public BaseTLB
// static helper functions... really
static bool validVirtualAddress(Addr vaddr);
static Fault checkCacheability(RequestPtr &req);
Fault translateInst(RequestPtr req, ThreadContext *tc);
Fault translateData(RequestPtr req, ThreadContext *tc, bool write);
Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode);
void translateTiming(RequestPtr req, ThreadContext *tc,
Translation *translation, Mode mode);