diff --git a/src/systemc/tlm_bridge/tlm_to_gem5.cc b/src/systemc/tlm_bridge/tlm_to_gem5.cc index 47a2fba08e..c02efe7437 100644 --- a/src/systemc/tlm_bridge/tlm_to_gem5.cc +++ b/src/systemc/tlm_bridge/tlm_to_gem5.cc @@ -207,6 +207,29 @@ void TlmToGem5Bridge::sendBeginResp(tlm::tlm_generic_payload &trans, sc_core::sc_time &delay) { + MemBackdoor::Flags flags; + switch (trans.get_command()) { + case tlm::TLM_READ_COMMAND: + flags = MemBackdoor::Readable; + break; + case tlm::TLM_WRITE_COMMAND: + flags = MemBackdoor::Writeable; + break; + default: + panic("TlmToGem5Bridge: " + "received transaction with unsupported command"); + } + Addr start_addr = trans.get_address(); + Addr length = trans.get_data_length(); + + MemBackdoorReq req({start_addr, start_addr + length}, flags); + MemBackdoorPtr backdoor = nullptr; + + bmp.sendMemBackdoorReq(req, backdoor); + + if (backdoor) + trans.set_dmi_allowed(true); + tlm::tlm_phase phase = tlm::BEGIN_RESP; auto status = socket->nb_transport_bw(trans, phase, delay); @@ -574,12 +597,12 @@ TlmToGem5Bridge::before_end_of_elaboration() DPRINTF(TlmBridge, "register blocking interface"); socket.register_b_transport( this, &TlmToGem5Bridge::b_transport); - socket.register_get_direct_mem_ptr( - this, &TlmToGem5Bridge::get_direct_mem_ptr); } else { panic("gem5 operates neither in Timing nor in Atomic mode"); } + socket.register_get_direct_mem_ptr( + this, &TlmToGem5Bridge::get_direct_mem_ptr); socket.register_transport_dbg( this, &TlmToGem5Bridge::transport_dbg);