changeset ea93f18eead8 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=ea93f18eead8
description:
MIPS: Consolidate the two AddressErrorFault variants.
diffstat:
src/arch/mips/faults.cc | 21 ++-------------------
src/arch/mips/faults.hh | 16 +++++-----------
src/arch/mips/tlb.cc | 13 +++++--------
3 files changed, 12 insertions(+), 38 deletions(-)
diffs (130 lines):
diff -r 498d3aacd292 -r ea93f18eead8 src/arch/mips/faults.cc
--- a/src/arch/mips/faults.cc Mon Sep 19 06:17:20 2011 -0700
+++ b/src/arch/mips/faults.cc Mon Sep 19 06:17:20 2011 -0700
@@ -61,9 +61,6 @@
template <> FaultVals MipsFault<AddressErrorFault>::vals =
{ "Address Error", 0x0180 };
-template <> FaultVals MipsFault<StoreAddressErrorFault>::vals =
- { "Store Address Error", 0x0180 };
-
template <> FaultVals MipsFault<SystemCallFault>::vals =
{ "Syscall", 0x0180 };
@@ -177,20 +174,6 @@
}
void
-StoreAddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
-{
- DPRINTF(MipsPRA, "%s encountered.\n", name());
- setExceptionState(tc, 0x5);
- tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
-
- // Set new PC
- Addr HandlerBase;
- // Offset 0x180 - General Exception Vector
- HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
- setHandlerPC(HandlerBase, tc);
-}
-
-void
TrapFault::invoke(ThreadContext *tc, StaticInstPtr inst)
{
DPRINTF(MipsPRA, "%s encountered.\n", name());
@@ -244,8 +227,8 @@
AddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
{
DPRINTF(MipsPRA, "%s encountered.\n", name());
- setExceptionState(tc, 0x4);
- tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr);
+ setExceptionState(tc, store ? 0x5 : 0x4);
+ tc->setMiscRegNoEffect(MISCREG_BADVADDR, vaddr);
// Set new PC
Addr HandlerBase;
diff -r 498d3aacd292 -r ea93f18eead8 src/arch/mips/faults.hh
--- a/src/arch/mips/faults.hh Mon Sep 19 06:17:20 2011 -0700
+++ b/src/arch/mips/faults.hh Mon Sep 19 06:17:20 2011 -0700
@@ -93,8 +93,12 @@
class AddressErrorFault : public MipsFault<AddressErrorFault>
{
+ protected:
+ Addr vaddr;
+ bool store;
public:
- AddressErrorFault(Addr vaddr) { badVAddr = vaddr; }
+ AddressErrorFault(Addr _vaddr, bool _store) : vaddr(_vaddr), store(_store)
+ {}
#if FULL_SYSTEM
void invoke(ThreadContext * tc,
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
@@ -102,16 +106,6 @@
};
-class StoreAddressErrorFault : public MipsFault<StoreAddressErrorFault>
-{
- public:
- StoreAddressErrorFault(Addr vaddr) { badVAddr = vaddr; }
-#if FULL_SYSTEM
- void invoke(ThreadContext * tc,
- StaticInstPtr inst = StaticInst::nullStaticInstPtr);
-#endif
-};
-
static inline Fault genMachineCheckFault()
{
return new MachineCheckFault;
diff -r 498d3aacd292 -r ea93f18eead8 src/arch/mips/tlb.cc
--- a/src/arch/mips/tlb.cc Mon Sep 19 06:17:20 2011 -0700
+++ b/src/arch/mips/tlb.cc Mon Sep 19 06:17:20 2011 -0700
@@ -313,7 +313,7 @@
req->setPaddr(KSeg02Phys(vaddr));
if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel ||
misaligned) {
- return new AddressErrorFault(vaddr);
+ return new AddressErrorFault(vaddr, false);
}
} else if(IsKSeg1(vaddr)) {
// Address will not be translated through TLB, set response, and go!
@@ -333,7 +333,7 @@
uint8_t Asid = req->getAsid();
if (misaligned) {
// Unaligned address!
- return new AddressErrorFault(vaddr);
+ return new AddressErrorFault(vaddr, false);
}
PTE *pte = lookup(VPN,Asid);
if (pte != NULL) {
@@ -387,10 +387,7 @@
if (req->getVaddr() & (req->getSize() - 1)) {
DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(),
req->getSize());
- if (write)
- return new StoreAddressErrorFault(req->getVaddr());
- else
- return new AddressErrorFault(req->getVaddr());
+ return new AddressErrorFault(req->getVaddr(), write);
}
@@ -411,7 +408,7 @@
req->setPaddr(KSeg02Phys(vaddr));
if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel ||
misaligned) {
- return new StoreAddressErrorFault(vaddr);
+ return new AddressErrorFault(vaddr, true);
}
} else if(IsKSeg1(vaddr)) {
// Address will not be translated through TLB, set response, and go!
@@ -429,7 +426,7 @@
uint8_t Asid = req->getAsid();
PTE *pte = lookup(VPN, Asid);
if (misaligned) {
- return new StoreAddressErrorFault(vaddr);
+ return new AddressErrorFault(vaddr, true);
}
if (pte != NULL) {
// Ok, found something
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev