Yu-hsin Wang has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/44646 )
Change subject: fastmodel: handling amba far atomic transaction
......................................................................
fastmodel: handling amba far atomic transaction
Change-Id: I360c2a2bd415524b2a76434a13920f94360afa0f
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/44646
Reviewed-by: Gabe Black <gabe.bl...@gmail.com>
Maintainer: Gabe Black <gabe.bl...@gmail.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/arm/fastmodel/SConscript
M src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
M src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
3 files changed, 82 insertions(+), 0 deletions(-)
Approvals:
Gabe Black: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/arch/arm/fastmodel/SConscript
b/src/arch/arm/fastmodel/SConscript
index c659434..257c001 100644
--- a/src/arch/arm/fastmodel/SConscript
+++ b/src/arch/arm/fastmodel/SConscript
@@ -104,6 +104,8 @@
env.Append(CCFLAGS='-pthread')
cpppaths = (
+ pvlib_home.Dir('examples/SystemCExport/Common/include'),
+ pvlib_home.Dir('include'),
pvlib_home.Dir('include/fmruntime'),
pvlib_home.Dir('include/fmruntime/eslapi'),
pvlib_home.Dir('Iris/include'),
diff --git a/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
b/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
index 82f84d8..8826f3e 100644
--- a/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
+++ b/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
@@ -27,7 +27,43 @@
#include "arch/arm/fastmodel/amba_to_tlm_bridge.hh"
+#include "base/amo.hh"
#include "params/AmbaToTlmBridge64.hh"
+#include "pv/FarAtomicService.h"
+#include "pv_userpayload_extension.h"
+#include "systemc/tlm_bridge/sc_ext.hh"
+
+namespace {
+
+// According to AbstractMemory::access in mem/abstract_mem.cc, the gem5
memory
+// model would set original data into the packet buffer. However, the TLM
+// request with atomic operation doesn't carry a valid buffer because the
+// resource is all allocated in atomic extension. Preventing from
segmentation
+// fault, we allocate a random buffer and share it with all atomic
transactions
+// since we don't really care about the content of it.
+uint8_t dummy_buffer[64] = {};
+
+struct FarAtomicOpFunctor : public AtomicOpFunctor
+{
+ FarAtomicOpFunctor(far_atomic::FarAtomic *_fa) : fa(_fa) {}
+
+ void
+ operator() (uint8_t *p) override
+ {
+ fa->serviceWasFound();
+ fa->doAtomicOperation(p);
+ }
+
+ AtomicOpFunctor *
+ clone() override
+ {
+ return new FarAtomicOpFunctor(*this);
+ }
+
+ far_atomic::FarAtomic *fa;
+};
+
+}
namespace FastModel
{
@@ -63,6 +99,7 @@
AmbaToTlmBridge64::bTransport(amba_pv::amba_pv_transaction &trans,
sc_core::sc_time &t)
{
+ maybeSetupAtomicExtension(trans);
return initiatorProxy->b_transport(trans, t);
}
@@ -86,6 +123,48 @@
targetProxy->invalidate_direct_mem_ptr(start_range, end_range);
}
+void
+AmbaToTlmBridge64::maybeSetupAtomicExtension(
+ amba_pv::amba_pv_transaction &trans)
+{
+ Gem5SystemC::AtomicExtension *atomic_ex = nullptr;
+ trans.get_extension(atomic_ex);
+ if (atomic_ex)
+ return;
+
+ pv_userpayload_extension *user_ex = nullptr;
+ trans.get_extension(user_ex);
+ if (!user_ex)
+ return;
+
+ pv::UserPayloadBase *upb = user_ex->get_user_payload();
+ uint32_t appid = upb->get_appID();
+ if (appid != pv::UserPayloadBase::SERVICE_REQUEST)
+ return;
+
+ std::pair<void *, std::size_t> u_data = user_ex->get_user_data();
+ far_atomic::FarAtomic *fa = static_cast<far_atomic::FarAtomic *>(
+ u_data.first);
+
+ // Correct the request size manually and give it a dummy buffer
preventing
+ // from segmentation fault.
+ fatal_if(
+ fa->getDataValueSizeInBytes() > sizeof(dummy_buffer),
+ "atomic operation(%d) is larger than dummy buffer(%d)",
+ fa->getDataValueSizeInBytes(), sizeof(dummy_buffer));
+ trans.set_data_length(fa->getDataValueSizeInBytes());
+ trans.set_data_ptr(dummy_buffer);
+
+ // The return value would store in the extension. We don't need to
specify
+ // need_return here.
+ atomic_ex = new Gem5SystemC::AtomicExtension(
+ std::make_shared<FarAtomicOpFunctor>(fa), false);
+ if (trans.has_mm())
+ trans.set_auto_extension(atomic_ex);
+ else
+ trans.set_extension(atomic_ex);
+}
+
} // namespace FastModel
FastModel::AmbaToTlmBridge64 *
diff --git a/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
b/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
index d0e52d0..0bb4c20 100644
--- a/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
+++ b/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
@@ -54,6 +54,7 @@
unsigned int transportDbg(amba_pv::amba_pv_transaction &trans);
void invalidateDirectMemPtr(sc_dt::uint64 start_range,
sc_dt::uint64 end_range);
+ void maybeSetupAtomicExtension(amba_pv::amba_pv_transaction &trans);
tlm_utils::simple_target_socket<
AmbaToTlmBridge64, 64, tlm::tlm_base_protocol_types> targetProxy;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/44646
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I360c2a2bd415524b2a76434a13920f94360afa0f
Gerrit-Change-Number: 44646
Gerrit-PatchSet: 5
Gerrit-Owner: Yu-hsin Wang <yuhsi...@google.com>
Gerrit-Reviewer: Earl Ou <shunhsin...@google.com>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Gabe Black <gabebl...@google.com>
Gerrit-Reviewer: Yu-hsin Wang <yuhsi...@google.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-CC: Philip Metzler <cpm...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s