Change subject: dev,arm: remove and recreate timer events around drains ...................................................................... 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 --- M src/dev/arm/generic_timer.cc M src/dev/arm/generic_timer.hh 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/dev/arm/generic_timer.cc b/src/dev/arm/generic_timer.cc index d33090d..990dfe9 100644 --- a/src/dev/arm/generic_timer.cc +++ b/src/dev/arm/generic_timer.cc @@ -179,13 +179,6 @@ 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 @@ // 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 diff --git a/src/dev/arm/generic_timer.hh b/src/dev/arm/generic_timer.hh index c606f1e..9963fc2 100644 --- a/src/dev/arm/generic_timer.hh +++ b/src/dev/arm/generic_timer.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015 ARM Limited + * Copyright (c) 2013, 2015, 2017 ARM Limited * All rights reserved. * * The license below extends only to copyright in the software and shall @@ -102,7 +102,7 @@ }; /// Per-CPU architected timer. -class ArchTimer : public Serializable +class ArchTimer : public Serializable, public Drainable { public: class Interrupt @@ -189,9 +189,14 @@ /// Returns the value of the counter which this timer relies on. uint64_t value() const; + // Serializable void serialize(CheckpointOut &cp) const override; void unserialize(CheckpointIn &cp) override; + // Drainable + DrainState drain() override; + void drainResume() override; + private: // Disable copying ArchTimer(const ArchTimer &t); -- To view, visit https://gem5-review.googlesource.com/3541 To unsubscribe, visit https://gem5-review.googlesource.com/settings Gerrit-Project: public/gem5 Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: Ia218868c69350d96e923c640634d492b5c19cd3f Gerrit-Change-Number: 3541 Gerrit-PatchSet: 1 Gerrit-Owner: Curtis Dunham <curtis.dun...@arm.com> _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev
Curtis Dunham has uploaded this change for review. (
https://gem5-review.googlesource.com/3541
- [gem5-dev] Change in public/gem5[master]: dev, a... Curtis Dunham (Gerrit)
- [gem5-dev] Change in public/gem5[master]: d... Andreas Sandberg (Gerrit)