sim: Fix clock_domain unserialization
authorSascha Bischoff <sascha.bischoff@ARM.com>
Fri, 1 Apr 2016 15:22:44 +0000 (16:22 +0100)
committerSascha Bischoff <sascha.bischoff@ARM.com>
Fri, 1 Apr 2016 15:22:44 +0000 (16:22 +0100)
This patch addresses an issue with the unserialization of clock
domains. Previously, the previous performance level was not restored
due to a bug in the code, which detected the post-unserialize update
as superfluous. This patch splits the setting of the clock domain into
two parts. The original interface of perfLevel is retained, but the
actual update takes place in signalPerfLevelUpdate, which is private
to the class. The perfLevel method checks that if the new performance
level is different to the previous performance level, and will only
call signalPerfLevelUpdate if there is a change. Therefore, the
performance level is only updated, and voltage domains notified, if
there is an actual change. The split functionality allows
signalPerfLevelUpdate to be called by startup() to explicitly force an
update post unserialization.

src/sim/clock_domain.cc
src/sim/clock_domain.hh

index 60c688b1a0a5ab2a28ea53e097d08186246aac5c..1ccee7f1da5f774615e92f4b81c9c749131334e6 100644 (file)
@@ -147,6 +147,11 @@ SrcClockDomain::perfLevel(PerfLevel perf_level)
 
     _perfLevel = perf_level;
 
+    signalPerfLevelUpdate();
+}
+
+void SrcClockDomain::signalPerfLevelUpdate()
+{
     // Signal the voltage domain that we have changed our perf level so that the
     // voltage domain can recompute its performance level
     voltageDomain()->sanitiseVoltages();
@@ -174,7 +179,7 @@ SrcClockDomain::startup()
 {
     // Perform proper clock update when all related components have been
     // created (i.e. after unserialization / object creation)
-    perfLevel(_perfLevel);
+    signalPerfLevelUpdate();
 }
 
 SrcClockDomain *
index 71627434a2d7d2c32572d66fa53971f8fa4afd78..6ba8b63961907b099aacf8112d7e8cb776611229 100644 (file)
@@ -243,6 +243,11 @@ class SrcClockDomain : public ClockDomain
     void unserialize(CheckpointIn &cp) override;
 
   private:
+    /**
+     * Inform other components about the changed performance level
+     */
+    void signalPerfLevelUpdate();
+
     /**
       * List of possible frequency operational points, should be in
       * descending order