dev, arm: Make GenericTimer param handling more robust
authorAndreas Sandberg <andreas.sandberg@arm.com>
Fri, 7 Oct 2016 13:14:44 +0000 (14:14 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Fri, 7 Oct 2016 13:14:44 +0000 (14:14 +0100)
The generic timer needs a pointer to an ArmSystem to wire itself to the
system register handler. This was previously specified as an instance
of System that was later cast to ArmSystem. Make this more robust by
specifying it as an ArmSystem in the Python interface and add a check
to make sure that it is non-NULL.

Change-Id: I989455e666f4ea324df28124edbbadfd094b0d02
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
src/dev/arm/RealView.py
src/dev/arm/generic_timer.cc

index 30e498ce13446a9396780b06d134eaac3c2615ad..8b9b4c20da48c10686cd6bc8166a3951fa4672b4 100644 (file)
@@ -231,7 +231,7 @@ class CpuLocalTimer(BasicPioDevice):
 class GenericTimer(SimObject):
     type = 'GenericTimer'
     cxx_header = "dev/arm/generic_timer.hh"
-    system = Param.System(Parent.any, "system")
+    system = Param.ArmSystem(Parent.any, "system")
     gic = Param.BaseGic(Parent.any, "GIC to use for interrupting")
     # @todo: for now only two timers per CPU is supported, which is the
     # normal behaviour when security extensions are disabled.
index 173855b88fae8bf2ff14613aadd2910c288a4c5f..1b8d917e946d1156837fc54c835e4f2b0abd9988 100644 (file)
@@ -234,7 +234,8 @@ GenericTimer::GenericTimer(GenericTimerParams *p)
       irqPhys(p->int_phys),
       irqVirt(p->int_virt)
 {
-    dynamic_cast<ArmSystem &>(*p->system).setGenericTimer(this);
+    fatal_if(!p->system, "No system specified, can't instantiate timer.\n");
+    p->system->setGenericTimer(this);
 }
 
 void