serialize.hh revision 13107
12SN/A/* 213107Sgiacomo.travaglini@arm.com * Copyright (c) 2015, 2018 ARM Limited 310905Sandreas.sandberg@arm.com * All rights reserved 410905Sandreas.sandberg@arm.com * 510905Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 610905Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 710905Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 810905Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 910905Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1010905Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1110905Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1210905Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1310905Sandreas.sandberg@arm.com * 141762SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 152SN/A * All rights reserved. 162SN/A * 172SN/A * Redistribution and use in source and binary forms, with or without 182SN/A * modification, are permitted provided that the following conditions are 192SN/A * met: redistributions of source code must retain the above copyright 202SN/A * notice, this list of conditions and the following disclaimer; 212SN/A * redistributions in binary form must reproduce the above copyright 222SN/A * notice, this list of conditions and the following disclaimer in the 232SN/A * documentation and/or other materials provided with the distribution; 242SN/A * neither the name of the copyright holders nor the names of its 252SN/A * contributors may be used to endorse or promote products derived from 262SN/A * this software without specific prior written permission. 272SN/A * 282SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 322SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392665Ssaidi@eecs.umich.edu * 402760Sbinkertn@umich.edu * Authors: Nathan Binkert 412760Sbinkertn@umich.edu * Erik Hallnor 422665Ssaidi@eecs.umich.edu * Steve Reinhardt 4310905Sandreas.sandberg@arm.com * Andreas Sandberg 442SN/A */ 452SN/A 462SN/A/* @file 472SN/A * Serialization Interface Declarations 482SN/A */ 492SN/A 502SN/A#ifndef __SERIALIZE_HH__ 512SN/A#define __SERIALIZE_HH__ 522SN/A 532SN/A 5413107Sgiacomo.travaglini@arm.com#include <algorithm> 558229Snate@binkert.org#include <iostream> 562SN/A#include <list> 578229Snate@binkert.org#include <map> 5810905Sandreas.sandberg@arm.com#include <stack> 5911076SCurtis.Dunham@arm.com#include <set> 604841Ssaidi@eecs.umich.edu#include <vector> 612SN/A 6210459SAndreas.Sandberg@ARM.com#include "base/bitunion.hh" 632SN/A 6411800Sbrandon.potter@amd.comclass CheckpointIn; 652738Sstever@eecs.umich.educlass IniFile; 66395SN/Aclass Serializable; 674000Ssaidi@eecs.umich.educlass SimObject; 6811067Sandreas.sandberg@arm.comclass SimObjectResolver; 692SN/A 7010905Sandreas.sandberg@arm.comtypedef std::ostream CheckpointOut; 7110905Sandreas.sandberg@arm.com 7210905Sandreas.sandberg@arm.com 73217SN/Atemplate <class T> 7410905Sandreas.sandberg@arm.comvoid paramOut(CheckpointOut &cp, const std::string &name, const T ¶m); 75217SN/A 7612452Sgabeblack@google.comtemplate <typename T> 7712452Sgabeblack@google.comvoid 7812452Sgabeblack@google.comparamOut(CheckpointOut &cp, const std::string &name, const BitUnionType<T> &p) 7910459SAndreas.Sandberg@ARM.com{ 8012452Sgabeblack@google.com paramOut(cp, name, static_cast<BitUnionBaseType<T> >(p)); 8110459SAndreas.Sandberg@ARM.com} 8210459SAndreas.Sandberg@ARM.com 83217SN/Atemplate <class T> 8410905Sandreas.sandberg@arm.comvoid paramIn(CheckpointIn &cp, const std::string &name, T ¶m); 85217SN/A 8612452Sgabeblack@google.comtemplate <typename T> 8712452Sgabeblack@google.comvoid 8812452Sgabeblack@google.comparamIn(CheckpointIn &cp, const std::string &name, BitUnionType<T> &p) 8910459SAndreas.Sandberg@ARM.com{ 9012452Sgabeblack@google.com BitUnionBaseType<T> b; 9112452Sgabeblack@google.com paramIn(cp, name, b); 9212452Sgabeblack@google.com p = b; 9310459SAndreas.Sandberg@ARM.com} 9410459SAndreas.Sandberg@ARM.com 95217SN/Atemplate <class T> 9611075SCurtis.Dunham@arm.combool optParamIn(CheckpointIn &cp, const std::string &name, T ¶m, 9711075SCurtis.Dunham@arm.com bool warn = true); 986820SLisa.Hsu@amd.com 9912452Sgabeblack@google.comtemplate <typename T> 10012452Sgabeblack@google.combool 10112452Sgabeblack@google.comoptParamIn(CheckpointIn &cp, const std::string &name, 10212452Sgabeblack@google.com BitUnionType<T> &p, bool warn = true) 10310459SAndreas.Sandberg@ARM.com{ 10412452Sgabeblack@google.com BitUnionBaseType<T> b; 10512452Sgabeblack@google.com if (optParamIn(cp, name, b, warn)) { 10612452Sgabeblack@google.com p = b; 10712452Sgabeblack@google.com return true; 10812452Sgabeblack@google.com } else { 10912452Sgabeblack@google.com return false; 11012452Sgabeblack@google.com } 11110459SAndreas.Sandberg@ARM.com} 11210459SAndreas.Sandberg@ARM.com 1136820SLisa.Hsu@amd.comtemplate <class T> 11410905Sandreas.sandberg@arm.comvoid arrayParamOut(CheckpointOut &cp, const std::string &name, 1156227Snate@binkert.org const T *param, unsigned size); 116217SN/A 117217SN/Atemplate <class T> 11810905Sandreas.sandberg@arm.comvoid arrayParamOut(CheckpointOut &cp, const std::string &name, 1194841Ssaidi@eecs.umich.edu const std::vector<T> ¶m); 1204841Ssaidi@eecs.umich.edu 1214841Ssaidi@eecs.umich.edutemplate <class T> 12210905Sandreas.sandberg@arm.comvoid arrayParamOut(CheckpointOut &cp, const std::string &name, 1237948SAli.Saidi@ARM.com const std::list<T> ¶m); 1247948SAli.Saidi@ARM.com 1257948SAli.Saidi@ARM.comtemplate <class T> 12611076SCurtis.Dunham@arm.comvoid arrayParamOut(CheckpointOut &cp, const std::string &name, 12711076SCurtis.Dunham@arm.com const std::set<T> ¶m); 12811076SCurtis.Dunham@arm.com 12911076SCurtis.Dunham@arm.comtemplate <class T> 13010905Sandreas.sandberg@arm.comvoid arrayParamIn(CheckpointIn &cp, const std::string &name, 13110905Sandreas.sandberg@arm.com T *param, unsigned size); 132217SN/A 1334841Ssaidi@eecs.umich.edutemplate <class T> 13410905Sandreas.sandberg@arm.comvoid arrayParamIn(CheckpointIn &cp, const std::string &name, 13510905Sandreas.sandberg@arm.com std::vector<T> ¶m); 1364841Ssaidi@eecs.umich.edu 1377948SAli.Saidi@ARM.comtemplate <class T> 13810905Sandreas.sandberg@arm.comvoid arrayParamIn(CheckpointIn &cp, const std::string &name, 13910905Sandreas.sandberg@arm.com std::list<T> ¶m); 1407948SAli.Saidi@ARM.com 14111076SCurtis.Dunham@arm.comtemplate <class T> 14211076SCurtis.Dunham@arm.comvoid arrayParamIn(CheckpointIn &cp, const std::string &name, 14311076SCurtis.Dunham@arm.com std::set<T> ¶m); 14411076SCurtis.Dunham@arm.com 145237SN/Avoid 14610905Sandreas.sandberg@arm.comobjParamIn(CheckpointIn &cp, const std::string &name, SimObject * ¶m); 147237SN/A 14813107Sgiacomo.travaglini@arm.comtemplate <class T> 14913107Sgiacomo.travaglini@arm.comstatic void 15013107Sgiacomo.travaglini@arm.comarrayParamOut(CheckpointOut &cp, const std::string &name, 15113107Sgiacomo.travaglini@arm.com const BitUnionType<T> *param, unsigned size) 15213107Sgiacomo.travaglini@arm.com{ 15313107Sgiacomo.travaglini@arm.com // We copy the array into a vector. This is needed since we cannot 15413107Sgiacomo.travaglini@arm.com // directly typecast a pointer to BitUnionType<T> into a pointer 15513107Sgiacomo.travaglini@arm.com // of BitUnionBaseType<T> but we can typecast BitUnionType<T> 15613107Sgiacomo.travaglini@arm.com // to BitUnionBaseType<T> since we overloaded the typecast operator 15713107Sgiacomo.travaglini@arm.com std::vector<BitUnionBaseType<T>> bitunion_vec(param, param + size); 15813107Sgiacomo.travaglini@arm.com 15913107Sgiacomo.travaglini@arm.com arrayParamOut(cp, name, bitunion_vec); 16013107Sgiacomo.travaglini@arm.com} 16113107Sgiacomo.travaglini@arm.com 16213107Sgiacomo.travaglini@arm.comtemplate <class T> 16313107Sgiacomo.travaglini@arm.comstatic void 16413107Sgiacomo.travaglini@arm.comarrayParamIn(CheckpointIn &cp, const std::string &name, 16513107Sgiacomo.travaglini@arm.com BitUnionType<T> *param, unsigned size) 16613107Sgiacomo.travaglini@arm.com{ 16713107Sgiacomo.travaglini@arm.com std::vector<BitUnionBaseType<T>> bitunion_vec(size); 16813107Sgiacomo.travaglini@arm.com 16913107Sgiacomo.travaglini@arm.com arrayParamIn(cp, name, bitunion_vec); 17013107Sgiacomo.travaglini@arm.com std::copy(bitunion_vec.begin(), bitunion_vec.end(), param); 17113107Sgiacomo.travaglini@arm.com} 17213107Sgiacomo.travaglini@arm.com 173217SN/A// 174217SN/A// These macros are streamlined to use in serialize/unserialize 175217SN/A// functions. It's assumed that serialize() has a parameter 'os' for 176237SN/A// the ostream, and unserialize() has parameters 'cp' and 'section'. 17710905Sandreas.sandberg@arm.com#define SERIALIZE_SCALAR(scalar) paramOut(cp, #scalar, scalar) 178217SN/A 17910905Sandreas.sandberg@arm.com#define UNSERIALIZE_SCALAR(scalar) paramIn(cp, #scalar, scalar) 18010905Sandreas.sandberg@arm.com#define UNSERIALIZE_OPT_SCALAR(scalar) optParamIn(cp, #scalar, scalar) 181217SN/A 182223SN/A// ENUMs are like SCALARs, but we cast them to ints on the way out 18310905Sandreas.sandberg@arm.com#define SERIALIZE_ENUM(scalar) paramOut(cp, #scalar, (int)scalar) 184223SN/A 18511068Sandreas.sandberg@arm.com#define UNSERIALIZE_ENUM(scalar) \ 18611068Sandreas.sandberg@arm.com do { \ 18711068Sandreas.sandberg@arm.com int tmp; \ 18811068Sandreas.sandberg@arm.com paramIn(cp, #scalar, tmp); \ 18911068Sandreas.sandberg@arm.com scalar = static_cast<decltype(scalar)>(tmp); \ 19011068Sandreas.sandberg@arm.com } while (0) 191223SN/A 1925543Ssaidi@eecs.umich.edu#define SERIALIZE_ARRAY(member, size) \ 19310905Sandreas.sandberg@arm.com arrayParamOut(cp, #member, member, size) 194217SN/A 1955543Ssaidi@eecs.umich.edu#define UNSERIALIZE_ARRAY(member, size) \ 19610905Sandreas.sandberg@arm.com arrayParamIn(cp, #member, member, size) 197237SN/A 19810903Sandreas.sandberg@arm.com#define SERIALIZE_CONTAINER(member) \ 19910905Sandreas.sandberg@arm.com arrayParamOut(cp, #member, member) 20010903Sandreas.sandberg@arm.com 20110903Sandreas.sandberg@arm.com#define UNSERIALIZE_CONTAINER(member) \ 20210905Sandreas.sandberg@arm.com arrayParamIn(cp, #member, member) 20310903Sandreas.sandberg@arm.com 20410906Sandreas.sandberg@arm.com#define SERIALIZE_EVENT(event) event.serializeSection(cp, #event); 20510906Sandreas.sandberg@arm.com 20610906Sandreas.sandberg@arm.com#define UNSERIALIZE_EVENT(event) \ 20710906Sandreas.sandberg@arm.com do { \ 20810906Sandreas.sandberg@arm.com event.unserializeSection(cp, #event); \ 20910906Sandreas.sandberg@arm.com eventQueue()->checkpointReschedule(&event); \ 21011321Ssteve.reinhardt@amd.com } while (0) 21110906Sandreas.sandberg@arm.com 21210908Sandreas.sandberg@arm.com#define SERIALIZE_OBJ(obj) obj.serializeSection(cp, #obj) 21310908Sandreas.sandberg@arm.com#define UNSERIALIZE_OBJ(obj) obj.unserializeSection(cp, #obj) 21410906Sandreas.sandberg@arm.com 21510905Sandreas.sandberg@arm.com#define SERIALIZE_OBJPTR(objptr) paramOut(cp, #objptr, (objptr)->name()) 216237SN/A 2175543Ssaidi@eecs.umich.edu#define UNSERIALIZE_OBJPTR(objptr) \ 21811068Sandreas.sandberg@arm.com do { \ 21911068Sandreas.sandberg@arm.com SimObject *sptr; \ 22011068Sandreas.sandberg@arm.com objParamIn(cp, #objptr, sptr); \ 22111068Sandreas.sandberg@arm.com objptr = dynamic_cast<decltype(objptr)>(sptr); \ 22211068Sandreas.sandberg@arm.com } while (0) 223217SN/A 2249342SAndreas.Sandberg@arm.com/** 2252SN/A * Basic support for object serialization. 2269342SAndreas.Sandberg@arm.com * 22710905Sandreas.sandberg@arm.com * Objects that support serialization should derive from this 22810905Sandreas.sandberg@arm.com * class. Such objects can largely be divided into two categories: 1) 22910905Sandreas.sandberg@arm.com * True SimObjects (deriving from SimObject), and 2) child objects 23010905Sandreas.sandberg@arm.com * (non-SimObjects). 23110905Sandreas.sandberg@arm.com * 23210905Sandreas.sandberg@arm.com * SimObjects are serialized automatically into their own sections 23310905Sandreas.sandberg@arm.com * automatically by the SimObject base class (see 23410905Sandreas.sandberg@arm.com * SimObject::serializeAll(). 23510905Sandreas.sandberg@arm.com * 23610905Sandreas.sandberg@arm.com * SimObjects can contain other serializable objects that are not 23710905Sandreas.sandberg@arm.com * SimObjects. Much like normal serialized members are not serialized 23810905Sandreas.sandberg@arm.com * automatically, these objects will not be serialized automatically 23910905Sandreas.sandberg@arm.com * and it is expected that the objects owning such serializable 24010905Sandreas.sandberg@arm.com * objects call the required serialization/unserialization methods on 24110905Sandreas.sandberg@arm.com * child objects. The preferred method to serialize a child object is 24210905Sandreas.sandberg@arm.com * to call serializeSection() on the child, which serializes the 24310905Sandreas.sandberg@arm.com * object into a new subsection in the current section. Another option 24410905Sandreas.sandberg@arm.com * is to call serialize() directly, which serializes the object into 24510905Sandreas.sandberg@arm.com * the current section. The latter is not recommended as it can lead 24610905Sandreas.sandberg@arm.com * to naming clashes between objects. 24710905Sandreas.sandberg@arm.com * 2489342SAndreas.Sandberg@arm.com * @note Many objects that support serialization need to be put in a 2499342SAndreas.Sandberg@arm.com * consistent state when serialization takes place. We refer to the 2509342SAndreas.Sandberg@arm.com * action of forcing an object into a consistent state as 2519342SAndreas.Sandberg@arm.com * 'draining'. Objects that need draining inherit from Drainable. See 2529342SAndreas.Sandberg@arm.com * Drainable for more information. 2532SN/A */ 254395SN/Aclass Serializable 2552SN/A{ 2562SN/A protected: 25710905Sandreas.sandberg@arm.com /** 25810905Sandreas.sandberg@arm.com * Scoped checkpoint section helper class 25910905Sandreas.sandberg@arm.com * 26010905Sandreas.sandberg@arm.com * This helper class creates a section within a checkpoint without 26110905Sandreas.sandberg@arm.com * the need for a separate serializeable object. It is mainly used 26210905Sandreas.sandberg@arm.com * within the Serializable class when serializing or unserializing 26310905Sandreas.sandberg@arm.com * section (see serializeSection() and unserializeSection()). It 26410905Sandreas.sandberg@arm.com * can also be used to maintain backwards compatibility in 26510905Sandreas.sandberg@arm.com * existing code that serializes structs that are not inheriting 26610905Sandreas.sandberg@arm.com * from Serializable into subsections. 26710905Sandreas.sandberg@arm.com * 26810905Sandreas.sandberg@arm.com * When the class is instantiated, it appends a name to the active 26910905Sandreas.sandberg@arm.com * path in a checkpoint. The old path is later restored when the 27010905Sandreas.sandberg@arm.com * instance is destroyed. For example, serializeSection() could be 27110905Sandreas.sandberg@arm.com * implemented by instantiating a ScopedCheckpointSection and then 27210905Sandreas.sandberg@arm.com * calling serialize() on an object. 27310905Sandreas.sandberg@arm.com */ 27410905Sandreas.sandberg@arm.com class ScopedCheckpointSection { 27510905Sandreas.sandberg@arm.com public: 27610905Sandreas.sandberg@arm.com template<class CP> 27710905Sandreas.sandberg@arm.com ScopedCheckpointSection(CP &cp, const char *name) { 27810905Sandreas.sandberg@arm.com pushName(name); 27910905Sandreas.sandberg@arm.com nameOut(cp); 28010905Sandreas.sandberg@arm.com } 28110905Sandreas.sandberg@arm.com 28210905Sandreas.sandberg@arm.com template<class CP> 28310905Sandreas.sandberg@arm.com ScopedCheckpointSection(CP &cp, const std::string &name) { 28410905Sandreas.sandberg@arm.com pushName(name.c_str()); 28510905Sandreas.sandberg@arm.com nameOut(cp); 28610905Sandreas.sandberg@arm.com } 28710905Sandreas.sandberg@arm.com 28810905Sandreas.sandberg@arm.com ~ScopedCheckpointSection(); 28910905Sandreas.sandberg@arm.com 29010905Sandreas.sandberg@arm.com ScopedCheckpointSection() = delete; 29110905Sandreas.sandberg@arm.com ScopedCheckpointSection(const ScopedCheckpointSection &) = delete; 29210905Sandreas.sandberg@arm.com ScopedCheckpointSection &operator=( 29310905Sandreas.sandberg@arm.com const ScopedCheckpointSection &) = delete; 29410905Sandreas.sandberg@arm.com ScopedCheckpointSection &operator=( 29510905Sandreas.sandberg@arm.com ScopedCheckpointSection &&) = delete; 29610905Sandreas.sandberg@arm.com 29710905Sandreas.sandberg@arm.com private: 29810905Sandreas.sandberg@arm.com void pushName(const char *name); 29910905Sandreas.sandberg@arm.com void nameOut(CheckpointOut &cp); 30010905Sandreas.sandberg@arm.com void nameOut(CheckpointIn &cp) {}; 30110905Sandreas.sandberg@arm.com }; 3022SN/A 3032SN/A public: 3045739Snate@binkert.org Serializable(); 3055739Snate@binkert.org virtual ~Serializable(); 3062SN/A 30710905Sandreas.sandberg@arm.com /** 30810905Sandreas.sandberg@arm.com * Serialize an object 30910905Sandreas.sandberg@arm.com * 31010905Sandreas.sandberg@arm.com * Output an object's state into the current checkpoint section. 31110905Sandreas.sandberg@arm.com * 31210905Sandreas.sandberg@arm.com * @param cp Checkpoint state 31310905Sandreas.sandberg@arm.com */ 31410905Sandreas.sandberg@arm.com virtual void serialize(CheckpointOut &cp) const = 0; 3152SN/A 31610905Sandreas.sandberg@arm.com /** 31710905Sandreas.sandberg@arm.com * Unserialize an object 31810905Sandreas.sandberg@arm.com * 31910905Sandreas.sandberg@arm.com * Read an object's state from the current checkpoint section. 32010905Sandreas.sandberg@arm.com * 32110905Sandreas.sandberg@arm.com * @param cp Checkpoint state 32210905Sandreas.sandberg@arm.com */ 32310905Sandreas.sandberg@arm.com virtual void unserialize(CheckpointIn &cp) = 0; 324237SN/A 32510905Sandreas.sandberg@arm.com /** 32610905Sandreas.sandberg@arm.com * Serialize an object into a new section 32710905Sandreas.sandberg@arm.com * 32810905Sandreas.sandberg@arm.com * This method creates a new section in a checkpoint and calls 32910905Sandreas.sandberg@arm.com * serialize() to serialize the current object into that 33010905Sandreas.sandberg@arm.com * section. The name of the section is appended to the current 33110905Sandreas.sandberg@arm.com * checkpoint path. 33210905Sandreas.sandberg@arm.com * 33310905Sandreas.sandberg@arm.com * @param cp Checkpoint state 33410905Sandreas.sandberg@arm.com * @param name Name to append to the active path 33510905Sandreas.sandberg@arm.com */ 33610905Sandreas.sandberg@arm.com void serializeSection(CheckpointOut &cp, const char *name) const; 33710905Sandreas.sandberg@arm.com 33810905Sandreas.sandberg@arm.com void serializeSection(CheckpointOut &cp, const std::string &name) const { 33910905Sandreas.sandberg@arm.com serializeSection(cp, name.c_str()); 34010905Sandreas.sandberg@arm.com } 34110905Sandreas.sandberg@arm.com 34210905Sandreas.sandberg@arm.com /** 34310905Sandreas.sandberg@arm.com * Unserialize an a child object 34410905Sandreas.sandberg@arm.com * 34510905Sandreas.sandberg@arm.com * This method loads a child object from a checkpoint. The object 34610905Sandreas.sandberg@arm.com * name is appended to the active path to form a fully qualified 34710905Sandreas.sandberg@arm.com * section name and unserialize() is called. 34810905Sandreas.sandberg@arm.com * 34910905Sandreas.sandberg@arm.com * @param cp Checkpoint state 35010905Sandreas.sandberg@arm.com * @param name Name to append to the active path 35110905Sandreas.sandberg@arm.com */ 35210905Sandreas.sandberg@arm.com void unserializeSection(CheckpointIn &cp, const char *name); 35310905Sandreas.sandberg@arm.com 35410905Sandreas.sandberg@arm.com void unserializeSection(CheckpointIn &cp, const std::string &name) { 35510905Sandreas.sandberg@arm.com unserializeSection(cp, name.c_str()); 35610905Sandreas.sandberg@arm.com } 35710905Sandreas.sandberg@arm.com 35810905Sandreas.sandberg@arm.com /** Get the fully-qualified name of the active section */ 35910905Sandreas.sandberg@arm.com static const std::string ¤tSection(); 36010905Sandreas.sandberg@arm.com 3612287SN/A static int ckptCount; 3622287SN/A static int ckptMaxCount; 3632287SN/A static int ckptPrevCount; 3642868Sktlim@umich.edu static void serializeAll(const std::string &cpt_dir); 36510905Sandreas.sandberg@arm.com static void unserializeGlobals(CheckpointIn &cp); 36610905Sandreas.sandberg@arm.com 36710905Sandreas.sandberg@arm.com private: 36810905Sandreas.sandberg@arm.com static std::stack<std::string> path; 3692SN/A}; 3702SN/A 3719554Sandreas.hansson@arm.comvoid debug_serialize(const std::string &cpt_dir); 3729554Sandreas.hansson@arm.com 37310453SAndrew.Bardsley@arm.com 37410905Sandreas.sandberg@arm.comclass CheckpointIn 375237SN/A{ 376237SN/A private: 377237SN/A 378237SN/A IniFile *db; 379237SN/A 38010453SAndrew.Bardsley@arm.com SimObjectResolver &objNameResolver; 38110453SAndrew.Bardsley@arm.com 382237SN/A public: 38310905Sandreas.sandberg@arm.com CheckpointIn(const std::string &cpt_dir, SimObjectResolver &resolver); 38410905Sandreas.sandberg@arm.com ~CheckpointIn(); 385237SN/A 386937SN/A const std::string cptDir; 387937SN/A 388237SN/A bool find(const std::string §ion, const std::string &entry, 389237SN/A std::string &value); 390237SN/A 391237SN/A bool findObj(const std::string §ion, const std::string &entry, 3924000Ssaidi@eecs.umich.edu SimObject *&value); 393304SN/A 39411655Sandreas.sandberg@arm.com 39511655Sandreas.sandberg@arm.com bool entryExists(const std::string §ion, const std::string &entry); 396304SN/A bool sectionExists(const std::string §ion); 397449SN/A 398449SN/A // The following static functions have to do with checkpoint 399449SN/A // creation rather than restoration. This class makes a handy 4007491Ssteve.reinhardt@amd.com // namespace for them though. Currently no Checkpoint object is 4017491Ssteve.reinhardt@amd.com // created on serialization (only unserialization) so we track the 4027491Ssteve.reinhardt@amd.com // directory name as a global. It would be nice to change this 4037491Ssteve.reinhardt@amd.com // someday 4047491Ssteve.reinhardt@amd.com 4057491Ssteve.reinhardt@amd.com private: 4067491Ssteve.reinhardt@amd.com // current directory we're serializing into. 4077491Ssteve.reinhardt@amd.com static std::string currentDirectory; 4087491Ssteve.reinhardt@amd.com 4097491Ssteve.reinhardt@amd.com public: 4107491Ssteve.reinhardt@amd.com // Set the current directory. This function takes care of 4117823Ssteve.reinhardt@amd.com // inserting curTick() if there's a '%d' in the argument, and 4127491Ssteve.reinhardt@amd.com // appends a '/' if necessary. The final name is returned. 4137491Ssteve.reinhardt@amd.com static std::string setDir(const std::string &base_name); 414449SN/A 415449SN/A // Export current checkpoint directory name so other objects can 416449SN/A // derive filenames from it (e.g., memory). The return value is 417449SN/A // guaranteed to end in '/' so filenames can be directly appended. 418449SN/A // This function is only valid while a checkpoint is being created. 419449SN/A static std::string dir(); 420449SN/A 421449SN/A // Filename for base checkpoint file within directory. 422449SN/A static const char *baseFilename; 423237SN/A}; 4242SN/A 4252SN/A#endif // __SERIALIZE_HH__ 426