diff options
author | Kevin Lim <ktlim@umich.edu> | 2006-10-09 19:14:14 -0400 |
---|---|---|
committer | Kevin Lim <ktlim@umich.edu> | 2006-10-09 19:14:14 -0400 |
commit | 92bf23bed62bd8f1e85d1da0506b6e1b71b27d15 (patch) | |
tree | 96aeb36f7fdea15d06b8e42614cf87381ebdf5d9 /src/cpu | |
parent | af7315c7dc20833a59044d1624d4fb9d71f1306f (diff) | |
download | gem5-92bf23bed62bd8f1e85d1da0506b6e1b71b27d15.tar.xz |
Be sure to delete packet and sender state if the cache is blocked.
src/cpu/o3/lsq_unit.hh:
Be sure to delete data if the cache is blocked.
--HG--
extra : convert_revision : fafbcfb8937e85555823942e69e798e557a600e5
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/o3/lsq_unit.hh | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/src/cpu/o3/lsq_unit.hh b/src/cpu/o3/lsq_unit.hh index 512124bb4..7b65ef556 100644 --- a/src/cpu/o3/lsq_unit.hh +++ b/src/cpu/o3/lsq_unit.hh @@ -626,20 +626,27 @@ LSQUnit<Impl>::read(Request *req, T &data, int load_idx) ++usedPorts; - PacketPtr data_pkt = new Packet(req, Packet::ReadReq, Packet::Broadcast); - data_pkt->dataStatic(load_inst->memData); - - LSQSenderState *state = new LSQSenderState; - state->isLoad = true; - state->idx = load_idx; - state->inst = load_inst; - data_pkt->senderState = state; - // if we the cache is not blocked, do cache access if (!lsq->cacheBlocked()) { + PacketPtr data_pkt = + new Packet(req, Packet::ReadReq, Packet::Broadcast); + data_pkt->dataStatic(load_inst->memData); + + LSQSenderState *state = new LSQSenderState; + state->isLoad = true; + state->idx = load_idx; + state->inst = load_inst; + data_pkt->senderState = state; + if (!dcachePort->sendTiming(data_pkt)) { - if (data_pkt->result == Packet::BadAddress) { - delete data_pkt; + Packet::Result result = data_pkt->result; + + // Delete state and data packet because a load retry + // initiates a pipeline restart; it does not retry. + delete state; + delete data_pkt; + + if (result == Packet::BadAddress) { return TheISA::genMachineCheckFault(); } @@ -669,16 +676,6 @@ LSQUnit<Impl>::read(Request *req, T &data, int load_idx) return NoFault; } - if (data_pkt->result != Packet::Success) { - DPRINTF(LSQUnit, "LSQUnit: D-cache miss!\n"); - DPRINTF(Activity, "Activity: ld accessing mem miss [sn:%lli]\n", - load_inst->seqNum); - } else { - DPRINTF(LSQUnit, "LSQUnit: D-cache hit!\n"); - DPRINTF(Activity, "Activity: ld accessing mem hit [sn:%lli]\n", - load_inst->seqNum); - } - return NoFault; } |