diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2006-10-11 00:26:21 -0400 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2006-10-11 00:26:21 -0400 |
commit | a139e4394d473ce1927d8f800640cf9688c70652 (patch) | |
tree | f4304b0e76d238a58563c89ba6927048f20e9bba | |
parent | c9102b08fa25df7a1ef98d63f067bebd3978c19d (diff) | |
download | gem5-a139e4394d473ce1927d8f800640cf9688c70652.tar.xz |
Make the bus work if the other sides recvRetry doesn't call sendTiming for some reason.
--HG--
extra : convert_revision : e722ddb0354a5c021dc7c44a3e2f0a64e962442b
-rw-r--r-- | src/mem/bus.cc | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc index 03c1a4209..6065ee1f1 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -214,9 +214,24 @@ Bus::recvRetry(int id) retryList.front()->sendRetry(); // If inRetry is still true, sendTiming wasn't called if (inRetry) - panic("Port %s didn't call sendTiming in it's recvRetry\n",\ - retryList.front()->getPeer()->name()); - //assert(!inRetry); + { + retryList.front()->onRetryList(false); + retryList.pop_front(); + inRetry = false; + + //Bring tickNextIdle up to the present + while (tickNextIdle < curTick) + tickNextIdle += clock; + + //Burn a cycle for the missed grant. + tickNextIdle += clock; + + if (!busIdle.scheduled()) { + busIdle.schedule(tickNextIdle); + } else { + busIdle.reschedule(tickNextIdle); + } + } } } |