summaryrefslogtreecommitdiff
path: root/src/dev/mc146818.cc
diff options
context:
space:
mode:
authorBrad Beckmann <Brad.Beckmann@amd.com>2010-08-20 11:46:13 -0700
committerBrad Beckmann <Brad.Beckmann@amd.com>2010-08-20 11:46:13 -0700
commit283be34a992401f07d62e274d501c4185fca8377 (patch)
tree14b04337496b5addb3d65a0eef627709fd954150 /src/dev/mc146818.cc
parentb6d08e0455a9256a157d683eb31c7af541c30ce9 (diff)
downloadgem5-283be34a992401f07d62e274d501c4185fca8377.tar.xz
devices: Fixed periodic interrupts to work with draining
Added drain functions to the RTC and 8254 timer so that periodic interrupts stop when the system is draining. This patch is needed to checkpoint in timing mode. Otherwise under certain situations, the event queue will never be completely empty.
Diffstat (limited to 'src/dev/mc146818.cc')
-rw-r--r--src/dev/mc146818.cc25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/dev/mc146818.cc b/src/dev/mc146818.cc
index 16ed58e46..fd70b503b 100644
--- a/src/dev/mc146818.cc
+++ b/src/dev/mc146818.cc
@@ -40,6 +40,7 @@
#include "base/trace.hh"
#include "dev/mc146818.hh"
#include "dev/rtcreg.h"
+#include "sim/sim_object.hh"
using namespace std;
@@ -105,8 +106,12 @@ MC146818::MC146818(EventManager *em, const string &n, const struct tm time,
MC146818::~MC146818()
{
- deschedule(tickEvent);
- deschedule(event);
+ if (tickEvent.scheduled()) {
+ deschedule(tickEvent);
+ }
+ if (event.scheduled()) {
+ deschedule(event);
+ }
}
void
@@ -203,6 +208,20 @@ MC146818::tickClock()
setTime(*gmtime(&calTime));
}
+unsigned int
+MC146818::drain(Event *de)
+{
+ if (event.scheduled()) {
+ rtcTimerInterruptTickOffset = event.when() - curTick;
+ rtcClockTickOffset = event.when() - curTick;
+ deschedule(event);
+ }
+ if (tickEvent.scheduled()) {
+ deschedule(tickEvent);
+ }
+ return 0;
+}
+
void
MC146818::serialize(const string &base, ostream &os)
{
@@ -214,9 +233,7 @@ MC146818::serialize(const string &base, ostream &os)
// save the timer tick and rtc clock tick values to correctly reschedule
// them during unserialize
//
- Tick rtcTimerInterruptTickOffset = event.when() - curTick;
SERIALIZE_SCALAR(rtcTimerInterruptTickOffset);
- Tick rtcClockTickOffset = event.when() - curTick;
SERIALIZE_SCALAR(rtcClockTickOffset);
}