From c0d67cba3a4c2a3ad30b0c4e6c098bd20b56a91f Mon Sep 17 00:00:00 2001 From: Yu-hsin Wang Date: Wed, 23 Nov 2022 11:00:23 +0800 Subject: [PATCH] systemc: fix extension not found TlmToGem5 bridge response path The gem5 packet has two ways to associate to the TLM payload. If the request is initiated from gem5, they would be associated by TLM extension. If the request is initiated from systemc, they would be associated by SenderState. So current implementation apparently only took care the request initiated from gem5 only. We need to update the logic to take care both. This change moves the response sync out of beginSendResp and sync it before calling the function. Change-Id: If415fbe33249b75e549086d9ca36eda3c20f7ec2 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/66053 Reviewed-by: Earl Ou Maintainer: Bobby Bruce Tested-by: kokoro --- src/systemc/tlm_bridge/tlm_to_gem5.cc | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/systemc/tlm_bridge/tlm_to_gem5.cc b/src/systemc/tlm_bridge/tlm_to_gem5.cc index 468ea83f37..47a2fba08e 100644 --- a/src/systemc/tlm_bridge/tlm_to_gem5.cc +++ b/src/systemc/tlm_bridge/tlm_to_gem5.cc @@ -207,14 +207,6 @@ void TlmToGem5Bridge::sendBeginResp(tlm::tlm_generic_payload &trans, sc_core::sc_time &delay) { - Gem5SystemC::Gem5Extension *extension = nullptr; - trans.get_extension(extension); - panic_if(extension == nullptr, - "Missing gem5 extension when sending BEGIN_RESP"); - auto pkt = extension->getPacket(); - - setPayloadResponse(trans, pkt); - tlm::tlm_phase phase = tlm::BEGIN_RESP; auto status = socket->nb_transport_bw(trans, phase, delay); @@ -252,6 +244,7 @@ TlmToGem5Bridge::handleBeginReq(tlm::tlm_generic_payload &trans) sendEndReq(trans); if (!needsResponse) { auto delay = sc_core::SC_ZERO_TIME; + setPayloadResponse(trans, pkt); sendBeginResp(trans, delay); } trans.release(); @@ -481,6 +474,8 @@ TlmToGem5Bridge::recvTimingResp(PacketPtr pkt) sc_assert(tlmSenderState != nullptr); auto &trans = tlmSenderState->trans; + setPayloadResponse(trans, pkt); + sendBeginResp(trans, delay); Gem5SystemC::Gem5Extension *extension = nullptr; trans.get_extension(extension); @@ -493,7 +488,6 @@ TlmToGem5Bridge::recvTimingResp(PacketPtr pkt) if (extension == nullptr) destroyPacket(pkt); - sendBeginResp(trans, delay); trans.release(); return true; @@ -512,12 +506,12 @@ TlmToGem5Bridge::recvReqRetry() bool needsResponse = pendingPacket->needsResponse(); if (bmp.sendTimingReq(pendingPacket)) { waitForRetry = false; - pendingPacket = nullptr; auto &trans = *pendingRequest; sendEndReq(trans); if (!needsResponse) { auto delay = sc_core::SC_ZERO_TIME; + setPayloadResponse(trans, pendingPacket); sendBeginResp(trans, delay); } trans.release();