summaryrefslogtreecommitdiff
path: root/src/arch/sparc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2017-11-06 19:25:21 -0800
committerGabe Black <gabeblack@google.com>2017-11-22 00:23:23 +0000
commitbd96f10f997de75d31192cb232f50c37b4a11eac (patch)
tree58202959469d2d770047509c8da6631ea080b18a /src/arch/sparc
parent299d7f8c5d9f22ceed3cc7081ea6b9d90542610f (diff)
downloadgem5-bd96f10f997de75d31192cb232f50c37b4a11eac.tar.xz
sparc: Return debug faults from unimplemented instructions.
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>
Diffstat (limited to 'src/arch/sparc')
-rw-r--r--src/arch/sparc/insts/unimp.hh23
1 files changed, 10 insertions, 13 deletions
diff --git a/src/arch/sparc/insts/unimp.hh b/src/arch/sparc/insts/unimp.hh
index c0d97858f..a63443a4c 100644
--- a/src/arch/sparc/insts/unimp.hh
+++ b/src/arch/sparc/insts/unimp.hh
@@ -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;