X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmem%2Fcache%2Fcache_impl.hh;h=ea30dbba67d7cb62b9d52426751e05e97a86f0b0;hb=7245d4530d0c8367fa7b1adadcb55e1e8bd466e7;hp=c4acc03e7b34f34f29366d4340b2dbc0fba3e16f;hpb=210e73f2a298d494e4b15a3bf0523e58369c00d2;p=gem5.git diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index c4acc03e7..ea30dbba6 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -585,7 +585,7 @@ Cache::probe(Packet * &pkt, bool update, pkt_data = pkt->getPtr() + offset; write_data = target->getPtr(); data_size = pkt->getSize() - offset; - assert(data_size > pkt->getSize()); + assert(data_size >= pkt->getSize()); if (data_size > target->getSize()) data_size = target->getSize(); } @@ -593,6 +593,8 @@ Cache::probe(Packet * &pkt, bool update, if (pkt->isWrite()) { memcpy(pkt_data, write_data, data_size); } else { + pkt->flags |= SATISFIED; + pkt->result = Packet::Success; memcpy(write_data, pkt_data, data_size); } } @@ -618,7 +620,7 @@ Cache::probe(Packet * &pkt, bool update, pkt_data = pkt->getPtr() + offset; write_data = write->getPtr(); data_size = pkt->getSize() - offset; - assert(data_size > pkt->getSize()); + assert(data_size >= pkt->getSize()); if (data_size > write->getSize()) data_size = write->getSize(); } @@ -626,11 +628,19 @@ Cache::probe(Packet * &pkt, bool update, if (pkt->isWrite()) { memcpy(pkt_data, write_data, data_size); } else { + pkt->flags |= SATISFIED; + pkt->result = Packet::Success; memcpy(write_data, pkt_data, data_size); } } } + if (pkt->isRead() + && pkt->result != Packet::Success + && otherSidePort == memSidePort) { + otherSidePort->sendFunctional(pkt); + assert(pkt->result == Packet::Success); + } return 0; } else if (!blk) { // update the cache state and statistics