diff --git a/src/dev/multi_etherlink.hh b/src/dev/multi_etherlink.hh --- a/src/dev/multi_etherlink.hh +++ b/src/dev/multi_etherlink.hh @@ -72,7 +72,7 @@ * The link will encapsulate and transfer Ethernet packets to/from * the message server. */ - class Link + class Link : public Serializable { protected: std::string objName; @@ -95,8 +95,8 @@ bool busy() const { return (bool)packet; } void setLocalInt(LocalIface *i) { assert(!localIface); localIface=i; } - void serialize(const std::string &base, CheckpointOut &cp) const; - void unserialize(const std::string &base, CheckpointIn &cp); + void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE; + void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; }; /** @@ -223,10 +223,8 @@ virtual EtherInt *getEthPort(const std::string &if_name, int idx) M5_ATTR_OVERRIDE; - - void memWriteback() M5_ATTR_OVERRIDE; - void init() M5_ATTR_OVERRIDE; - void startup() M5_ATTR_OVERRIDE; + virtual void init() M5_ATTR_OVERRIDE; + virtual void startup() M5_ATTR_OVERRIDE; void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE; void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; # Node ID bad3fbf4a977e4670a338853110311c908b0a69c # Parent a171d990e57fc4a7db70ffcf1090d890060db0c0 diff --git a/src/dev/multi_etherlink.cc b/src/dev/multi_etherlink.cc --- a/src/dev/multi_etherlink.cc +++ b/src/dev/multi_etherlink.cc @@ -118,26 +118,20 @@ return localIface; } -void MultiEtherLink::memWriteback() -{ - DPRINTF(MultiEthernet,"MultiEtherLink::memWriteback() called\n"); - multiIface->drainDone(); -} - void MultiEtherLink::serialize(CheckpointOut &cp) const { - multiIface->serialize("multiIface", cp); - txLink->serialize("txLink", cp); - rxLink->serialize("rxLink", cp); + multiIface->serializeSection(cp, "multiIface"); + txLink->serializeSection(cp, "txLink"); + rxLink->serializeSection(cp, "rxLink"); } void MultiEtherLink::unserialize(CheckpointIn &cp) { - multiIface->unserialize("multiIface", cp); - txLink->unserialize("txLink", cp); - rxLink->unserialize("rxLink", cp); + multiIface->unserializeSection(cp, "multiIface"); + txLink->unserializeSection(cp, "txLink"); + rxLink->unserializeSection(cp, "rxLink"); } void @@ -222,36 +216,36 @@ } void -MultiEtherLink::Link::serialize(const string &base, CheckpointOut &cp) const +MultiEtherLink::Link::serialize(CheckpointOut &cp) const { bool packet_exists = (packet != nullptr); - paramOut(cp, base + ".packet_exists", packet_exists); + SERIALIZE_SCALAR(packet_exists); if (packet_exists) - packet->serialize(base + ".packet", cp); + packet->serialize("packet", cp); bool event_scheduled = event->scheduled(); - paramOut(cp, base + ".event_scheduled", event_scheduled); + SERIALIZE_SCALAR(event_scheduled); if (event_scheduled) { Tick event_time = event->when(); - paramOut(cp, base + ".event_time", event_time); + SERIALIZE_SCALAR(event_time); } } void -MultiEtherLink::Link::unserialize(const string &base, CheckpointIn &cp) +MultiEtherLink::Link::unserialize(CheckpointIn &cp) { bool packet_exists; - paramIn(cp, base + ".packet_exists", packet_exists); + UNSERIALIZE_SCALAR(packet_exists); if (packet_exists) { packet = make_shared(16384); - packet->unserialize(base + ".packet", cp); + packet->unserialize("packet", cp); } bool event_scheduled; - paramIn(cp, base + ".event_scheduled", event_scheduled); + UNSERIALIZE_SCALAR(event_scheduled); if (event_scheduled) { Tick event_time; - paramIn(cp, base + ".event_time", event_time); + UNSERIALIZE_SCALAR(event_time); parent->schedule(*event, event_time); } } diff --git a/src/dev/multi_iface.hh b/src/dev/multi_iface.hh --- a/src/dev/multi_iface.hh +++ b/src/dev/multi_iface.hh @@ -95,7 +95,7 @@ /** * The interface class to talk to peer gem5 processes. */ -class MultiIface : public Drainable +class MultiIface : public Drainable, public Serializable { public: /*! @@ -226,7 +226,7 @@ * 3. Simulation thread(s) then waits until all receiver threads * completes the ongoing barrier. The global sync event is done. */ - class SyncEvent : public GlobalSyncEvent + class SyncEvent : public GlobalSyncEvent, public Serializable { public: /** @@ -281,8 +281,8 @@ */ void resume(); - void serialize(const std::string &base, CheckpointOut &cp) const; - void unserialize(const std::string &base, CheckpointIn &cp); + void serialize(CheckpointOut &cp) const; + void unserialize(CheckpointIn &cp); }; /** @@ -489,8 +489,8 @@ */ void startPeriodicSync(); - void serialize(const std::string &base, CheckpointOut &cp) const; - void unserialize(const std::string &base, CheckpointIn &cp); + void serialize(CheckpointOut &cp) const; + void unserialize(CheckpointIn &cp); /** * Getter for the multi rank param. diff --git a/src/dev/multi_iface.cc b/src/dev/multi_iface.cc --- a/src/dev/multi_iface.cc +++ b/src/dev/multi_iface.cc @@ -292,21 +292,19 @@ "(curTick:%lld)\n", sync_tick, curTick()); } -void MultiIface::SyncEvent::serialize(const std::string &base, - CheckpointOut &cp) const +void MultiIface::SyncEvent::serialize(CheckpointOut &cp) const { // Save the periodic multi sync schedule information - paramOut(cp, base + ".periodicSyncRepeat", repeat); - paramOut(cp, base + ".periodicSyncInterrupted", interrupted); - paramOut(cp, base + ".periodicSyncAt", scheduledAt); + SERIALIZE_SCALAR(repeat); + SERIALIZE_SCALAR(interrupted); + SERIALIZE_SCALAR(scheduledAt); } -void MultiIface::SyncEvent::unserialize(const std::string &base, - CheckpointIn &cp) +void MultiIface::SyncEvent::unserialize(CheckpointIn &cp) { - paramIn(cp, base + ".periodicSyncRepeat", repeat); - paramIn(cp, base + ".periodicSyncInterrupted", interrupted); - paramIn(cp, base + ".periodicSyncAt", scheduledAt); + UNSERIALIZE_SCALAR(repeat); + UNSERIALIZE_SCALAR(interrupted); + UNSERIALIZE_SCALAR(scheduledAt); } MultiIface::MultiIface(unsigned multi_rank, @@ -527,7 +525,8 @@ } } -void MultiIface::serialize(const std::string &base, CheckpointOut &cp) const +void +MultiIface::serialize(CheckpointOut &cp) const { // Drain the multi interface before the checkpoint is taken. We cannot call // this as part of the normal drain cycle because this multi sync has to be @@ -537,54 +536,55 @@ // This sync request may interrupt an on-going periodic sync in some peers. sync->run(SyncTrigger::ckpt, curTick()); - // Save the periodic multi sync status - syncEvent->serialize(base, cp); - unsigned n_rx_packets = recvQueue.size(); if (scheduledRecvPacket != nullptr) n_rx_packets++; - paramOut(cp, base + ".nRxPackets", n_rx_packets); + SERIALIZE_SCALAR(n_rx_packets); if (n_rx_packets > 0) { assert(recvDone->scheduled()); - scheduledRecvPacket->serialize(base + ".rxPacket[0]", cp); + scheduledRecvPacket->serialize("rxPacket[0]", cp); } for (unsigned i=1; i < n_rx_packets; i++) { const RecvInfo recv_info = recvQueue.impl().at(i-1); - recv_info.first->serialize(base + csprintf(".rxPacket[%d]", i), cp); + recv_info.first->serialize(csprintf(".rxPacket[%d]", i), cp); Tick rx_tick = recv_info.second; - paramOut(cp, base + csprintf(".rxTick[%d]", i), rx_tick); + paramOut(cp, csprintf("rxTick[%d]", i), rx_tick); } + + // Save the periodic multi sync status + syncEvent->serializeSection(cp, "syncEvent"); } -void MultiIface::unserialize(const std::string &base, CheckpointIn &cp) +void +MultiIface::unserialize(CheckpointIn &cp) { assert(recvQueue.size() == 0); assert(scheduledRecvPacket == nullptr); assert(recvDone->scheduled() == false); - // restore periodic sync info - syncEvent->unserialize(base, cp); - unsigned n_rx_packets; - paramIn(cp, base + ".nRxPackets", n_rx_packets); + UNSERIALIZE_SCALAR(n_rx_packets); if (n_rx_packets > 0) { scheduledRecvPacket = std::make_shared(16384); - scheduledRecvPacket->unserialize(base + ".rxPacket[0]", cp); + scheduledRecvPacket->unserialize("rxPacket[0]", cp); // Note: receive event will be scheduled when the link is unserialized } for (unsigned i=1; i < n_rx_packets; i++) { EthPacketPtr rx_packet = std::make_shared(16384); - rx_packet->unserialize(base + csprintf(".rxPacket[%d]", i), cp); + rx_packet->unserialize(csprintf(".rxPacket[%d]", i), cp); Tick rx_tick = 0; - paramIn(cp, base + csprintf(".rxTick[%d]", i), rx_tick); + paramIn(cp, csprintf(".rxTick[%d]", i), rx_tick); assert(rx_tick > 0); recvQueue.emplace(rx_packet,rx_tick); } + + // restore periodic sync info + syncEvent->unserializeSection(cp, "syncEvent"); } void MultiIface::initRandom()