cpu: Consider instructions waiting for FU completion in draining

This patch changes the IEW drain check to include the FU pool as there
can be instructions that are "stored" in FU completion events and thus
not covered by the existing checks. With this patch, we simply include
a check to see if all the FUs are considered non-busy in the next
tick.

Without this patch, the pc-switcheroo-full regression fails after
minor changes to the cache timing (aligning to clock edge).
This commit is contained in:
Andreas Hansson 2013-06-27 05:49:49 -04:00
parent 368f50a0a1
commit 10650fc525
3 changed files with 19 additions and 10 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 ARM Limited
* Copyright (c) 2012-2013 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@ -255,12 +255,14 @@ FUPool::dump()
}
}
void
FUPool::drainSanityCheck() const
bool
FUPool::isDrained() const
{
assert(unitsToBeFreed.empty());
bool is_drained = true;
for (int i = 0; i < numFU; i++)
assert(!unitBusy[i]);
is_drained = is_drained && !unitBusy[i];
return is_drained;
}
//

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 ARM Limited
* Copyright (c) 2012-2013 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@ -169,8 +169,8 @@ class FUPool : public SimObject
return maxIssueLatencies[capability];
}
/** Perform sanity checks after a drain. */
void drainSanityCheck() const;
/** Have all the FUs drained? */
bool isDrained() const;
/** Takes over from another CPU's thread. */
void takeOverFrom() {};

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2012 ARM Limited
* Copyright (c) 2010-2013 ARM Limited
* All rights reserved.
*
* The license below extends only to copyright in the software and shall
@ -376,6 +376,14 @@ DefaultIEW<Impl>::isDrained() const
}
}
// Also check the FU pool as instructions are "stored" in FU
// completion events until they are done and not accounted for
// above
if (drained && !fuPool->isDrained()) {
DPRINTF(Drain, "FU pool still busy.\n");
drained = false;
}
return drained;
}
@ -387,7 +395,6 @@ DefaultIEW<Impl>::drainSanityCheck() const
instQueue.drainSanityCheck();
ldstQueue.drainSanityCheck();
fuPool->drainSanityCheck();
}
template <class Impl>