X86: Define a noop ExtMachInst.
[gem5.git] / src / arch / mips / faults.hh
index d8bf59cc1f67b766a8ed1d0b5ab77abadfd9309a..7a001d390bac93812804aeee165b4abd50818196 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * Copyright (c) 2007 MIPS Technologies, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -25,7 +26,9 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * Authors: Korey Sewell
+ * Authors: Gabe Black
+ *          Korey Sewell
+ *          Jaidev Patwardhan
  */
 
 #ifndef __MIPS_FAULTS_HH__
@@ -33,8 +36,6 @@
 
 #include "sim/faults.hh"
 
-// The design of the "name" and "vect" functions is in sim/faults.hh
-
 namespace MipsISA
 {
 
@@ -46,8 +47,15 @@ class MipsFault : public FaultBase
     virtual bool skipFaultingInstruction() {return false;}
     virtual bool setRestartAddress() {return true;}
   public:
+    Addr badVAddr;
+    Addr entryHiAsid;
+    Addr entryHiVPN2;
+    Addr entryHiVPN2X;
+    Addr contextBadVPN2;
 #if FULL_SYSTEM
-    void invoke(ThreadContext * tc);
+    void invoke(ThreadContext * tc) {};
+    void setExceptionState(ThreadContext *, uint8_t);
+    void setHandlerPC(Addr, ThreadContext *);
 #endif
     virtual FaultVect vect() = 0;
     virtual FaultStat & countStat() = 0;
@@ -60,12 +68,25 @@ class MachineCheckFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
     bool isMachineCheckFault() {return true;}
 };
 
+class NonMaskableInterrupt : public MipsFault
+{
+  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 MipsFault
 {
   private:
@@ -73,12 +94,149 @@ class AlignmentFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
     bool isAlignmentFault() {return true;}
 };
 
+class AddressErrorFault : public MipsFault
+{
+  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 StoreAddressErrorFault : public MipsFault
+{
+  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 UnimplementedOpcodeFault : public MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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;
@@ -96,9 +254,104 @@ class ResetFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
+    FaultVect vect() {return _vect;}
+    FaultStat & countStat() {return _count;}
+    void invoke(ThreadContext * tc);
+
+};
+
+class SystemCallFault : public MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
+{
+  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 MipsFault
@@ -110,7 +363,7 @@ class ArithmeticFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
 #if FULL_SYSTEM
@@ -127,105 +380,133 @@ class InterruptFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class NDtbMissFault : public MipsFault
+class TrapFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class PDtbMissFault : public MipsFault
+class BreakpointFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class DtbPageFault : public MipsFault
+class ItbRefillFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class DtbAcvFault : public MipsFault
+class DtbRefillFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class ItbMissFault : public MipsFault
+class ItbPageFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class ItbPageFault : public MipsFault
+class ItbInvalidFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class ItbAcvFault : public MipsFault
+class TLBModifiedFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
-class UnimplementedOpcodeFault : public MipsFault
+class DtbInvalidFault : public MipsFault
 {
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
+#if FULL_SYSTEM
+    void invoke(ThreadContext * tc);
+#endif
 };
 
 class FloatEnableFault : public MipsFault
@@ -235,21 +516,31 @@ class FloatEnableFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
 };
 
-class PalFault : public MipsFault
+class ItbMissFault : public MipsFault
+{
+  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 MipsFault
 {
-  protected:
-    bool skipFaultingInstruction() {return true;}
   private:
     static FaultName _name;
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
 };
@@ -261,11 +552,24 @@ class IntegerOverflowFault : public MipsFault
     static FaultVect _vect;
     static FaultStat _count;
   public:
-    FaultName name() {return _name;}
+    FaultName name() const {return _name;}
     FaultVect vect() {return _vect;}
     FaultStat & countStat() {return _count;}
 };
 
+class DspStateDisabledFault : public MipsFault
+{
+  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);
+};
+
 } // MipsISA namespace
 
-#endif // __FAULTS_HH__
+#endif // __MIPS_FAULTS_HH__