diff -r 1c2fe07bc7b7 -r f74b7b7af31d src/cpu/o3/fu_pool.hh --- a/src/cpu/o3/fu_pool.hh Wed Jun 05 08:44:38 2013 +0100 +++ b/src/cpu/o3/fu_pool.hh Wed Jun 05 09:55:23 2013 +0100 @@ -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 @@ 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 -r 1c2fe07bc7b7 -r f74b7b7af31d src/cpu/o3/fu_pool.cc --- a/src/cpu/o3/fu_pool.cc Wed Jun 05 08:44:38 2013 +0100 +++ b/src/cpu/o3/fu_pool.cc Wed Jun 05 09:55:23 2013 +0100 @@ -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 @@ } } -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 -r 1c2fe07bc7b7 -r f74b7b7af31d src/cpu/o3/iew_impl.hh --- a/src/cpu/o3/iew_impl.hh Wed Jun 05 08:44:38 2013 +0100 +++ b/src/cpu/o3/iew_impl.hh Wed Jun 05 09:55:23 2013 +0100 @@ -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 @@ } } + // 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 @@ instQueue.drainSanityCheck(); ldstQueue.drainSanityCheck(); - fuPool->drainSanityCheck(); } template