diff -r 5fb918115c07 -r 40e1903c4d9f src/cpu/o3/cpu.hh --- a/src/cpu/o3/cpu.hh Mon Oct 31 01:09:44 2011 -0700 +++ b/src/cpu/o3/cpu.hh Thu Nov 03 15:23:53 2011 -0500 @@ -720,6 +720,9 @@ Stats::Scalar timesIdled; /** Stat for total number of cycles the CPU spends descheduled. */ Stats::Scalar idleCycles; + /** Stat for total number of cycles the CPU spends descheduled due to a + * quiesce operation or waiting for an interrupt. */ + Stats::Scalar quiesceCycles; /** Stat for the number of committed instructions per thread. */ Stats::Vector committedInsts; /** Stat for the total number of committed instructions. */ diff -r 5fb918115c07 -r 40e1903c4d9f src/cpu/o3/cpu.cc --- a/src/cpu/o3/cpu.cc Mon Oct 31 01:09:44 2011 -0700 +++ b/src/cpu/o3/cpu.cc Thu Nov 03 15:23:53 2011 -0500 @@ -442,6 +442,12 @@ "to idling") .prereq(idleCycles); + quiesceCycles + .name(name() + ".quiesceCycles") + .desc("Total number of cycles that CPU has spent quiesced or waiting " + "for an interrupt") + .prereq(quiesceCycles); + // Number of Instructions simulated // -------------------------------- // Should probably be in Base CPU but need templated @@ -688,6 +694,8 @@ activityRec.activity(); fetch.wakeFromQuiesce(); + quiesceCycles += tickToCycles((curTick() - 1) - lastRunningCycle); + lastActivatedCycle = curTick(); _status = Running; @@ -722,6 +730,9 @@ if ((activeThreads.size() == 1 && !deallocated) || activeThreads.size() == 0) unscheduleTickEvent(); + + DPRINTF(Quiesce, "Suspending Context\n"); + lastRunningCycle = curTick(); _status = Idle; } @@ -1205,6 +1216,8 @@ } if (!tickEvent.scheduled()) schedule(tickEvent, nextCycle()); + + lastRunningCycle = curTick(); } template