summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-07-20 22:13:14 -0700
committerGabe Black <gabeblack@google.com>2018-09-11 21:46:22 +0000
commite58072108f137f28fa08c67602d165f53d4f03cf (patch)
treeb1c79b899993972b479309801bfa9381dc162bec /src
parent1fc84b480c30a7ba43f24854c62fbc6ddadc5fcd (diff)
downloadgem5-e58072108f137f28fa08c67602d165f53d4f03cf.tar.xz
systemc: Fix a "problem" with kill/reset exceptions.
Despite what it says in the spec, the proc_ctrl compliance test throws a copy of the reset exception it catches, not the original. Because of that, the code in the kernel which catches the exception gets the base class, not the derived class with overridden virtual methods, etc. This happens to work for the Accellera implementation because they manipulate members of the base class itself which are preserved despite this bug. To make the test work, we imitate their implementation, even though it exposes more implementation details through the header files. Change-Id: I7ed9818c0552869ec790cb7f7bfbe365ade5e49c Reviewed-on: https://gem5-review.googlesource.com/12045 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/systemc/core/sc_process_handle.cc10
-rw-r--r--src/systemc/ext/core/sc_process_handle.hh1
2 files changed, 7 insertions, 4 deletions
diff --git a/src/systemc/core/sc_process_handle.cc b/src/systemc/core/sc_process_handle.cc
index e0f6a8186..256d64989 100644
--- a/src/systemc/core/sc_process_handle.cc
+++ b/src/systemc/core/sc_process_handle.cc
@@ -39,17 +39,19 @@ namespace sc_core
const char *
sc_unwind_exception::what() const throw()
{
- panic("%s for base class called.\n", __PRETTY_FUNCTION__);
+ return _isReset ? "RESET" : "KILL";
}
bool
sc_unwind_exception::is_reset() const
{
- panic("%s for base class called.\n", __PRETTY_FUNCTION__);
+ return _isReset;
}
-sc_unwind_exception::sc_unwind_exception() {}
-sc_unwind_exception::sc_unwind_exception(const sc_unwind_exception &) {}
+sc_unwind_exception::sc_unwind_exception() : _isReset(false) {}
+sc_unwind_exception::sc_unwind_exception(const sc_unwind_exception &e) :
+ _isReset(e._isReset)
+{}
sc_unwind_exception::~sc_unwind_exception() throw() {}
diff --git a/src/systemc/ext/core/sc_process_handle.hh b/src/systemc/ext/core/sc_process_handle.hh
index 2db553b7a..818690318 100644
--- a/src/systemc/ext/core/sc_process_handle.hh
+++ b/src/systemc/ext/core/sc_process_handle.hh
@@ -108,6 +108,7 @@ class sc_unwind_exception : public std::exception
virtual ~sc_unwind_exception() throw();
protected:
+ bool _isReset;
sc_unwind_exception();
};