49,51c49
< FaultName MachineCheckFault::_name = "Machine Check";
< FaultVect MachineCheckFault::_vect = 0x0401;
< FaultStat MachineCheckFault::_count;
---
> typedef MipsFaultBase::FaultVals FaultVals;
53,55c51,52
< FaultName AlignmentFault::_name = "Alignment";
< FaultVect AlignmentFault::_vect = 0x0301;
< FaultStat AlignmentFault::_count;
---
> template <> FaultVals MipsFault<MachineCheckFault>::vals =
> { "Machine Check", 0x0401 };
57c54,57
< FaultName ResetFault::_name = "Reset Fault";
---
> template <> FaultVals MipsFault<AlignmentFault>::vals =
> { "Alignment", 0x0301 };
>
> template <> FaultVals MipsFault<ResetFault>::vals =
59c59
< FaultVect ResetFault::_vect = 0xBFC00000;
---
> { "Reset Fault", 0xBFC00000};
61c61
< FaultVect ResetFault::_vect = 0x001;
---
> { "Reset Fault", 0x001};
63d62
< FaultStat ResetFault::_count;
65,67c64,65
< FaultName AddressErrorFault::_name = "Address Error";
< FaultVect AddressErrorFault::_vect = 0x0180;
< FaultStat AddressErrorFault::_count;
---
> template <> FaultVals MipsFault<AddressErrorFault>::vals =
> { "Address Error", 0x0180 };
69,71c67,68
< FaultName StoreAddressErrorFault::_name = "Store Address Error";
< FaultVect StoreAddressErrorFault::_vect = 0x0180;
< FaultStat StoreAddressErrorFault::_count;
---
> template <> FaultVals MipsFault<StoreAddressErrorFault>::vals =
> { "Store Address Error", 0x0180 };
72a70,71
> template <> FaultVals MipsFault<SystemCallFault>::vals =
> { "Syscall", 0x0180 };
74,76c73,74
< FaultName SystemCallFault::_name = "Syscall";
< FaultVect SystemCallFault::_vect = 0x0180;
< FaultStat SystemCallFault::_count;
---
> template <> FaultVals MipsFault<CoprocessorUnusableFault>::vals =
> { "Coprocessor Unusable Fault", 0x180 };
78,80c76,77
< FaultName CoprocessorUnusableFault::_name = "Coprocessor Unusable Fault";
< FaultVect CoprocessorUnusableFault::_vect = 0x180;
< FaultStat CoprocessorUnusableFault::_count;
---
> template <> FaultVals MipsFault<ReservedInstructionFault>::vals =
> { "Reserved Instruction Fault", 0x0180 };
82,84c79,80
< FaultName ReservedInstructionFault::_name = "Reserved Instruction Fault";
< FaultVect ReservedInstructionFault::_vect = 0x0180;
< FaultStat ReservedInstructionFault::_count;
---
> template <> FaultVals MipsFault<ThreadFault>::vals =
> { "Thread Fault", 0x00F1 };
86,88c82,83
< FaultName ThreadFault::_name = "Thread Fault";
< FaultVect ThreadFault::_vect = 0x00F1;
< FaultStat ThreadFault::_count;
---
> template <> FaultVals MipsFault<ArithmeticFault>::vals =
> { "Arithmetic Overflow Exception", 0x180 };
90,92c85,86
< FaultName ArithmeticFault::_name = "Arithmetic Overflow Exception";
< FaultVect ArithmeticFault::_vect = 0x180;
< FaultStat ArithmeticFault::_count;
---
> template <> FaultVals MipsFault<UnimplementedOpcodeFault>::vals =
> { "opdec", 0x0481 };
94,96c88,89
< FaultName UnimplementedOpcodeFault::_name = "opdec";
< FaultVect UnimplementedOpcodeFault::_vect = 0x0481;
< FaultStat UnimplementedOpcodeFault::_count;
---
> template <> FaultVals MipsFault<InterruptFault>::vals =
> { "interrupt", 0x0180 };
98,100c91,92
< FaultName InterruptFault::_name = "interrupt";
< FaultVect InterruptFault::_vect = 0x0180;
< FaultStat InterruptFault::_count;
---
> template <> FaultVals MipsFault<TrapFault>::vals =
> { "Trap", 0x0180 };
102,104c94,95
< FaultName TrapFault::_name = "Trap";
< FaultVect TrapFault::_vect = 0x0180;
< FaultStat TrapFault::_count;
---
> template <> FaultVals MipsFault<BreakpointFault>::vals =
> { "Breakpoint", 0x0180 };
106,108c97,98
< FaultName BreakpointFault::_name = "Breakpoint";
< FaultVect BreakpointFault::_vect = 0x0180;
< FaultStat BreakpointFault::_count;
---
> template <> FaultVals MipsFault<ItbInvalidFault>::vals =
> { "Invalid TLB Entry Exception (I-Fetch/LW)", 0x0180 };
110,112c100,101
< FaultName ItbInvalidFault::_name = "Invalid TLB Entry Exception (I-Fetch/LW)";
< FaultVect ItbInvalidFault::_vect = 0x0180;
< FaultStat ItbInvalidFault::_count;
---
> template <> FaultVals MipsFault<ItbPageFault>::vals =
> { "itbmiss", 0x0181 };
114,116c103,104
< FaultName ItbPageFault::_name = "itbmiss";
< FaultVect ItbPageFault::_vect = 0x0181;
< FaultStat ItbPageFault::_count;
---
> template <> FaultVals MipsFault<ItbMissFault>::vals =
> { "itbmiss", 0x0181 };
118,120c106,107
< FaultName ItbMissFault::_name = "itbmiss";
< FaultVect ItbMissFault::_vect = 0x0181;
< FaultStat ItbMissFault::_count;
---
> template <> FaultVals MipsFault<ItbAcvFault>::vals =
> { "iaccvio", 0x0081 };
122,124c109,110
< FaultName ItbAcvFault::_name = "iaccvio";
< FaultVect ItbAcvFault::_vect = 0x0081;
< FaultStat ItbAcvFault::_count;
---
> template <> FaultVals MipsFault<ItbRefillFault>::vals =
> { "TLB Refill Exception (I-Fetch/LW)", 0x0180 };
126,128c112,113
< FaultName ItbRefillFault::_name = "TLB Refill Exception (I-Fetch/LW)";
< FaultVect ItbRefillFault::_vect = 0x0180;
< FaultStat ItbRefillFault::_count;
---
> template <> FaultVals MipsFault<NDtbMissFault>::vals =
> { "dtb_miss_single", 0x0201 };
130,132c115,116
< FaultName NDtbMissFault::_name = "dtb_miss_single";
< FaultVect NDtbMissFault::_vect = 0x0201;
< FaultStat NDtbMissFault::_count;
---
> template <> FaultVals MipsFault<PDtbMissFault>::vals =
> { "dtb_miss_double", 0x0281 };
134,136c118,119
< FaultName PDtbMissFault::_name = "dtb_miss_double";
< FaultVect PDtbMissFault::_vect = 0x0281;
< FaultStat PDtbMissFault::_count;
---
> template <> FaultVals MipsFault<DtbPageFault>::vals =
> { "dfault", 0x0381 };
138,140c121,122
< FaultName DtbPageFault::_name = "dfault";
< FaultVect DtbPageFault::_vect = 0x0381;
< FaultStat DtbPageFault::_count;
---
> template <> FaultVals MipsFault<DtbAcvFault>::vals =
> { "dfault", 0x0381 };
142,144c124,125
< FaultName DtbAcvFault::_name = "dfault";
< FaultVect DtbAcvFault::_vect = 0x0381;
< FaultStat DtbAcvFault::_count;
---
> template <> FaultVals MipsFault<DtbInvalidFault>::vals =
> { "Invalid TLB Entry Exception (Store)", 0x0180 };
146,148c127,128
< FaultName DtbInvalidFault::_name = "Invalid TLB Entry Exception (Store)";
< FaultVect DtbInvalidFault::_vect = 0x0180;
< FaultStat DtbInvalidFault::_count;
---
> template <> FaultVals MipsFault<DtbRefillFault>::vals =
> { "TLB Refill Exception (Store)", 0x0180 };
150,152c130,131
< FaultName DtbRefillFault::_name = "TLB Refill Exception (Store)";
< FaultVect DtbRefillFault::_vect = 0x0180;
< FaultStat DtbRefillFault::_count;
---
> template <> FaultVals MipsFault<TLBModifiedFault>::vals =
> { "TLB Modified Exception", 0x0180 };
154,156c133,134
< FaultName TLBModifiedFault::_name = "TLB Modified Exception";
< FaultVect TLBModifiedFault::_vect = 0x0180;
< FaultStat TLBModifiedFault::_count;
---
> template <> FaultVals MipsFault<FloatEnableFault>::vals =
> { "float_enable_fault", 0x0581 };
158,160c136,137
< FaultName FloatEnableFault::_name = "float_enable_fault";
< FaultVect FloatEnableFault::_vect = 0x0581;
< FaultStat FloatEnableFault::_count;
---
> template <> FaultVals MipsFault<IntegerOverflowFault>::vals =
> { "Integer Overflow Fault", 0x0501 };
162,164c139,140
< FaultName IntegerOverflowFault::_name = "Integer Overflow Fault";
< FaultVect IntegerOverflowFault::_vect = 0x0501;
< FaultStat IntegerOverflowFault::_count;
---
> template <> FaultVals MipsFault<DspStateDisabledFault>::vals =
> { "DSP Disabled Fault", 0x001a };
166,169d141
< FaultName DspStateDisabledFault::_name = "DSP Disabled Fault";
< FaultVect DspStateDisabledFault::_vect = 0x001a;
< FaultStat DspStateDisabledFault::_count;
<
172c144
< MipsFault::setHandlerPC(Addr HandlerBase, ThreadContext *tc)
---
> MipsFaultBase::setHandlerPC(Addr HandlerBase, ThreadContext *tc)
180c152
< MipsFault::setExceptionState(ThreadContext *tc, uint8_t excCode)
---
> MipsFaultBase::setExceptionState(ThreadContext *tc, uint8_t excCode)