dev: prevent RTC events firing before startup
This change includes edits to MC146818 timer to prevent RTC events firing before startup to comply with SimObject initialization call sequence. Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
parent
1ee70e9d84
commit
02c376ac44
9 changed files with 49 additions and 9 deletions
|
@ -284,6 +284,12 @@ TsunamiIO::unserialize(Checkpoint *cp, const string §ion)
|
|||
rtc.unserialize("rtc", cp, section);
|
||||
}
|
||||
|
||||
void
|
||||
TsunamiIO::startup()
|
||||
{
|
||||
rtc.startup();
|
||||
}
|
||||
|
||||
TsunamiIO *
|
||||
TsunamiIOParams::create()
|
||||
{
|
||||
|
|
|
@ -151,6 +151,11 @@ class TsunamiIO : public BasicPioDevice
|
|||
*/
|
||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
|
||||
/**
|
||||
* Start running.
|
||||
*/
|
||||
virtual void startup();
|
||||
|
||||
};
|
||||
|
||||
#endif // __DEV_TSUNAMI_IO_HH__
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include "debug/Timer.hh"
|
||||
#include "dev/arm/amba_device.hh"
|
||||
#include "dev/arm/rtc_pl031.hh"
|
||||
#include "dev/mc146818.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
|
||||
|
|
|
@ -122,6 +122,15 @@ MC146818::rega_dv_disabled(const RtcRegA ®)
|
|||
reg.dv == RTCA_DV_DISABLED1;
|
||||
}
|
||||
|
||||
void
|
||||
MC146818::startup()
|
||||
{
|
||||
assert(!event.scheduled());
|
||||
assert(!tickEvent.scheduled());
|
||||
schedule(event, curTick() + event.offset);
|
||||
schedule(tickEvent, curTick() + tickEvent.offset);
|
||||
}
|
||||
|
||||
void
|
||||
MC146818::writeData(const uint8_t addr, const uint8_t data)
|
||||
{
|
||||
|
@ -291,17 +300,16 @@ MC146818::unserialize(const string &base, Checkpoint *cp,
|
|||
//
|
||||
Tick rtcTimerInterruptTickOffset;
|
||||
UNSERIALIZE_SCALAR(rtcTimerInterruptTickOffset);
|
||||
reschedule(event, curTick() + rtcTimerInterruptTickOffset);
|
||||
event.offset = rtcTimerInterruptTickOffset;
|
||||
Tick rtcClockTickOffset;
|
||||
UNSERIALIZE_SCALAR(rtcClockTickOffset);
|
||||
reschedule(tickEvent, curTick() + rtcClockTickOffset);
|
||||
tickEvent.offset = rtcClockTickOffset;
|
||||
}
|
||||
|
||||
MC146818::RTCEvent::RTCEvent(MC146818 * _parent, Tick i)
|
||||
: parent(_parent), interval(i)
|
||||
: parent(_parent), interval(i), offset(i)
|
||||
{
|
||||
DPRINTF(MC146818, "RTC Event Initilizing\n");
|
||||
parent->schedule(this, curTick() + interval);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -51,6 +51,7 @@ class MC146818 : public EventManager
|
|||
{
|
||||
MC146818 * parent;
|
||||
Tick interval;
|
||||
Tick offset;
|
||||
|
||||
RTCEvent(MC146818 * _parent, Tick i);
|
||||
|
||||
|
@ -68,11 +69,11 @@ class MC146818 : public EventManager
|
|||
struct RTCTickEvent : public Event
|
||||
{
|
||||
MC146818 * parent;
|
||||
Tick offset;
|
||||
|
||||
RTCTickEvent(MC146818 * _parent) : parent(_parent)
|
||||
{
|
||||
parent->schedule(this, curTick() + SimClock::Int::s);
|
||||
}
|
||||
RTCTickEvent(MC146818 * _parent) :
|
||||
parent(_parent), offset(SimClock::Int::s)
|
||||
{}
|
||||
|
||||
/** Event process to occur at interrupt*/
|
||||
void process();
|
||||
|
@ -153,6 +154,9 @@ class MC146818 : public EventManager
|
|||
bool bcd, Tick frequency);
|
||||
virtual ~MC146818();
|
||||
|
||||
/** Start ticking */
|
||||
virtual void startup();
|
||||
|
||||
/** RTC write data */
|
||||
void writeData(const uint8_t addr, const uint8_t data);
|
||||
|
||||
|
|
|
@ -142,6 +142,12 @@ MaltaIO::unserialize(Checkpoint *cp, const string §ion)
|
|||
rtc.unserialize("rtc", cp, section);
|
||||
}
|
||||
|
||||
void
|
||||
MaltaIO::startup()
|
||||
{
|
||||
rtc.startup();
|
||||
}
|
||||
|
||||
MaltaIO *
|
||||
MaltaIOParams::create()
|
||||
{
|
||||
|
|
|
@ -143,6 +143,11 @@ class MaltaIO : public BasicPioDevice
|
|||
*/
|
||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
|
||||
/**
|
||||
* Start running.
|
||||
*/
|
||||
virtual void startup();
|
||||
|
||||
};
|
||||
|
||||
#endif // __DEV_MALTA_IO_HH__
|
||||
|
|
|
@ -112,6 +112,12 @@ X86ISA::Cmos::writeRegister(uint8_t reg, uint8_t val)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
X86ISA::Cmos::startup()
|
||||
{
|
||||
rtc.startup();
|
||||
}
|
||||
|
||||
void
|
||||
X86ISA::Cmos::serialize(std::ostream &os)
|
||||
{
|
||||
|
|
|
@ -82,6 +82,7 @@ class Cmos : public BasicPioDevice
|
|||
|
||||
Tick write(PacketPtr pkt);
|
||||
|
||||
virtual void startup();
|
||||
virtual void serialize(std::ostream &os);
|
||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
|
||||
|
|
Loading…
Reference in a new issue