Fix for bug when draining and a memory access is outstanding.
--HG-- extra : convert_revision : 1af782cf023ae74c2a3ff9f7aefcea880bc87936
This commit is contained in:
parent
b2a479cfc8
commit
744e0055b7
1 changed files with 11 additions and 10 deletions
|
@ -354,22 +354,23 @@ DefaultFetch<Impl>::processCacheCompletion(PacketPtr pkt)
|
|||
// to return.
|
||||
if (fetchStatus[tid] != IcacheWaitResponse ||
|
||||
pkt->req != memReq[tid] ||
|
||||
isSwitchedOut() ||
|
||||
drainPending) {
|
||||
isSwitchedOut()) {
|
||||
++fetchIcacheSquashes;
|
||||
delete pkt->req;
|
||||
delete pkt;
|
||||
return;
|
||||
}
|
||||
|
||||
// Wake up the CPU (if it went to sleep and was waiting on this completion
|
||||
// event).
|
||||
cpu->wakeCPU();
|
||||
if (!drainPending) {
|
||||
// Wake up the CPU (if it went to sleep and was waiting on
|
||||
// this completion event).
|
||||
cpu->wakeCPU();
|
||||
|
||||
DPRINTF(Activity, "[tid:%u] Activating fetch due to cache completion\n",
|
||||
tid);
|
||||
DPRINTF(Activity, "[tid:%u] Activating fetch due to cache completion\n",
|
||||
tid);
|
||||
|
||||
switchToActive();
|
||||
switchToActive();
|
||||
}
|
||||
|
||||
// Only switch to IcacheAccessComplete if we're not stalled as well.
|
||||
if (checkStall(tid)) {
|
||||
|
@ -509,7 +510,7 @@ DefaultFetch<Impl>::fetchCacheLine(Addr fetch_PC, Fault &ret_fault, unsigned tid
|
|||
unsigned flags = 0;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
if (cacheBlocked || (interruptPending && flags == 0) || drainPending) {
|
||||
if (cacheBlocked || (interruptPending && flags == 0)) {
|
||||
// Hold off fetch from getting new instructions when:
|
||||
// Cache is blocked, or
|
||||
// while an interrupt is pending and we're not in PAL mode, or
|
||||
|
@ -909,7 +910,7 @@ DefaultFetch<Impl>::fetch(bool &status_change)
|
|||
//////////////////////////////////////////
|
||||
int tid = getFetchingThread(fetchPolicy);
|
||||
|
||||
if (tid == -1) {
|
||||
if (tid == -1 || drainPending) {
|
||||
DPRINTF(Fetch,"There are no more threads available to fetch from.\n");
|
||||
|
||||
// Breaks looping condition in tick()
|
||||
|
|
Loading…
Reference in a new issue