sim_object.cc revision 5530:bbfff6d0c42c
16145Snate@binkert.org/*
26145Snate@binkert.org * Copyright (c) 2001-2005 The Regents of The University of Michigan
36145Snate@binkert.org * All rights reserved.
46145Snate@binkert.org *
56145Snate@binkert.org * Redistribution and use in source and binary forms, with or without
66145Snate@binkert.org * modification, are permitted provided that the following conditions are
76145Snate@binkert.org * met: redistributions of source code must retain the above copyright
86145Snate@binkert.org * notice, this list of conditions and the following disclaimer;
96145Snate@binkert.org * redistributions in binary form must reproduce the above copyright
106145Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
116145Snate@binkert.org * documentation and/or other materials provided with the distribution;
126145Snate@binkert.org * neither the name of the copyright holders nor the names of its
136145Snate@binkert.org * contributors may be used to endorse or promote products derived from
146145Snate@binkert.org * this software without specific prior written permission.
156145Snate@binkert.org *
166145Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176145Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186145Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196145Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206145Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216145Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226145Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236145Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246145Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256145Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266145Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276145Snate@binkert.org *
286145Snate@binkert.org * Authors: Steve Reinhardt
297002Snate@binkert.org *          Nathan Binkert
307002Snate@binkert.org */
317002Snate@binkert.org
327039Snate@binkert.org#include <assert.h>
336154Snate@binkert.org
346145Snate@binkert.org#include "base/callback.hh"
357002Snate@binkert.org#include "base/inifile.hh"
367002Snate@binkert.org#include "base/match.hh"
376145Snate@binkert.org#include "base/misc.hh"
386145Snate@binkert.org#include "base/trace.hh"
397039Snate@binkert.org#include "base/stats/events.hh"
407039Snate@binkert.org#include "sim/host.hh"
417039Snate@binkert.org#include "sim/sim_object.hh"
426145Snate@binkert.org#include "sim/stats.hh"
436145Snate@binkert.org
446145Snate@binkert.orgusing namespace std;
456145Snate@binkert.org
466145Snate@binkert.org
476145Snate@binkert.org////////////////////////////////////////////////////////////////////////
487039Snate@binkert.org//
497039Snate@binkert.org// SimObject member definitions
506145Snate@binkert.org//
517039Snate@binkert.org////////////////////////////////////////////////////////////////////////
527039Snate@binkert.org
536145Snate@binkert.org//
546145Snate@binkert.org// static list of all SimObjects, used for initialization etc.
557039Snate@binkert.org//
567039Snate@binkert.orgSimObject::SimObjectList SimObject::simObjectList;
576145Snate@binkert.org
587039Snate@binkert.org//
597039Snate@binkert.org// SimObject constructor: used to maintain static simObjectList
607039Snate@binkert.org//
617039Snate@binkert.orgSimObject::SimObject(const Params *p)
627039Snate@binkert.org    : _params(p)
637039Snate@binkert.org{
647039Snate@binkert.org#ifdef DEBUG
657039Snate@binkert.org    doDebugBreak = false;
667039Snate@binkert.org#endif
676145Snate@binkert.org
687039Snate@binkert.org    simObjectList.push_back(this);
697039Snate@binkert.org    state = Running;
706145Snate@binkert.org}
716145Snate@binkert.org
726145Snate@binkert.orgvoid
737039Snate@binkert.orgSimObject::init()
747039Snate@binkert.org{
756145Snate@binkert.org}
767039Snate@binkert.org
777039Snate@binkert.org//
787039Snate@binkert.org// no default statistics, so nothing to do in base implementation
796145Snate@binkert.org//
807039Snate@binkert.orgvoid
817039Snate@binkert.orgSimObject::regStats()
826145Snate@binkert.org{
837039Snate@binkert.org}
847039Snate@binkert.org
857039Snate@binkert.orgvoid
867039Snate@binkert.orgSimObject::regFormulas()
877039Snate@binkert.org{
887039Snate@binkert.org}
897039Snate@binkert.org
907039Snate@binkert.orgvoid
917039Snate@binkert.orgSimObject::resetStats()
927039Snate@binkert.org{
937039Snate@binkert.org}
946145Snate@binkert.org
957039Snate@binkert.org//
967039Snate@binkert.org// static function:
977039Snate@binkert.org//   call regStats() on all SimObjects and then regFormulas() on all
987039Snate@binkert.org//   SimObjects.
997039Snate@binkert.org//
1007039Snate@binkert.orgstruct SimObjectResetCB : public Callback
1017039Snate@binkert.org{
1027039Snate@binkert.org    virtual void process() { SimObject::resetAllStats(); }
1037039Snate@binkert.org};
1047039Snate@binkert.org
1057039Snate@binkert.orgnamespace {
1066145Snate@binkert.org    static SimObjectResetCB StatResetCB;
1077039Snate@binkert.org}
1087039Snate@binkert.org
1097039Snate@binkert.orgvoid
1106145Snate@binkert.orgSimObject::regAllStats()
1116145Snate@binkert.org{
1127039Snate@binkert.org    SimObjectList::iterator i;
1137039Snate@binkert.org    SimObjectList::iterator end = simObjectList.end();
1146145Snate@binkert.org
1157039Snate@binkert.org    /**
1167039Snate@binkert.org     * @todo change cprintfs to DPRINTFs
1177039Snate@binkert.org     */
1186145Snate@binkert.org    for (i = simObjectList.begin(); i != end; ++i) {
1197039Snate@binkert.org#ifdef STAT_DEBUG
1207039Snate@binkert.org        cprintf("registering stats for %s\n", (*i)->name());
1217039Snate@binkert.org#endif
1226145Snate@binkert.org        (*i)->regStats();
1237039Snate@binkert.org    }
1247039Snate@binkert.org
1257039Snate@binkert.org    for (i = simObjectList.begin(); i != end; ++i) {
1267039Snate@binkert.org#ifdef STAT_DEBUG
1276145Snate@binkert.org        cprintf("registering formulas for %s\n", (*i)->name());
1286145Snate@binkert.org#endif
1296145Snate@binkert.org        (*i)->regFormulas();
1306145Snate@binkert.org    }
1316145Snate@binkert.org
1326145Snate@binkert.org    Stats::registerResetCallback(&StatResetCB);
1337039Snate@binkert.org}
1347039Snate@binkert.org
1356145Snate@binkert.org//
1367039Snate@binkert.org// static function: call init() on all SimObjects.
1377039Snate@binkert.org//
1387039Snate@binkert.orgvoid
1397039Snate@binkert.orgSimObject::initAll()
1407039Snate@binkert.org{
1417039Snate@binkert.org    SimObjectList::iterator i = simObjectList.begin();
1427039Snate@binkert.org    SimObjectList::iterator end = simObjectList.end();
1436145Snate@binkert.org
1446145Snate@binkert.org    for (; i != end; ++i) {
1457039Snate@binkert.org        SimObject *obj = *i;
1467039Snate@binkert.org        obj->init();
1476145Snate@binkert.org    }
1487039Snate@binkert.org}
1496145Snate@binkert.org
1506145Snate@binkert.org//
1517039Snate@binkert.org// static function: call resetStats() on all SimObjects.
1527039Snate@binkert.org//
1536145Snate@binkert.orgvoid
1547039Snate@binkert.orgSimObject::resetAllStats()
1557039Snate@binkert.org{
1567039Snate@binkert.org    SimObjectList::iterator i = simObjectList.begin();
1577039Snate@binkert.org    SimObjectList::iterator end = simObjectList.end();
1587039Snate@binkert.org
1596145Snate@binkert.org    for (; i != end; ++i) {
1606145Snate@binkert.org        SimObject *obj = *i;
1617039Snate@binkert.org        obj->resetStats();
1627039Snate@binkert.org    }
1636145Snate@binkert.org}
1647039Snate@binkert.org
1657039Snate@binkert.org//
1666145Snate@binkert.org// static function: serialize all SimObjects.
1677039Snate@binkert.org//
1686145Snate@binkert.orgvoid
1697039Snate@binkert.orgSimObject::serializeAll(ostream &os)
1707039Snate@binkert.org{
1717039Snate@binkert.org    SimObjectList::reverse_iterator ri = simObjectList.rbegin();
1727039Snate@binkert.org    SimObjectList::reverse_iterator rend = simObjectList.rend();
1737039Snate@binkert.org
1747039Snate@binkert.org    for (; ri != rend; ++ri) {
1757039Snate@binkert.org        SimObject *obj = *ri;
1767039Snate@binkert.org        obj->nameOut(os);
1777039Snate@binkert.org        obj->serialize(os);
1787039Snate@binkert.org   }
1797039Snate@binkert.org}
1807039Snate@binkert.org
1817039Snate@binkert.orgvoid
1827039Snate@binkert.orgSimObject::unserializeAll(Checkpoint *cp)
1837039Snate@binkert.org{
1847039Snate@binkert.org    SimObjectList::reverse_iterator ri = simObjectList.rbegin();
1857039Snate@binkert.org    SimObjectList::reverse_iterator rend = simObjectList.rend();
1867039Snate@binkert.org
1877039Snate@binkert.org    for (; ri != rend; ++ri) {
1886145Snate@binkert.org        SimObject *obj = *ri;
1896145Snate@binkert.org        DPRINTFR(Config, "Unserializing '%s'\n",
1907039Snate@binkert.org                 obj->name());
1917039Snate@binkert.org        if(cp->sectionExists(obj->name()))
1926145Snate@binkert.org            obj->unserialize(cp, obj->name());
1937039Snate@binkert.org        else
1946145Snate@binkert.org            warn("Not unserializing '%s': no section found in checkpoint.\n",
195                 obj->name());
196   }
197}
198
199#ifdef DEBUG
200//
201// static function: flag which objects should have the debugger break
202//
203void
204SimObject::debugObjectBreak(const string &objs)
205{
206    SimObjectList::const_iterator i = simObjectList.begin();
207    SimObjectList::const_iterator end = simObjectList.end();
208
209    ObjectMatch match(objs);
210    for (; i != end; ++i) {
211        SimObject *obj = *i;
212        obj->doDebugBreak = match.match(obj->name());
213   }
214}
215
216void
217debugObjectBreak(const char *objs)
218{
219    SimObject::debugObjectBreak(string(objs));
220}
221#endif
222
223void
224SimObject::recordEvent(const std::string &stat)
225{
226    Stats::recordEvent(stat);
227}
228
229unsigned int
230SimObject::drain(Event *drain_event)
231{
232    state = Drained;
233    return 0;
234}
235
236void
237SimObject::resume()
238{
239    state = Running;
240}
241
242void
243SimObject::setMemoryMode(State new_mode)
244{
245    panic("setMemoryMode() should only be called on systems");
246}
247
248void
249SimObject::switchOut()
250{
251    panic("Unimplemented!");
252}
253
254void
255SimObject::takeOverFrom(BaseCPU *cpu)
256{
257    panic("Unimplemented!");
258}
259
260
261SimObject *
262SimObject::find(const char *name)
263{
264    SimObjectList::const_iterator i = simObjectList.begin();
265    SimObjectList::const_iterator end = simObjectList.end();
266
267    for (; i != end; ++i) {
268        SimObject *obj = *i;
269        if (obj->name() == name)
270            return obj;
271    }
272
273    return NULL;
274}
275