diff --git a/src/systemc/tlm_bridge/sc_ext.cc b/src/systemc/tlm_bridge/sc_ext.cc index 194ecbc055..18591d5021 100644 --- a/src/systemc/tlm_bridge/sc_ext.cc +++ b/src/systemc/tlm_bridge/sc_ext.cc @@ -77,4 +77,50 @@ Gem5Extension::copy_from(const tlm::tlm_extension_base &ext) packet = cpyFrom.packet; } +AtomicExtension::AtomicExtension( + std::shared_ptr amo_op, bool need_return) + : _op(amo_op), _needReturn(need_return) +{ +} + +tlm::tlm_extension_base * +AtomicExtension::clone() const +{ + return new AtomicExtension(*this); +} + +void +AtomicExtension::copy_from(const tlm::tlm_extension_base &ext) +{ + const AtomicExtension &from = static_cast(ext); + *this = from; +} + +AtomicExtension & +AtomicExtension::getExtension(const tlm::tlm_generic_payload &payload) +{ + return AtomicExtension::getExtension(&payload); +} + +AtomicExtension & +AtomicExtension::getExtension(const tlm::tlm_generic_payload *payload) +{ + AtomicExtension *result = nullptr; + payload->get_extension(result); + sc_assert(result); + return *result; +} + +bool +AtomicExtension::needReturn() const +{ + return _needReturn; +} + +AtomicOpFunctor* +AtomicExtension::getAtomicOpFunctor() const +{ + return _op.get(); +} + } // namespace Gem5SystemC diff --git a/src/systemc/tlm_bridge/sc_ext.hh b/src/systemc/tlm_bridge/sc_ext.hh index 56a19a7728..0cdf19584f 100644 --- a/src/systemc/tlm_bridge/sc_ext.hh +++ b/src/systemc/tlm_bridge/sc_ext.hh @@ -34,6 +34,9 @@ #ifndef __SYSTEMC_TLM_BRIDGE_SC_EXT_HH__ #define __SYSTEMC_TLM_BRIDGE_SC_EXT_HH__ +#include + +#include "base/amo.hh" #include "mem/packet.hh" #include "systemc/ext/tlm_core/2/generic_payload/gp.hh" @@ -58,6 +61,28 @@ class Gem5Extension: public tlm::tlm_extension PacketPtr packet; }; +class AtomicExtension: public tlm::tlm_extension +{ + public: + AtomicExtension( + std::shared_ptr amo_op, bool need_return); + + virtual tlm_extension_base *clone() const; + virtual void copy_from(const tlm_extension_base &ext); + + static AtomicExtension &getExtension( + const tlm::tlm_generic_payload *payload); + static AtomicExtension &getExtension( + const tlm::tlm_generic_payload &payload); + + bool needReturn() const; + AtomicOpFunctor* getAtomicOpFunctor() const; + + private: + std::shared_ptr _op; + bool _needReturn; +}; + } // namespace Gem5SystemC #endif // __SYSTEMC_TLM_BRIDGE_SC_EXT_HH__