Merge ktlim@zizzer:/bk/m5
[gem5.git] / arch / alpha / faults.hh
index 156faa8fbe706d3f78564e09dd12272a0ccb5e1e..e8ccc6b79b21ebd26d7c06373e44be69f9c2d188 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef __ALPHA_FAULTS_HH__
 #define __ALPHA_FAULTS_HH__
 
+#include "arch/alpha/isa_traits.hh"
 #include "sim/faults.hh"
 
 // The design of the "name" and "vect" functions is in sim/faults.hh
@@ -38,53 +39,53 @@ namespace AlphaISA
 
 typedef const Addr FaultVect;
 
-class AlphaFault : public virtual FaultBase
+class AlphaFault : public FaultBase
 {
+  protected:
+    virtual bool skipFaultingInstruction() {return false;}
+    virtual bool setRestartAddress() {return true;}
   public:
 #if FULL_SYSTEM
-    void ev5_trap(ExecContext * xc);
+    void invoke(ExecContext * xc);
 #endif
     virtual FaultVect vect() = 0;
+    virtual FaultStat & countStat() = 0;
 };
 
-class AlphaMachineCheckFault :
-    public MachineCheckFault,
-    public AlphaFault
+class MachineCheckFault : public AlphaFault
 {
   private:
+    static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
-#if FULL_SYSTEM
-    void ev5_trap(ExecContext * xc);
-#endif
+    FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
+    bool isMachineCheckFault() {return true;}
 };
 
-class AlphaAlignmentFault :
-    public AlignmentFault,
-    public AlphaFault
+class AlignmentFault : public AlphaFault
 {
   private:
+    static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
-#if FULL_SYSTEM
-    void ev5_trap(ExecContext * xc);
-#endif
+    FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
+    bool isAlignmentFault() {return true;}
 };
 
 static inline Fault genMachineCheckFault()
 {
-    return new AlphaMachineCheckFault;
+    return new MachineCheckFault;
 }
 
 static inline Fault genAlignmentFault()
 {
-    return new AlphaAlignmentFault;
+    return new AlignmentFault;
 }
 
 class ResetFault : public AlphaFault
@@ -92,119 +93,208 @@ class ResetFault : public AlphaFault
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
 class ArithmeticFault : public AlphaFault
 {
+  protected:
+    bool skipFaultingInstruction() {return true;}
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ExecContext * xc);
+#endif
 };
 
 class InterruptFault : public AlphaFault
 {
+  protected:
+    bool setRestartAddress() {return false;}
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
-class NDtbMissFault : public AlphaFault
+class DtbFault : public AlphaFault
+{
+#if FULL_SYSTEM
+  private:
+    AlphaISA::VAddr vaddr;
+    uint32_t reqFlags;
+    uint64_t flags;
+  public:
+    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
+        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
+    { }
+#endif
+    FaultName name() = 0;
+    FaultVect vect() = 0;
+    FaultStat & countStat() = 0;
+#if FULL_SYSTEM
+    void invoke(ExecContext * xc);
+#endif
+};
+
+class NDtbMissFault : public DtbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+#if FULL_SYSTEM
+    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
+        : DtbFault(vaddr, reqFlags, flags)
+    { }
+#endif
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
-class PDtbMissFault : public AlphaFault
+class PDtbMissFault : public DtbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+#if FULL_SYSTEM
+    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
+        : DtbFault(vaddr, reqFlags, flags)
+    { }
+#endif
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
-class DtbPageFault : public AlphaFault
+class DtbPageFault : public DtbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+#if FULL_SYSTEM
+    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
+        : DtbFault(vaddr, reqFlags, flags)
+    { }
+#endif
+    FaultName name() {return _name;}
+    FaultVect vect() {return _vect;}
+    FaultStat & countStat() {return _count;}
+};
+
+class DtbAcvFault : public DtbFault
+{
+  private:
+    static FaultName _name;
+    static FaultVect _vect;
+    static FaultStat _count;
+  public:
+#if FULL_SYSTEM
+    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
+        : DtbFault(vaddr, reqFlags, flags)
+    { }
+#endif
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
-class DtbAcvFault : public AlphaFault
+class DtbAlignmentFault : public DtbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+#if FULL_SYSTEM
+    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
+        : DtbFault(vaddr, reqFlags, flags)
+    { }
+#endif
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
+};
+
+class ItbFault : public AlphaFault
+{
+  private:
+    Addr pc;
+  public:
+    ItbFault(Addr _pc)
+        : pc(_pc)
+    { }
+    FaultName name() = 0;
+    FaultVect vect() = 0;
+    FaultStat & countStat() = 0;
+#if FULL_SYSTEM
+    void invoke(ExecContext * xc);
+#endif
 };
 
-class ItbMissFault : public AlphaFault
+class ItbMissFault : public ItbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+    ItbMissFault(Addr pc)
+        : ItbFault(pc)
+    { }
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
-class ItbPageFault : public AlphaFault
+class ItbPageFault : public ItbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+    ItbPageFault(Addr pc)
+        : ItbFault(pc)
+    { }
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
-class ItbAcvFault : public AlphaFault
+class ItbAcvFault : public ItbFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
+    ItbAcvFault(Addr pc)
+        : ItbFault(pc)
+    { }
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
 class UnimplementedOpcodeFault : public AlphaFault
@@ -212,11 +302,11 @@ class UnimplementedOpcodeFault : public AlphaFault
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
 class FloatEnableFault : public AlphaFault
@@ -224,23 +314,25 @@ class FloatEnableFault : public AlphaFault
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
 class PalFault : public AlphaFault
 {
+  protected:
+    bool skipFaultingInstruction() {return true;}
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
 class IntegerOverflowFault : public AlphaFault
@@ -248,11 +340,11 @@ class IntegerOverflowFault : public AlphaFault
   private:
     static FaultName _name;
     static FaultVect _vect;
-    static FaultStat _stat;
+    static FaultStat _count;
   public:
     FaultName name() {return _name;}
     FaultVect vect() {return _vect;}
-    FaultStat & stat() {return _stat;}
+    FaultStat & countStat() {return _count;}
 };
 
 } // AlphaISA namespace