From 2ede803d7c29065c1e42442b495f773c03c68270 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sat, 22 Sep 2018 06:28:32 -0700 Subject: [PATCH] systemc: Make sure the right type process is running when calling wait. That function is only allowed when running a thread or cthread. Change-Id: Idf98b70018169d4f724aa8168f3c4e8161f0b83d Reviewed-on: https://gem5-review.googlesource.com/c/12967 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/sc_module.cc | 33 +++++++++++++++++++ .../test03/expected_returncode | 1 + 2 files changed, 34 insertions(+) create mode 100644 src/systemc/tests/systemc/kernel/dynamic_processes/test03/expected_returncode diff --git a/src/systemc/core/sc_module.cc b/src/systemc/core/sc_module.cc index 32d1c979a..dfd89790c 100644 --- a/src/systemc/core/sc_module.cc +++ b/src/systemc/core/sc_module.cc @@ -591,10 +591,29 @@ timed_out() } +namespace +{ + +bool +waitErrorCheck(sc_gem5::Process *p) +{ + if (p->procKind() == SC_METHOD_PROC_) { + SC_REPORT_ERROR( + "(E519) wait() is only allowed in SC_THREADs and SC_CTHREADs", + "\n in SC_METHODs use next_trigger() instead"); + return true; + } + return false; +} + +} // anonymous namespace + void wait() { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->cancelTimeout(); p->clearDynamic(); sc_gem5::scheduler.yield(); @@ -615,6 +634,8 @@ void wait(const sc_event &e) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->cancelTimeout(); ::sc_gem5::newDynamicSensitivityEvent(p, &e); sc_gem5::scheduler.yield(); @@ -624,6 +645,8 @@ void wait(const sc_event_or_list &eol) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->cancelTimeout(); ::sc_gem5::newDynamicSensitivityEventOrList(p, &eol); sc_gem5::scheduler.yield(); @@ -633,6 +656,8 @@ void wait(const sc_event_and_list &eal) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->cancelTimeout(); ::sc_gem5::newDynamicSensitivityEventAndList(p, &eal); sc_gem5::scheduler.yield(); @@ -642,6 +667,8 @@ void wait(const sc_time &t) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->setTimeout(t); p->clearDynamic(); sc_gem5::scheduler.yield(); @@ -657,6 +684,8 @@ void wait(const sc_time &t, const sc_event &e) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->setTimeout(t); ::sc_gem5::newDynamicSensitivityEvent(p, &e); sc_gem5::scheduler.yield(); @@ -672,6 +701,8 @@ void wait(const sc_time &t, const sc_event_or_list &eol) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->setTimeout(t); ::sc_gem5::newDynamicSensitivityEventOrList(p, &eol); sc_gem5::scheduler.yield(); @@ -687,6 +718,8 @@ void wait(const sc_time &t, const sc_event_and_list &eal) { sc_gem5::Process *p = sc_gem5::scheduler.current(); + if (waitErrorCheck(p)) + return; p->setTimeout(t); ::sc_gem5::newDynamicSensitivityEventAndList(p, &eal); sc_gem5::scheduler.yield(); diff --git a/src/systemc/tests/systemc/kernel/dynamic_processes/test03/expected_returncode b/src/systemc/tests/systemc/kernel/dynamic_processes/test03/expected_returncode new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/dynamic_processes/test03/expected_returncode @@ -0,0 +1 @@ +1 -- 2.30.2