summaryrefslogtreecommitdiff
path: root/src/dev/arm/generic_timer.cc
diff options
context:
space:
mode:
authorCurtis Dunham <Curtis.Dunham@arm.com>2017-05-18 21:18:48 +0000
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-07-05 14:24:03 +0000
commite2a049e089b4878d6abd8e816973b175e2be2d7c (patch)
tree196ca2952e623920c1d8da558b8fef3a4c0e5784 /src/dev/arm/generic_timer.cc
parentb829b4a8e4ef82345cf81d442dbc6c67016fde98 (diff)
downloadgem5-e2a049e089b4878d6abd8e816973b175e2be2d7c.tar.xz
dev,arm: remove and recreate timer events around drains
Having timer events stored in checkpoints complicates Kvm execution. We change the timer behavior so that it always deschedules any pending events on a drain() and recreates them on a drainResume(), thus they will never appear in checkpoints henceforth. This pattern of behavior makes it simpler to handle Kvm execution, where the hardware performs the timer function directly. Change-Id: Ia218868c69350d96e923c640634d492b5c19cd3f Reviewed-on: https://gem5-review.googlesource.com/3541 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/dev/arm/generic_timer.cc')
-rw-r--r--src/dev/arm/generic_timer.cc32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/dev/arm/generic_timer.cc b/src/dev/arm/generic_timer.cc
index efaebb1ba..48f70e135 100644
--- a/src/dev/arm/generic_timer.cc
+++ b/src/dev/arm/generic_timer.cc
@@ -179,13 +179,6 @@ ArchTimer::serialize(CheckpointOut &cp) const
paramOut(cp, "control_serial", _control);
SERIALIZE_SCALAR(_counterLimit);
SERIALIZE_SCALAR(_offset);
-
- const bool event_scheduled(_counterLimitReachedEvent.scheduled());
- SERIALIZE_SCALAR(event_scheduled);
- if (event_scheduled) {
- const Tick event_time(_counterLimitReachedEvent.when());
- SERIALIZE_SCALAR(event_time);
- }
}
void
@@ -197,13 +190,24 @@ ArchTimer::unserialize(CheckpointIn &cp)
// compatibility.
if (!UNSERIALIZE_OPT_SCALAR(_offset))
_offset = 0;
- bool event_scheduled;
- UNSERIALIZE_SCALAR(event_scheduled);
- if (event_scheduled) {
- Tick event_time;
- UNSERIALIZE_SCALAR(event_time);
- _parent.schedule(_counterLimitReachedEvent, event_time);
- }
+
+ // We no longer schedule an event here because we may enter KVM
+ // emulation. The event creation is delayed until drainResume().
+}
+
+DrainState
+ArchTimer::drain()
+{
+ if (_counterLimitReachedEvent.scheduled())
+ _parent.deschedule(_counterLimitReachedEvent);
+
+ return DrainState::Drained;
+}
+
+void
+ArchTimer::drainResume()
+{
+ updateCounter();
}
void