From: Joel Hestness Date: Mon, 7 Feb 2011 06:14:17 +0000 (-0800) Subject: x86: Add checkpointing capability to arch components X-Git-Tag: stable_2012_02_02~594 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=911ccef6c05fff4832245414baa7b2a67955c35a;p=gem5.git x86: Add checkpointing capability to arch components Add checkpointing capability to the x86 interrupt device and the TLBs --- diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc index 61800e1ea..9b2d42a16 100644 --- a/src/arch/x86/interrupts.cc +++ b/src/arch/x86/interrupts.cc @@ -706,6 +706,65 @@ X86ISA::Interrupts::updateIntrInfo(ThreadContext *tc) } } +void +X86ISA::Interrupts::serialize(std::ostream &os) +{ + SERIALIZE_ARRAY(regs, NUM_APIC_REGS); + SERIALIZE_SCALAR(clock); + SERIALIZE_SCALAR(pendingSmi); + SERIALIZE_SCALAR(smiVector); + SERIALIZE_SCALAR(pendingNmi); + SERIALIZE_SCALAR(nmiVector); + SERIALIZE_SCALAR(pendingExtInt); + SERIALIZE_SCALAR(extIntVector); + SERIALIZE_SCALAR(pendingInit); + SERIALIZE_SCALAR(initVector); + SERIALIZE_SCALAR(pendingStartup); + SERIALIZE_SCALAR(startupVector); + SERIALIZE_SCALAR(startedUp); + SERIALIZE_SCALAR(pendingUnmaskableInt); + SERIALIZE_SCALAR(pendingIPIs); + SERIALIZE_SCALAR(IRRV); + SERIALIZE_SCALAR(ISRV); + bool apicTimerEventScheduled = apicTimerEvent.scheduled(); + SERIALIZE_SCALAR(apicTimerEventScheduled); + Tick apicTimerEventTick = apicTimerEvent.when(); + SERIALIZE_SCALAR(apicTimerEventTick); +} + +void +X86ISA::Interrupts::unserialize(Checkpoint *cp, const std::string §ion) +{ + UNSERIALIZE_ARRAY(regs, NUM_APIC_REGS); + UNSERIALIZE_SCALAR(clock); + UNSERIALIZE_SCALAR(pendingSmi); + UNSERIALIZE_SCALAR(smiVector); + UNSERIALIZE_SCALAR(pendingNmi); + UNSERIALIZE_SCALAR(nmiVector); + UNSERIALIZE_SCALAR(pendingExtInt); + UNSERIALIZE_SCALAR(extIntVector); + UNSERIALIZE_SCALAR(pendingInit); + UNSERIALIZE_SCALAR(initVector); + UNSERIALIZE_SCALAR(pendingStartup); + UNSERIALIZE_SCALAR(startupVector); + UNSERIALIZE_SCALAR(startedUp); + UNSERIALIZE_SCALAR(pendingUnmaskableInt); + UNSERIALIZE_SCALAR(pendingIPIs); + UNSERIALIZE_SCALAR(IRRV); + UNSERIALIZE_SCALAR(ISRV); + bool apicTimerEventScheduled; + UNSERIALIZE_SCALAR(apicTimerEventScheduled); + if (apicTimerEventScheduled) { + Tick apicTimerEventTick; + UNSERIALIZE_SCALAR(apicTimerEventTick); + if (apicTimerEvent.scheduled()) { + reschedule(apicTimerEvent, apicTimerEventTick, true); + } else { + schedule(apicTimerEvent, apicTimerEventTick); + } + } +} + X86ISA::Interrupts * X86LocalApicParams::create() { diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh index 55651bf3b..e45610ec7 100644 --- a/src/arch/x86/interrupts.hh +++ b/src/arch/x86/interrupts.hh @@ -257,17 +257,8 @@ class Interrupts : public BasicPioDevice, IntDev * Serialization. */ - void - serialize(std::ostream &os) - { - warn("Interrupts::serialize unimplemented!\n"); - } - - void - unserialize(Checkpoint *cp, const std::string §ion) - { - warn("Interrupts::unserialize unimplemented!\n"); - } + virtual void serialize(std::ostream &os); + virtual void unserialize(Checkpoint *cp, const std::string §ion); /* * Old functions needed for compatability but which will be phased out diff --git a/src/arch/x86/pagetable.cc b/src/arch/x86/pagetable.cc index 6de4c956f..a7717def7 100644 --- a/src/arch/x86/pagetable.cc +++ b/src/arch/x86/pagetable.cc @@ -52,11 +52,29 @@ TlbEntry::TlbEntry(Addr asn, Addr _vaddr, Addr _paddr) : void TlbEntry::serialize(std::ostream &os) { + SERIALIZE_SCALAR(paddr); + SERIALIZE_SCALAR(vaddr); + SERIALIZE_SCALAR(size); + SERIALIZE_SCALAR(writable); + SERIALIZE_SCALAR(user); + SERIALIZE_SCALAR(uncacheable); + SERIALIZE_SCALAR(global); + SERIALIZE_SCALAR(patBit); + SERIALIZE_SCALAR(noExec); } void TlbEntry::unserialize(Checkpoint *cp, const std::string §ion) { + UNSERIALIZE_SCALAR(paddr); + UNSERIALIZE_SCALAR(vaddr); + UNSERIALIZE_SCALAR(size); + UNSERIALIZE_SCALAR(writable); + UNSERIALIZE_SCALAR(user); + UNSERIALIZE_SCALAR(uncacheable); + UNSERIALIZE_SCALAR(global); + UNSERIALIZE_SCALAR(patBit); + UNSERIALIZE_SCALAR(noExec); } }