29,30c29,30
< * Authors: Gabe Black
< * Stephen Hines
---
> * Authors: Ali Saidi
> * Gabe Black
35a36,37
> #include "arch/arm/types.hh"
> #include "config/full_system.hh"
42c44
< typedef const Addr FaultVect;
---
> typedef const Addr FaultOffset;
44c46
< class ArmFault : public FaultBase
---
> class ArmFaultBase : public FaultBase
47,62c49
< virtual bool skipFaultingInstruction() {return false;}
< virtual bool setRestartAddress() {return true;}
< public:
< Addr BadVAddr;
< Addr EntryHi_Asid;
< Addr EntryHi_VPN2;
< Addr EntryHi_VPN2X;
< Addr Context_BadVPN2;
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc) {};
< void setExceptionState(ThreadContext *,uint8_t);
< void setHandlerPC(Addr,ThreadContext *);
< #endif
< virtual FaultVect vect() = 0;
< virtual FaultStat & countStat() = 0;
< };
---
> Addr getVector(ThreadContext *tc);
64,69d50
< class MachineCheckFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
71,75c52,62
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< bool isMachineCheckFault() {return true;}
< };
---
> struct FaultVals
> {
> const FaultName name;
> const FaultOffset offset;
> const OperatingMode nextMode;
> const uint8_t armPcOffset;
> const uint8_t thumbPcOffset;
> const bool abortDisable;
> const bool fiqDisable;
> FaultStat count;
> };
77,112d63
< class NonMaskableInterrupt : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< bool isNonMaskableInterrupt() {return true;}
< };
<
< class AlignmentFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< bool isAlignmentFault() {return true;}
< };
<
< class AddressErrorFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
114c65
< void invoke(ThreadContext * tc);
---
> void invoke(ThreadContext *tc);
116c67,73
<
---
> virtual FaultStat& countStat() = 0;
> virtual FaultOffset offset() = 0;
> virtual OperatingMode nextMode() = 0;
> virtual uint8_t armPcOffset() = 0;
> virtual uint8_t thumbPcOffset() = 0;
> virtual bool abortDisable() = 0;
> virtual bool fiqDisable() = 0;
118,130d74
< class StoreAddressErrorFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
132,133c76,77
< };
< class UnimplementedOpcodeFault : public ArmFault
---
> template<typename T>
> class ArmFault : public ArmFaultBase
135,354d78
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
<
< class TLBRefillIFetchFault : public ArmFault
< {
< private:
< Addr vaddr;
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
< class TLBInvalidIFetchFault : public ArmFault
< {
< private:
< Addr vaddr;
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<
< class NDtbMissFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class PDtbMissFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class DtbPageFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class DtbAcvFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class CacheErrorFault : public ArmFault
< {
< private:
< Addr vaddr;
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<
<
<
<
< static inline Fault genMachineCheckFault()
< {
< return new MachineCheckFault;
< }
<
< static inline Fault genAlignmentFault()
< {
< return new AlignmentFault;
< }
<
< class ResetFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
<
< };
< class SystemCallFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<
< class SoftResetFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
< class DebugSingleStep : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
< class DebugInterrupt : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<
< class CoprocessorUnusableFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< int coProcID;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< CoprocessorUnusableFault(int _procid){ coProcID = _procid;}
< };
<
< class ReservedInstructionFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<
< class ThreadFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<
<
< class ArithmeticFault : public ArmFault
< {
356,368c80
< bool skipFaultingInstruction() {return true;}
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
< };
---
> static FaultVals vals;
370,377d81
< class InterruptFault : public ArmFault
< {
< protected:
< bool setRestartAddress() {return false;}
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
379,387c83,90
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
<
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
<
< //void invoke(ThreadContext * tc);
---
> FaultName name() const { return vals.name; }
> FaultStat & countStat() {return vals.count;}
> FaultOffset offset() { return vals.offset; }
> OperatingMode nextMode() { return vals.nextMode; }
> uint8_t armPcOffset() { return vals.armPcOffset; }
> uint8_t thumbPcOffset() { return vals.thumbPcOffset; }
> bool abortDisable() { return vals.abortDisable; }
> bool fiqDisable() { return vals.fiqDisable; }
390,403d92
< class TrapFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
< };
405,418c94,100
< class BreakpointFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
< };
---
> class Reset : public ArmFault<Reset> {};
> class UndefinedInstruction : public ArmFault<UndefinedInstruction> {};
> class SupervisorCall : public ArmFault<SupervisorCall> {};
> class PrefetchAbort : public ArmFault<PrefetchAbort> {};
> class DataAbort : public ArmFault<DataAbort> {};
> class Interrupt : public ArmFault<Interrupt> {};
> class FastInterrupt : public ArmFault<FastInterrupt> {};
420,447d101
< class ItbRefillFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
< };
< class DtbRefillFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
< };
449,571d102
< class ItbPageFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
< };
<
< class ItbInvalidFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
<
< };
< class TLBModifiedFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
<
< };
<
< class DtbInvalidFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< #if FULL_SYSTEM
< void invoke(ThreadContext * tc);
< #endif
<
< };
<
< class FloatEnableFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class ItbMissFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class ItbAcvFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class IntegerOverflowFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< };
<
< class DspStateDisabledFault : public ArmFault
< {
< private:
< static FaultName _name;
< static FaultVect _vect;
< static FaultStat _count;
< public:
< FaultName name() const {return _name;}
< FaultVect vect() {return _vect;}
< FaultStat & countStat() {return _count;}
< void invoke(ThreadContext * tc);
< };
<