summaryrefslogtreecommitdiff
path: root/src/cpu/base.hh
diff options
context:
space:
mode:
authorJose Marinho <jose.marinho@arm.com>2017-07-20 14:57:39 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-11-21 17:09:18 +0000
commit760cc5735f48f3a5a52ebe31df0c039b23c3d611 (patch)
treeda4103b240221359838888467ac4f12544acc2c5 /src/cpu/base.hh
parent00232a868e4816d19c129fb3d6ef5519d7176d5a (diff)
downloadgem5-760cc5735f48f3a5a52ebe31df0c039b23c3d611.tar.xz
cpu, cpu, sim: move Cycle probe update
Move the code responsible for performing the actual probe point notify into BaseCPU. Use BaseCPU activateContext and suspendContext to keep track of sleep cycles. Create a probe point (ppActiveCycles) that does not count cycles where the processor was asleep. Rename ppCycles to ppAllCycles to reflect its nature. Change-Id: I1907ddd07d0ff9f2ef22cc9f61f5f46c630c9d66 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/5762 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/cpu/base.hh')
-rw-r--r--src/cpu/base.hh56
1 files changed, 52 insertions, 4 deletions
diff --git a/src/cpu/base.hh b/src/cpu/base.hh
index 13c56a945..52598fd22 100644
--- a/src/cpu/base.hh
+++ b/src/cpu/base.hh
@@ -63,6 +63,7 @@
#include "sim/full_system.hh"
#include "sim/insttracer.hh"
#include "sim/probe/pmu.hh"
+#include "sim/probe/probe.hh"
#include "sim/system.hh"
#include "debug/Mwait.hh"
@@ -277,7 +278,7 @@ class BaseCPU : public MemObject
virtual void suspendContext(ThreadID thread_num);
/// Notify the CPU that the indicated context is now halted.
- virtual void haltContext(ThreadID thread_num) {}
+ virtual void haltContext(ThreadID thread_num);
/// Given a Thread Context pointer return the thread num
int findContext(ThreadContext *tc);
@@ -489,6 +490,7 @@ class BaseCPU : public MemObject
*/
virtual void probeInstCommit(const StaticInstPtr &inst);
+ protected:
/**
* Helper method to instantiate probe points belonging to this
* object.
@@ -498,9 +500,6 @@ class BaseCPU : public MemObject
*/
ProbePoints::PMUUPtr pmuProbePoint(const char *name);
- /** CPU cycle counter */
- ProbePoints::PMUUPtr ppCycles;
-
/**
* Instruction commit probe point.
*
@@ -519,9 +518,58 @@ class BaseCPU : public MemObject
/** Retired branches (any type) */
ProbePoints::PMUUPtr ppRetiredBranches;
+ /** CPU cycle counter even if any thread Context is suspended*/
+ ProbePoints::PMUUPtr ppAllCycles;
+
+ /** CPU cycle counter, only counts if any thread contexts is active **/
+ ProbePoints::PMUUPtr ppActiveCycles;
+
+ /**
+ * ProbePoint that signals transitions of threadContexts sets.
+ * The ProbePoint reports information through it bool parameter.
+ * - If the parameter is true then the last enabled threadContext of the
+ * CPU object was disabled.
+ * - If the parameter is false then a threadContext was enabled, all the
+ * remaining threadContexts are disabled.
+ */
+ ProbePointArg<bool> *ppSleeping;
/** @} */
+ enum CPUState {
+ CPU_STATE_ON,
+ CPU_STATE_SLEEP,
+ CPU_STATE_WAKEUP
+ };
+
+ Cycles previousCycle;
+ CPUState previousState;
+ /** base method keeping track of cycle progression **/
+ inline void updateCycleCounters(CPUState state)
+ {
+ uint32_t delta = curCycle() - previousCycle;
+
+ if (previousState == CPU_STATE_ON) {
+ ppActiveCycles->notify(delta);
+ }
+
+ switch (state)
+ {
+ case CPU_STATE_WAKEUP:
+ ppSleeping->notify(false);
+ break;
+ case CPU_STATE_SLEEP:
+ ppSleeping->notify(true);
+ break;
+ default:
+ break;
+ }
+
+ ppAllCycles->notify(delta);
+
+ previousCycle = curCycle();
+ previousState = state;
+ }
// Function tracing
private: