diff -r 86069e541d52 -r 213cbbd216aa src/arch/mips/faults.hh --- a/src/arch/mips/faults.hh Mon Sep 12 05:29:29 2011 -0700 +++ b/src/arch/mips/faults.hh Mon Sep 12 05:30:17 2011 -0700 @@ -100,6 +100,7 @@ class AddressErrorFault : public MipsFault { public: + AddressErrorFault(Addr vaddr) { badVAddr = vaddr; } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInstPtr inst = StaticInst::nullStaticInstPtr); @@ -110,6 +111,7 @@ class StoreAddressErrorFault : public MipsFault { public: + StoreAddressErrorFault(Addr vaddr) { badVAddr = vaddr; } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInstPtr inst = StaticInst::nullStaticInstPtr); @@ -254,6 +256,14 @@ class ItbRefillFault : public MipsFault { public: + ItbRefillFault(Addr asid, Addr vaddr, Addr vpn) + { + entryHiAsid = asid; + entryHiVPN2 = vpn >> 2; + entryHiVPN2X = vpn & 0x3; + badVAddr = vaddr; + contextBadVPN2 = vpn >> 2; + } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInstPtr inst = StaticInst::nullStaticInstPtr); @@ -263,6 +273,14 @@ class DtbRefillFault : public MipsFault { public: + DtbRefillFault(Addr asid, Addr vaddr, Addr vpn) + { + entryHiAsid = asid; + entryHiVPN2 = vpn >> 2; + entryHiVPN2X = vpn & 0x3; + badVAddr = vaddr; + contextBadVPN2 = vpn >> 2; + } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInstPtr inst = StaticInst::nullStaticInstPtr); @@ -281,6 +299,14 @@ class ItbInvalidFault : public MipsFault { public: + ItbInvalidFault(Addr asid, Addr vaddr, Addr vpn) + { + entryHiAsid = asid; + entryHiVPN2 = vpn >> 2; + entryHiVPN2X = vpn & 0x3; + badVAddr = vaddr; + contextBadVPN2 = vpn >> 2; + } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInstPtr inst = StaticInst::nullStaticInstPtr); @@ -290,6 +316,14 @@ class TLBModifiedFault : public MipsFault { public: + TLBModifiedFault(Addr asid, Addr vaddr, Addr vpn) + { + entryHiAsid = asid; + entryHiVPN2 = vpn >> 2; + entryHiVPN2X = vpn & 0x3; + badVAddr = vaddr; + contextBadVPN2 = vpn >> 2; + } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInstPtr inst = StaticInst::nullStaticInstPtr); @@ -299,6 +333,14 @@ class DtbInvalidFault : public MipsFault { public: + DtbInvalidFault(Addr asid, Addr vaddr, Addr vpn) + { + entryHiAsid = asid; + entryHiVPN2 = vpn >> 2; + entryHiVPN2X = vpn & 0x3; + badVAddr = vaddr; + contextBadVPN2 = vpn >> 2; + } #if FULL_SYSTEM void invoke(ThreadContext * tc, StaticInst::StaticInstPtr inst = nullStaticInstPtr); diff -r 86069e541d52 -r 213cbbd216aa src/arch/mips/tlb.cc --- a/src/arch/mips/tlb.cc Mon Sep 12 05:29:29 2011 -0700 +++ b/src/arch/mips/tlb.cc Mon Sep 12 05:30:17 2011 -0700 @@ -311,10 +311,7 @@ req->setPaddr(KSeg02Phys(vaddr)); if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel || misaligned) { - AddressErrorFault *Flt = new AddressErrorFault(); - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - return Flt; + return new AddressErrorFault(vaddr); } } else if(IsKSeg1(vaddr)) { // Address will not be translated through TLB, set response, and go! @@ -334,10 +331,7 @@ uint8_t Asid = req->getAsid(); if (misaligned) { // Unaligned address! - AddressErrorFault *Flt = new AddressErrorFault(); - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - return Flt; + return new AddressErrorFault(vaddr); } PTE *pte = lookup(VPN,Asid); if (pte != NULL) { @@ -356,19 +350,7 @@ } if (Valid == false) { - //Invalid entry - ItbInvalidFault *Flt = new ItbInvalidFault(); - /* EntryHi VPN, ASID fields must be set */ - Flt->entryHiAsid = Asid; - Flt->entryHiVPN2 = (VPN >> 2); - Flt->entryHiVPN2X = (VPN & 0x3); - - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - - /* Context must be set */ - Flt->contextBadVPN2 = (VPN >> 2); - return Flt; + return new ItbInvalidFault(Asid, vaddr, vpn); } else { // Ok, this is really a match, set paddr Addr PAddr; @@ -384,18 +366,7 @@ } } else { // Didn't find any match, return a TLB Refill Exception - ItbRefillFault *Flt = new ItbRefillFault(); - /* EntryHi VPN, ASID fields must be set */ - Flt->entryHiAsid = Asid; - Flt->entryHiVPN2 = (VPN >> 2); - Flt->entryHiVPN2X = (VPN & 0x3); - - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - - /* Context must be set */ - Flt->contextBadVPN2 = (VPN >> 2); - return Flt; + return new ItbRefillFault(Asid, vaddr, vpn); } } return checkCacheability(req); @@ -435,11 +406,7 @@ req->setPaddr(KSeg02Phys(vaddr)); if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel || misaligned) { - StoreAddressErrorFault *Flt = new StoreAddressErrorFault(); - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - - return Flt; + return new StoreAddressErrorFault(vaddr); } } else if(IsKSeg1(vaddr)) { // Address will not be translated through TLB, set response, and go! @@ -457,11 +424,7 @@ uint8_t Asid = req->getAsid(); PTE *pte = lookup(VPN, Asid); if (misaligned) { - // Unaligned address! - StoreAddressErrorFault *Flt = new StoreAddressErrorFault(); - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - return Flt; + return new StoreAddressErrorFault(vaddr); } if (pte != NULL) { // Ok, found something @@ -482,35 +445,11 @@ } if (Valid == false) { - //Invalid entry - DtbInvalidFault *Flt = new DtbInvalidFault(); - /* EntryHi VPN, ASID fields must be set */ - Flt->entryHiAsid = Asid; - Flt->entryHiVPN2 = (VPN>>2); - Flt->entryHiVPN2X = (VPN & 0x3); - - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - - /* Context must be set */ - Flt->contextBadVPN2 = (VPN >> 2); - - return Flt; + return new DtbInvalidFault(Asid, vaddr, VPN); } else { // Ok, this is really a match, set paddr if (!Dirty) { - TLBModifiedFault *Flt = new TLBModifiedFault(); - /* EntryHi VPN, ASID fields must be set */ - Flt->entryHiAsid = Asid; - Flt->entryHiVPN2 = (VPN >> 2); - Flt->entryHiVPN2X = (VPN & 0x3); - - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - - /* Context must be set */ - Flt->contextBadVPN2 = (VPN >> 2); - return Flt; + return new TLBModifiedFault(Asid, vaddr, VPN); } Addr PAddr; if (EvenOdd == 0) { @@ -525,18 +464,7 @@ } } else { // Didn't find any match, return a TLB Refill Exception - DtbRefillFault *Flt = new DtbRefillFault(); - /* EntryHi VPN, ASID fields must be set */ - Flt->entryHiAsid = Asid; - Flt->entryHiVPN2 = (VPN >> 2); - Flt->entryHiVPN2X = (VPN & 0x3); - - /* BadVAddr must be set */ - Flt->badVAddr = vaddr; - - /* Context must be set */ - Flt->contextBadVPN2 = (VPN >> 2); - return Flt; + return new DtbRefillFault(Asid, vaddr, VPN); } } return checkCacheability(req);