Andreas Sandberg has submitted this change and it was merged. (
https://gem5-review.googlesource.com/3541 )
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
Reviewed-on: https://gem5-review.googlesource.com/3541
Reviewed-by: Andreas Sandberg <andreas.sandb...@arm.com>
Maintainer: Andreas Sandberg <andreas.sandb...@arm.com>
---
M src/dev/arm/generic_timer.cc
M src/dev/arm/generic_timer.hh
2 files changed, 25 insertions(+), 16 deletions(-)
Approvals:
Andreas Sandberg: Looks good to me, approved; Looks good to me, approved
diff --git a/src/dev/arm/generic_timer.cc b/src/dev/arm/generic_timer.cc
index efaebb1..48f70e1 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 3a38954..3eec1d4 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
@@ -188,9 +188,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: merged
Gerrit-Change-Id: Ia218868c69350d96e923c640634d492b5c19cd3f
Gerrit-Change-Number: 3541
Gerrit-PatchSet: 3
Gerrit-Owner: Curtis Dunham <curtis.dun...@arm.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Curtis Dunham <curtis.dun...@arm.com>
Gerrit-Reviewer: Gabe Black <gabebl...@google.com>
Gerrit-Reviewer: Weiping Liao <weipingl...@google.com>
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev