36a37,39
> #include "arch/mips/pra_constants.hh"
> #include "cpu/thread_context.hh"
> #include "debug/MipsPRA.hh"
56,60d58
< Addr badVAddr;
< Addr entryHiAsid;
< Addr entryHiVPN2;
< Addr entryHiVPN2X;
< Addr contextBadVPN2;
79a78,118
> template <typename T>
> class AddressFault : public MipsFault<T>
> {
> protected:
> Addr vaddr;
> bool store;
>
> AddressFault(Addr _vaddr, bool _store) : vaddr(_vaddr), store(_store)
> {}
> };
>
> template <typename T>
> class TlbFault : public AddressFault<T>
> {
> protected:
> Addr asid;
> Addr vpn;
>
> TlbFault(Addr _asid, Addr _vaddr, Addr _vpn, bool _store) :
> AddressFault<T>(_vaddr, _store), asid(_asid), vpn(_vpn)
> {}
>
> void
> setTlbExceptionState(ThreadContext *tc, uint8_t excCode)
> {
> DPRINTF(MipsPRA, "%s encountered.\n", name());
> this->setExceptionState(tc, excCode);
>
> tc->setMiscRegNoEffect(MISCREG_BADVADDR, this->vaddr);
> EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
> entryHi.asid = this->asid;
> entryHi.vpn2 = this->vpn >> 2;
> entryHi.vpn2x = this->vpn & 0x3;
> tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);
>
> ContextReg context = tc->readMiscReg(MISCREG_CONTEXT);
> context.badVPN2 = this->vpn >> 2;
> tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
> }
> };
>
97c136
< class AddressErrorFault : public MipsFault<AddressErrorFault>
---
> class AddressErrorFault : public AddressFault<AddressErrorFault>
99,101d137
< protected:
< Addr vaddr;
< bool store;
103c139,140
< AddressErrorFault(Addr _vaddr, bool _store) : vaddr(_vaddr), store(_store)
---
> AddressErrorFault(Addr _vaddr, bool _store) :
> AddressFault<AddressErrorFault>(_vaddr, _store)
202c239
< class TlbRefillFault : public MipsFault<TlbRefillFault>
---
> class TlbRefillFault : public TlbFault<TlbRefillFault>
204,205d240
< protected:
< bool store;
207,215c242,244
< TlbRefillFault(Addr asid, Addr vaddr, Addr vpn, bool _store) :
< store(_store)
< {
< entryHiAsid = asid;
< entryHiVPN2 = vpn >> 2;
< entryHiVPN2X = vpn & 0x3;
< badVAddr = vaddr;
< contextBadVPN2 = vpn >> 2;
< }
---
> TlbRefillFault(Addr asid, Addr vaddr, Addr vpn, bool store) :
> TlbFault<TlbRefillFault>(asid, vaddr, vpn, store)
> {}
222c251
< class TlbInvalidFault : public MipsFault<TlbInvalidFault>
---
> class TlbInvalidFault : public TlbFault<TlbInvalidFault>
224,225d252
< protected:
< bool store;
227,235c254,256
< TlbInvalidFault(Addr asid, Addr vaddr, Addr vpn, bool _store) :
< store(_store)
< {
< entryHiAsid = asid;
< entryHiVPN2 = vpn >> 2;
< entryHiVPN2X = vpn & 0x3;
< badVAddr = vaddr;
< contextBadVPN2 = vpn >> 2;
< }
---
> TlbInvalidFault(Addr asid, Addr vaddr, Addr vpn, bool store) :
> TlbFault<TlbInvalidFault>(asid, vaddr, vpn, store)
> {}
242c263
< class TLBModifiedFault : public MipsFault<TLBModifiedFault>
---
> class TlbModifiedFault : public TlbFault<TlbModifiedFault>
245,252c266,268
< TLBModifiedFault(Addr asid, Addr vaddr, Addr vpn)
< {
< entryHiAsid = asid;
< entryHiVPN2 = vpn >> 2;
< entryHiVPN2X = vpn & 0x3;
< badVAddr = vaddr;
< contextBadVPN2 = vpn >> 2;
< }
---
> TlbModifiedFault(Addr asid, Addr vaddr, Addr vpn) :
> TlbFault<TlbModifiedFault>(asid, vaddr, vpn, false)
> {}