diff --git a/src/cpu/o3/fu_pool.cc b/src/cpu/o3/fu_pool.cc index 78af428db..3edc2c35b 100644 --- a/src/cpu/o3/fu_pool.cc +++ b/src/cpu/o3/fu_pool.cc @@ -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; } // diff --git a/src/cpu/o3/fu_pool.hh b/src/cpu/o3/fu_pool.hh index 85912af3a..79b2adf83 100644 --- a/src/cpu/o3/fu_pool.hh +++ b/src/cpu/o3/fu_pool.hh @@ -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() {}; diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh index 5bd5f6ae9..5d18789c3 100644 --- a/src/cpu/o3/iew_impl.hh +++ b/src/cpu/o3/iew_impl.hh @@ -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::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::drainSanityCheck() const instQueue.drainSanityCheck(); ldstQueue.drainSanityCheck(); - fuPool->drainSanityCheck(); } template