X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fsim_events.cc;h=5e47adca1cd7023b1b8d445667a7d495eebd1d43;hb=3e33786db86c894b0e34bf018cbce412f9807447;hp=a4457a11ca04d18a0de0f3fb470aaab8be40c0aa;hpb=329db76e47c825d4ecbe0f5251dbcfaf2ec09516;p=gem5.git diff --git a/src/sim/sim_events.cc b/src/sim/sim_events.cc index a4457a11c..5e47adca1 100644 --- a/src/sim/sim_events.cc +++ b/src/sim/sim_events.cc @@ -1,5 +1,19 @@ /* + * Copyright (c) 2013 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 2002-2005 The Regents of The University of Michigan + * Copyright (c) 2013 Advanced Micro Devices, Inc. + * Copyright (c) 2013 Mark D. Hill and David A. Wood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,82 +46,125 @@ #include "base/callback.hh" #include "base/hostinfo.hh" -#include "sim/eventq.hh" -#include "sim/param.hh" +#include "sim/eventq_impl.hh" #include "sim/sim_events.hh" #include "sim/sim_exit.hh" -#include "sim/startup.hh" #include "sim/stats.hh" using namespace std; +GlobalSimLoopExitEvent::GlobalSimLoopExitEvent(Tick when, + const std::string &_cause, + int c, Tick r, bool serialize) + : GlobalEvent(when, Sim_Exit_Pri, + IsExitEvent | (serialize ? AutoSerialize : 0)), + cause(_cause), code(c), repeat(r) +{ +} + +const char * +GlobalSimLoopExitEvent::description() const +{ + return "global simulation loop exit"; +} + // // handle termination event // void -SimLoopExitEvent::process() +GlobalSimLoopExitEvent::process() { - // if this got scheduled on a different queue (e.g. the committed - // instruction queue) then make a corresponding event on the main - // queue. - if (theQueue() != &mainEventQueue) { - exitSimLoop(cause, code); - delete this; + if (repeat) { + schedule(curTick() + repeat); } +} - // otherwise do nothing... the IsExitEvent flag takes care of - // exiting the simulation loop and returning this object to Python +void +exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat, + bool serialize) +{ + new GlobalSimLoopExitEvent(when + simQuantum, message, exit_code, repeat, + serialize); +} - // but if you are doing this on intervals, don't forget to make another - if (repeat) { - schedule(curTick + repeat); - } +LocalSimLoopExitEvent::LocalSimLoopExitEvent() + : Event(Sim_Exit_Pri, IsExitEvent | AutoSerialize), + cause(""), code(0), repeat(0) +{ +} + +LocalSimLoopExitEvent::LocalSimLoopExitEvent(const std::string &_cause, int c, + Tick r, bool serialize) + : Event(Sim_Exit_Pri, IsExitEvent | (serialize ? AutoSerialize : 0)), + cause(_cause), code(c), repeat(r) +{ +} + +// +// handle termination event +// +void +LocalSimLoopExitEvent::process() +{ + exitSimLoop(cause, 0); } const char * -SimLoopExitEvent::description() +LocalSimLoopExitEvent::description() const { return "simulation loop exit"; } -SimLoopExitEvent * -schedExitSimLoop(const std::string &message, Tick when, Tick repeat, - EventQueue *q, int exit_code) +void +LocalSimLoopExitEvent::serialize(ostream &os) { - if (q == NULL) - q = &mainEventQueue; + paramOut(os, "type", string("SimLoopExitEvent")); + Event::serialize(os); - return new SimLoopExitEvent(q, when, repeat, message, exit_code); + SERIALIZE_SCALAR(cause); + SERIALIZE_SCALAR(code); + SERIALIZE_SCALAR(repeat); } void -exitSimLoop(const std::string &message, int exit_code) +LocalSimLoopExitEvent::unserialize(Checkpoint *cp, const string §ion) { - schedExitSimLoop(message, curTick, 0, NULL, exit_code); + Event::unserialize(cp, section); + + UNSERIALIZE_SCALAR(cause); + UNSERIALIZE_SCALAR(code); + UNSERIALIZE_SCALAR(repeat); } void -CountedDrainEvent::process() +LocalSimLoopExitEvent::unserialize(Checkpoint *cp, const string §ion, + EventQueue *eventq) { - if (--count == 0) { - exitSimLoop("Finished drain"); - } + Event::unserialize(cp, section, eventq); + + UNSERIALIZE_SCALAR(cause); + UNSERIALIZE_SCALAR(code); + UNSERIALIZE_SCALAR(repeat); } +Serializable * +LocalSimLoopExitEvent::createForUnserialize(Checkpoint *cp, + const string §ion) +{ + return new LocalSimLoopExitEvent(); +} + +REGISTER_SERIALIZEABLE("LocalSimLoopExitEvent", LocalSimLoopExitEvent) + // // constructor: automatically schedules at specified time // -CountedExitEvent::CountedExitEvent(EventQueue *q, const std::string &_cause, - Tick _when, int &_downCounter) - : Event(q, Sim_Exit_Pri), - cause(_cause), - downCounter(_downCounter) +CountedExitEvent::CountedExitEvent(const std::string &_cause, int &counter) + : Event(Sim_Exit_Pri), cause(_cause), downCounter(counter) { // catch stupid mistakes assert(downCounter > 0); - - schedule(_when); } @@ -124,37 +181,7 @@ CountedExitEvent::process() const char * -CountedExitEvent::description() +CountedExitEvent::description() const { return "counted exit"; } - -#ifdef CHECK_SWAP_CYCLES -new CheckSwapEvent(&mainEventQueue, CHECK_SWAP_CYCLES); -#endif - -void -CheckSwapEvent::process() -{ - /* Check the amount of free swap space */ - long swap; - - /* returns free swap in KBytes */ - swap = procInfo("/proc/meminfo", "SwapFree:"); - - if (swap < 1000) - ccprintf(cerr, "\a\a\aWarning! Swap space is low (%d)\n", swap); - - if (swap < 100) { - cerr << "\a\aAborting Simulation! Inadequate swap space!\n\n"; - exitSimLoop("Lack of swap space"); - } - - schedule(curTick + interval); -} - -const char * -CheckSwapEvent::description() -{ - return "check swap"; -}