sparc: Return debug faults from unimplemented instructions.
authorGabe Black <gabeblack@google.com>
Tue, 7 Nov 2017 03:25:21 +0000 (19:25 -0800)
committerGabe Black <gabeblack@google.com>
Wed, 22 Nov 2017 00:23:23 +0000 (00:23 +0000)
These had been marked as non-speculative so that their execute
functions would only be called if the instruction should really be
executed. Instead, we can return faults which will cause the same
behavior when the instruction is committed and let the instruction
execute as normal.

Change-Id: I39fa5073e93399424144724b99bdc12070e42286
Reviewed-on: https://gem5-review.googlesource.com/5465
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/arch/sparc/insts/unimp.hh

index c0d97858fcb69120787e6504219f640bb52192b3..a63443a4cd132cb448c77332513e90374c3a02e0 100644 (file)
@@ -31,6 +31,9 @@
 #ifndef __ARCH_SPARC_INSTS_UNIMP_HH__
 #define __ARCH_SPARC_INSTS_UNIMP_HH__
 
+#include <memory>
+
+#include "arch/generic/debugfaults.hh"
 #include "arch/sparc/insts/static_inst.hh"
 #include "base/cprintf.hh"
 
@@ -55,17 +58,14 @@ class FailUnimplemented : public SparcStaticInst
     /// Constructor
     FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst) :
             SparcStaticInst(_mnemonic, _machInst, No_OpClass)
-    {
-        // don't call execute() (which panics) if we're on a
-        // speculative path
-        flags[IsNonSpeculative] = true;
-    }
+    {}
 
     Fault
     execute(ExecContext *xc, Trace::InstRecord *traceData) const override
     {
-        panic("attempt to execute unimplemented instruction '%s' "
-              "(inst 0x%08x)", mnemonic, machInst);
+        return std::make_shared<GenericISA::M5PanicFault>(
+            "attempt to execute unimplemented instruction '%s' (inst %#08x)",
+            mnemonic, machInst);
     }
 
     std::string
@@ -94,17 +94,14 @@ class WarnUnimplemented : public SparcStaticInst
     /// Constructor
     WarnUnimplemented(const char *_mnemonic, ExtMachInst _machInst) :
             SparcStaticInst(_mnemonic, _machInst, No_OpClass), warned(false)
-    {
-        // don't call execute() (which panics) if we're on a
-        // speculative path
-        flags[IsNonSpeculative] = true;
-    }
+    {}
 
     Fault
     execute(ExecContext *xc, Trace::InstRecord *traceData) const override
     {
         if (!warned) {
-            warn("instruction '%s' unimplemented\n", mnemonic);
+            return std::make_shared<GenericISA::M5WarnFault>(
+                "instruction '%s' unimplemented\n", mnemonic);
             warned = true;
         }
         return NoFault;