94c94
< template <> FaultVals MipsFault<TLBModifiedFault>::vals =
---
> template <> FaultVals MipsFault<TlbModifiedFault>::vals =
187c187
< TlbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst)
---
> AddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
190c190,191
< setExceptionState(tc, store ? 0x3 : 0x2);
---
> setExceptionState(tc, store ? 0x5 : 0x4);
> tc->setMiscRegNoEffect(MISCREG_BADVADDR, vaddr);
192,202d192
< tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
< EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
< entryHi.asid = entryHiAsid;
< entryHi.vpn2 = entryHiVPN2;
< entryHi.vpn2x = entryHiVPN2X;
< tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);
<
< ContextReg context = tc->readMiscReg(MISCREG_CONTEXT);
< context.badVPN2 = contextBadVPN2;
< tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
<
211c201
< AddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
---
> TlbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst)
213,216c203
< DPRINTF(MipsPRA, "%s encountered.\n", name());
< setExceptionState(tc, store ? 0x5 : 0x4);
< tc->setMiscRegNoEffect(MISCREG_BADVADDR, vaddr);
<
---
> setTlbExceptionState(tc, store ? 0x3 : 0x2);
227,228c214,215
< DPRINTF(MipsPRA, "%s encountered (%x).\n", name(), MISCREG_BADVADDR);
< setExceptionState(tc, store ? 0x3 : 0x2);
---
> // Since handler depends on EXL bit, must check EXL bit before setting it!!
> StatusReg status = tc->readMiscReg(MISCREG_STATUS);
230,239c217
< Addr HandlerBase;
< tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
< EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
< entryHi.asid = entryHiAsid;
< entryHi.vpn2 = entryHiVPN2;
< entryHi.vpn2x = entryHiVPN2X;
< tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);
< ContextReg context = tc->readMiscReg(MISCREG_CONTEXT);
< context.badVPN2 = contextBadVPN2;
< tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
---
> setTlbExceptionState(tc, store ? 0x3 : 0x2);
241,242d218
< StatusReg status = tc->readMiscReg(MISCREG_STATUS);
< // Since handler depends on EXL bit, must check EXL bit before setting it!!
255c231
< TLBModifiedFault::invoke(ThreadContext *tc, StaticInstPtr inst)
---
> TlbModifiedFault::invoke(ThreadContext *tc, StaticInstPtr inst)
257,263c233
< DPRINTF(MipsPRA, "%s encountered.\n", name());
< tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
< EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
< entryHi.asid = entryHiAsid;
< entryHi.vpn2 = entryHiVPN2;
< entryHi.vpn2x = entryHiVPN2X;
< tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);
---
> setTlbExceptionState(tc, 0x1);
265,268d234
< ContextReg context = tc->readMiscReg(MISCREG_CONTEXT);
< context.badVPN2 = contextBadVPN2;
< tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
<
273d238
< setExceptionState(tc, 0x1);
275d239
<