14#ifndef SIMICS_SYSTEMC_TLM2SIMICS_GASKET_H
15#define SIMICS_SYSTEMC_TLM2SIMICS_GASKET_H
19#include <tlm_utils/simple_target_socket.h>
43template<
unsigned int BUSWIDTH = 32,
44 typename TYPES = tlm::tlm_base_protocol_types>
48 const simics::ConfObjectRef &obj)
49 : simics_obj_(obj), socket_(
"target_socket"),
52 initiator_socket_(NULL) {
53 FATAL_ERROR_IF(!obj,
"Must provide a valid Simics object");
57 socket_.register_b_transport(
this, &Gasket::b_transport);
58 socket_.register_get_direct_mem_ptr(
this, &Gasket::get_direct_mem_ptr);
59 socket_.register_transport_dbg(
this, &Gasket::transport_dbg);
66 delete transaction_handler_;
70 template <
typename Socket>
73 initiator_socket_ = &sock;
80 delete transaction_handler_;
85 sc_dt::uint64 end_range)
override {
86 socket_->invalidate_direct_mem_ptr(start_range, end_range);
89 return initiator_socket_;
95 return transaction_handler_;
100 socket_.register_nb_transport_fw(
this, &Gasket::nb_transport_fw);
104 void execute_transaction(tlm::tlm_generic_payload &trans,
107 trans.set_response_status(tlm::TLM_OK_RESPONSE);
108 tlm::tlm_response_status status = tlm::TLM_INCOMPLETE_RESPONSE;
111 trans.set_extension(&nb_ext_);
120 trans.clear_extension(&nb_ext_);
126 if (trans.get_response_status() != status &&
127 status != tlm::TLM_OK_RESPONSE) {
128 const char *msg =
"Gasket transaction error";
130 case tlm::TLM_INCOMPLETE_RESPONSE: {
131 msg =
"Gasket did not attempt to execute the command";
134 case tlm::TLM_ADDRESS_ERROR_RESPONSE: {
135 msg =
"Gasket was unable to act on the address attribute, "
136 "or address out-of-range";
139 case tlm::TLM_COMMAND_ERROR_RESPONSE: {
140 msg =
"Gasket was unable to execute the command";
143 case tlm::TLM_BURST_ERROR_RESPONSE: {
144 msg =
"Gasket was unable to act on the data length or "
148 case tlm::TLM_BYTE_ENABLE_ERROR_RESPONSE: {
149 msg =
"Gasket was unable to act on the byte enable";
152 case tlm::TLM_GENERIC_ERROR_RESPONSE: {
158 SIM_LOG_SPEC_VIOLATION(1, simics_obj_, 0,
"%s", msg);
160 trans.set_response_status(status);
164 void b_transport(tlm::tlm_generic_payload &trans,
165 sc_core::sc_time &local_time_offset) {
166 if (trans.get_byte_enable_ptr() != NULL &&
173 if (local_time_offset.value() > 0) {
175 wait(local_time_offset);
177 local_time_offset = sc_core::SC_ZERO_TIME;
180 execute_transaction(trans,
false);
183 unsigned int transport_dbg(tlm::tlm_generic_payload &trans) {
184 ProcessStackHandler pstack(internal());
188 bool get_direct_mem_ptr(tlm::tlm_generic_payload &trans,
189 tlm::tlm_dmi &dmi_data) {
190 ProcessStackHandler pstack(internal());
196 virtual tlm::tlm_sync_enum nb_transport_fw(
197 tlm::tlm_generic_payload &trans,
198 tlm::tlm_phase &phase,
199 sc_core::sc_time &local_time_offset) {
200 if (phase == tlm::END_RESP) {
201 trans.set_response_status(tlm::TLM_OK_RESPONSE);
202 return tlm::TLM_COMPLETED;
205 if (phase != tlm::BEGIN_REQ) {
206 SIM_LOG_SPEC_VIOLATION(
208 "Gasket was unable to execute the command (invalid phase)");
209 trans.set_response_status(tlm::TLM_COMMAND_ERROR_RESPONSE);
211 return tlm::TLM_COMPLETED;
214 if (trans.get_byte_enable_ptr() != NULL &&
216 SIM_LOG_SPEC_VIOLATION(
218 "Gasket was unable to execute the command (byte enable)");
219 trans.set_response_status(tlm::TLM_BYTE_ENABLE_ERROR_RESPONSE);
221 return tlm::TLM_COMPLETED;
224 execute_transaction(trans,
true);
225 if (trans.get_response_status() == tlm::TLM_INCOMPLETE_RESPONSE) {
226 SIM_LOG_INFO(3, simics_obj_, 0,
"Gasket deferred the transaction");
227 return tlm::TLM_ACCEPTED;
229 return tlm::TLM_COMPLETED;
232 InternalInterface *internal() {
234 Adapter *adapter = simics::from_obj<Adapter>(simics_obj_);
236 internal_ = adapter->internal();
242 simics::ConfObjectRef simics_obj_;
243 tlm_utils::simple_target_socket<Gasket, BUSWIDTH, TYPES> socket_;
246 TransactionHandlerInterface *transaction_handler_;
247 NullSimulation null_simulation_;
248 InternalInterface *internal_;
249 sc_core::sc_object *initiator_socket_;
251 NonBlockingTlmExtension nb_ext_;
Utility class that handles the context switching, using RAII methodology.
Definition: context.h:31
Definition: internal_interface.h:23
Definition: process_stack_handler.h:26
Interface used by tlm2simics gaskets, implemented by Gasket base class.
Definition: gasket_interface.h:28
Implements core functionality for receiving a TLM2 transaction over a socket.
Definition: gasket.h:45
Gasket(sc_core::sc_module_name, const simics::ConfObjectRef &obj)
Definition: gasket.h:47
void register_nb_transport_fw() override
For gaskets support non-blocking transport, call this function to register the non-blocking transport...
Definition: gasket.h:99
void set_transaction_handler(TransactionHandlerInterface *transaction_handler) override
Target object in Simics side receiving the TLM transaction.
Definition: gasket.h:77
void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) override
Calling this method will end up calling the same method on the target socket, that will forward the c...
Definition: gasket.h:84
std::string gasket_name() const override
Definition: gasket.h:91
virtual ~Gasket()
Definition: gasket.h:64
sc_core::sc_object * get_initiator_socket() const override
Definition: gasket.h:88
void bind(Socket &sock)
Definition: gasket.h:71
void init(InternalInterface *internal)
Definition: gasket.h:61
TransactionHandlerInterface * transaction_handler() override
Definition: gasket.h:94
Utility class that counts the number of instances.
Definition: null_transaction_handler.h:31
Interface used by Gasket, implemented by protocol specific transaction handlers.
Definition: transaction_handler_interface.h:34
virtual unsigned int debug_transaction(ConfObjectRef &simics_obj, tlm::tlm_generic_payload *trans)=0
virtual void update_dmi_allowed(ConfObjectRef &simics_obj, tlm::tlm_generic_payload *trans)=0
virtual bool byte_enable_supported(ConfObjectRef &simics_obj, tlm::tlm_generic_payload *trans)=0
virtual bool get_direct_mem_ptr(ConfObjectRef &simics_obj, tlm::tlm_generic_payload &trans, tlm::tlm_dmi &dmi_data)=0
virtual tlm::tlm_response_status simics_transaction(ConfObjectRef &simics_obj, tlm::tlm_generic_payload *trans)=0
AdapterNonCheckpointable Adapter
Definition: adapter.h:338