sim_object.cc revision 5314
15643Sgblack@eecs.umich.edu/*
25643Sgblack@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan
35643Sgblack@eecs.umich.edu * All rights reserved.
45643Sgblack@eecs.umich.edu *
55643Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65643Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75643Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95643Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115643Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125643Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135643Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145643Sgblack@eecs.umich.edu * this software without specific prior written permission.
155643Sgblack@eecs.umich.edu *
165643Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175643Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185643Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195643Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205643Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215643Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225643Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235643Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245643Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255643Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265643Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275643Sgblack@eecs.umich.edu *
285643Sgblack@eecs.umich.edu * Authors: Steve Reinhardt
295643Sgblack@eecs.umich.edu *          Nathan Binkert
305643Sgblack@eecs.umich.edu */
3111793Sbrandon.potter@amd.com
3211793Sbrandon.potter@amd.com#include <assert.h>
336138Sgblack@eecs.umich.edu
345651Sgblack@eecs.umich.edu#include "base/callback.hh"
358746Sgblack@eecs.umich.edu#include "base/inifile.hh"
368232Snate@binkert.org#include "base/match.hh"
375657Sgblack@eecs.umich.edu#include "base/misc.hh"
385643Sgblack@eecs.umich.edu#include "base/trace.hh"
395643Sgblack@eecs.umich.edu#include "base/stats/events.hh"
405643Sgblack@eecs.umich.edu#include "sim/host.hh"
415643Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
429805Sstever@gmail.com#include "sim/stats.hh"
439808Sstever@gmail.com
449805Sstever@gmail.comusing namespace std;
455643Sgblack@eecs.umich.edu
467913SBrad.Beckmann@amd.com
477913SBrad.Beckmann@amd.com////////////////////////////////////////////////////////////////////////
487913SBrad.Beckmann@amd.com//
497913SBrad.Beckmann@amd.com// SimObject member definitions
507913SBrad.Beckmann@amd.com//
516136Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////////
525643Sgblack@eecs.umich.edu
535643Sgblack@eecs.umich.edu//
545653Sgblack@eecs.umich.edu// static list of all SimObjects, used for initialization etc.
555653Sgblack@eecs.umich.edu//
565653Sgblack@eecs.umich.eduSimObject::SimObjectList SimObject::simObjectList;
575653Sgblack@eecs.umich.edu
585827Sgblack@eecs.umich.edu//
595653Sgblack@eecs.umich.edu// SimObject constructor: used to maintain static simObjectList
6014290Sgabeblack@google.com//
6114290Sgabeblack@google.comSimObject::SimObject(const Params *p)
6214291Sgabeblack@google.com    : _params(p)
6314290Sgabeblack@google.com{
645643Sgblack@eecs.umich.edu#ifdef DEBUG
655643Sgblack@eecs.umich.edu    doDebugBreak = false;
667913SBrad.Beckmann@amd.com#endif
677913SBrad.Beckmann@amd.com
687913SBrad.Beckmann@amd.com    simObjectList.push_back(this);
697913SBrad.Beckmann@amd.com    state = Running;
707913SBrad.Beckmann@amd.com}
719807Sstever@gmail.com
727913SBrad.Beckmann@amd.comSimObjectParams *
739805Sstever@gmail.comSimObject::makeParams(const std::string &name)
749807Sstever@gmail.com{
757913SBrad.Beckmann@amd.com    SimObjectParams *params = new SimObjectParams;
767913SBrad.Beckmann@amd.com    params->name = name;
7713784Sgabeblack@google.com    return params;
7813784Sgabeblack@google.com}
799805Sstever@gmail.com
809805Sstever@gmail.comvoid
819805Sstever@gmail.comSimObject::init()
8214290Sgabeblack@google.com{
8314290Sgabeblack@google.com}
8414290Sgabeblack@google.com
8514290Sgabeblack@google.com//
869805Sstever@gmail.com// no default statistics, so nothing to do in base implementation
879805Sstever@gmail.com//
8814295Sgabeblack@google.comvoid
8911144Sjthestness@gmail.comSimObject::regStats()
9011144Sjthestness@gmail.com{
9111144Sjthestness@gmail.com}
9211144Sjthestness@gmail.com
9314295Sgabeblack@google.comvoid
9411144Sjthestness@gmail.comSimObject::regFormulas()
9511144Sjthestness@gmail.com{
9611144Sjthestness@gmail.com}
975643Sgblack@eecs.umich.edu
985643Sgblack@eecs.umich.eduvoid
995643Sgblack@eecs.umich.eduSimObject::resetStats()
1005643Sgblack@eecs.umich.edu{
1015643Sgblack@eecs.umich.edu}
1025643Sgblack@eecs.umich.edu
10313229Sgabeblack@google.com//
1045643Sgblack@eecs.umich.edu// static function:
1055643Sgblack@eecs.umich.edu//   call regStats() on all SimObjects and then regFormulas() on all
10613229Sgabeblack@google.com//   SimObjects.
1075643Sgblack@eecs.umich.edu//
1085643Sgblack@eecs.umich.edustruct SimObjectResetCB : public Callback
1095643Sgblack@eecs.umich.edu{
1105643Sgblack@eecs.umich.edu    virtual void process() { SimObject::resetAllStats(); }
1115898Sgblack@eecs.umich.edu};
1129805Sstever@gmail.com
1135643Sgblack@eecs.umich.edunamespace {
1145643Sgblack@eecs.umich.edu    static SimObjectResetCB StatResetCB;
1155643Sgblack@eecs.umich.edu}
1165643Sgblack@eecs.umich.edu
1175643Sgblack@eecs.umich.eduvoid
1185643Sgblack@eecs.umich.eduSimObject::regAllStats()
1195643Sgblack@eecs.umich.edu{
1205643Sgblack@eecs.umich.edu    SimObjectList::iterator i;
1215643Sgblack@eecs.umich.edu    SimObjectList::iterator end = simObjectList.end();
12213229Sgabeblack@google.com
1235643Sgblack@eecs.umich.edu    /**
1245643Sgblack@eecs.umich.edu     * @todo change cprintfs to DPRINTFs
12513229Sgabeblack@google.com     */
1265643Sgblack@eecs.umich.edu    for (i = simObjectList.begin(); i != end; ++i) {
1275643Sgblack@eecs.umich.edu#ifdef STAT_DEBUG
1285643Sgblack@eecs.umich.edu        cprintf("registering stats for %s\n", (*i)->name());
1295643Sgblack@eecs.umich.edu#endif
1305898Sgblack@eecs.umich.edu        (*i)->regStats();
1319805Sstever@gmail.com    }
1325643Sgblack@eecs.umich.edu
1335643Sgblack@eecs.umich.edu    for (i = simObjectList.begin(); i != end; ++i) {
1345643Sgblack@eecs.umich.edu#ifdef STAT_DEBUG
1355643Sgblack@eecs.umich.edu        cprintf("registering formulas for %s\n", (*i)->name());
1365643Sgblack@eecs.umich.edu#endif
1375643Sgblack@eecs.umich.edu        (*i)->regFormulas();
1387913SBrad.Beckmann@amd.com    }
1395643Sgblack@eecs.umich.edu
1405643Sgblack@eecs.umich.edu    Stats::registerResetCallback(&StatResetCB);
1415643Sgblack@eecs.umich.edu}
1427913SBrad.Beckmann@amd.com
1435643Sgblack@eecs.umich.edu//
1445643Sgblack@eecs.umich.edu// static function: call init() on all SimObjects.
1455643Sgblack@eecs.umich.edu//
1465643Sgblack@eecs.umich.eduvoid
1475643Sgblack@eecs.umich.eduSimObject::initAll()
1485643Sgblack@eecs.umich.edu{
1495643Sgblack@eecs.umich.edu    SimObjectList::iterator i = simObjectList.begin();
1505643Sgblack@eecs.umich.edu    SimObjectList::iterator end = simObjectList.end();
1515643Sgblack@eecs.umich.edu
1525643Sgblack@eecs.umich.edu    for (; i != end; ++i) {
1535643Sgblack@eecs.umich.edu        SimObject *obj = *i;
1545643Sgblack@eecs.umich.edu        obj->init();
1555643Sgblack@eecs.umich.edu    }
1565643Sgblack@eecs.umich.edu}
1575643Sgblack@eecs.umich.edu
1585643Sgblack@eecs.umich.edu//
1595643Sgblack@eecs.umich.edu// static function: call resetStats() on all SimObjects.
1605643Sgblack@eecs.umich.edu//
1615643Sgblack@eecs.umich.eduvoid
1625643Sgblack@eecs.umich.eduSimObject::resetAllStats()
1635643Sgblack@eecs.umich.edu{
1645643Sgblack@eecs.umich.edu    SimObjectList::iterator i = simObjectList.begin();
1655643Sgblack@eecs.umich.edu    SimObjectList::iterator end = simObjectList.end();
1665643Sgblack@eecs.umich.edu
1675643Sgblack@eecs.umich.edu    for (; i != end; ++i) {
1685643Sgblack@eecs.umich.edu        SimObject *obj = *i;
1695643Sgblack@eecs.umich.edu        obj->resetStats();
1705643Sgblack@eecs.umich.edu    }
1715643Sgblack@eecs.umich.edu}
1725643Sgblack@eecs.umich.edu
1735643Sgblack@eecs.umich.edu//
1745643Sgblack@eecs.umich.edu// static function: serialize all SimObjects.
1755643Sgblack@eecs.umich.edu//
1765643Sgblack@eecs.umich.eduvoid
1775643Sgblack@eecs.umich.eduSimObject::serializeAll(ostream &os)
1785643Sgblack@eecs.umich.edu{
1795643Sgblack@eecs.umich.edu    SimObjectList::reverse_iterator ri = simObjectList.rbegin();
1805643Sgblack@eecs.umich.edu    SimObjectList::reverse_iterator rend = simObjectList.rend();
1815643Sgblack@eecs.umich.edu
1825643Sgblack@eecs.umich.edu    for (; ri != rend; ++ri) {
1835643Sgblack@eecs.umich.edu        SimObject *obj = *ri;
1845643Sgblack@eecs.umich.edu        obj->nameOut(os);
1855643Sgblack@eecs.umich.edu        obj->serialize(os);
1865643Sgblack@eecs.umich.edu   }
1875643Sgblack@eecs.umich.edu}
1885643Sgblack@eecs.umich.edu
1895643Sgblack@eecs.umich.eduvoid
1905643Sgblack@eecs.umich.eduSimObject::unserializeAll(Checkpoint *cp)
1915643Sgblack@eecs.umich.edu{
1925643Sgblack@eecs.umich.edu    SimObjectList::reverse_iterator ri = simObjectList.rbegin();
1935643Sgblack@eecs.umich.edu    SimObjectList::reverse_iterator rend = simObjectList.rend();
1946712Snate@binkert.org
1955651Sgblack@eecs.umich.edu    for (; ri != rend; ++ri) {
1965657Sgblack@eecs.umich.edu        SimObject *obj = *ri;
1975657Sgblack@eecs.umich.edu        DPRINTFR(Config, "Unserializing '%s'\n",
1985657Sgblack@eecs.umich.edu                 obj->name());
1995657Sgblack@eecs.umich.edu        if(cp->sectionExists(obj->name()))
2005657Sgblack@eecs.umich.edu            obj->unserialize(cp, obj->name());
2015657Sgblack@eecs.umich.edu        else
2025651Sgblack@eecs.umich.edu            warn("Not unserializing '%s': no section found in checkpoint.\n",
2035651Sgblack@eecs.umich.edu                 obj->name());
2045654Sgblack@eecs.umich.edu   }
2055654Sgblack@eecs.umich.edu}
2066138Sgblack@eecs.umich.edu
2076138Sgblack@eecs.umich.edu#ifdef DEBUG
2086138Sgblack@eecs.umich.edu//
2096138Sgblack@eecs.umich.edu// static function: flag which objects should have the debugger break
2106138Sgblack@eecs.umich.edu//
2116138Sgblack@eecs.umich.eduvoid
2126138Sgblack@eecs.umich.eduSimObject::debugObjectBreak(const string &objs)
2136138Sgblack@eecs.umich.edu{
2146138Sgblack@eecs.umich.edu    SimObjectList::const_iterator i = simObjectList.begin();
2156138Sgblack@eecs.umich.edu    SimObjectList::const_iterator end = simObjectList.end();
2166138Sgblack@eecs.umich.edu
2176138Sgblack@eecs.umich.edu    ObjectMatch match(objs);
2186138Sgblack@eecs.umich.edu    for (; i != end; ++i) {
2196138Sgblack@eecs.umich.edu        SimObject *obj = *i;
2206138Sgblack@eecs.umich.edu        obj->doDebugBreak = match.match(obj->name());
2216138Sgblack@eecs.umich.edu   }
2226138Sgblack@eecs.umich.edu}
2238746Sgblack@eecs.umich.edu
22411150Smitch.hayenga@arm.comvoid
2256138Sgblack@eecs.umich.edudebugObjectBreak(const char *objs)
2266138Sgblack@eecs.umich.edu{
2278746Sgblack@eecs.umich.edu    SimObject::debugObjectBreak(string(objs));
2286138Sgblack@eecs.umich.edu}
2296138Sgblack@eecs.umich.edu#endif
2306139Sgblack@eecs.umich.edu
2316139Sgblack@eecs.umich.eduvoid
2326139Sgblack@eecs.umich.eduSimObject::recordEvent(const std::string &stat)
2336139Sgblack@eecs.umich.edu{
2346139Sgblack@eecs.umich.edu    Stats::recordEvent(stat);
2356139Sgblack@eecs.umich.edu}
2366139Sgblack@eecs.umich.edu
2376139Sgblack@eecs.umich.eduunsigned int
2386139Sgblack@eecs.umich.eduSimObject::drain(Event *drain_event)
2396139Sgblack@eecs.umich.edu{
2406139Sgblack@eecs.umich.edu    state = Drained;
2416139Sgblack@eecs.umich.edu    return 0;
2426139Sgblack@eecs.umich.edu}
2436139Sgblack@eecs.umich.edu
2446139Sgblack@eecs.umich.eduvoid
2456139Sgblack@eecs.umich.eduSimObject::resume()
2466138Sgblack@eecs.umich.edu{
2476138Sgblack@eecs.umich.edu    state = Running;
2489524SAndreas.Sandberg@ARM.com}
2495643Sgblack@eecs.umich.edu
2505643Sgblack@eecs.umich.eduvoid
2515643Sgblack@eecs.umich.eduSimObject::setMemoryMode(State new_mode)
2525827Sgblack@eecs.umich.edu{
2535827Sgblack@eecs.umich.edu    panic("setMemoryMode() should only be called on systems");
2545827Sgblack@eecs.umich.edu}
2555827Sgblack@eecs.umich.edu
2565827Sgblack@eecs.umich.eduvoid
2575827Sgblack@eecs.umich.eduSimObject::switchOut()
2585827Sgblack@eecs.umich.edu{
2595827Sgblack@eecs.umich.edu    panic("Unimplemented!");
2605827Sgblack@eecs.umich.edu}
2615827Sgblack@eecs.umich.edu
2625827Sgblack@eecs.umich.eduvoid
2635827Sgblack@eecs.umich.eduSimObject::takeOverFrom(BaseCPU *cpu)
2645827Sgblack@eecs.umich.edu{
2655827Sgblack@eecs.umich.edu    panic("Unimplemented!");
2665827Sgblack@eecs.umich.edu}
2675827Sgblack@eecs.umich.edu
2686137Sgblack@eecs.umich.edu
26910905Sandreas.sandberg@arm.comSimObject *
2707903Shestness@cs.utexas.eduSimObject::find(const char *name)
2717903Shestness@cs.utexas.edu{
2727903Shestness@cs.utexas.edu    SimObjectList::const_iterator i = simObjectList.begin();
2737903Shestness@cs.utexas.edu    SimObjectList::const_iterator end = simObjectList.end();
2747903Shestness@cs.utexas.edu
2757903Shestness@cs.utexas.edu    for (; i != end; ++i) {
2767903Shestness@cs.utexas.edu        SimObject *obj = *i;
2777903Shestness@cs.utexas.edu        if (obj->name() == name)
2787903Shestness@cs.utexas.edu            return obj;
2797903Shestness@cs.utexas.edu    }
2807903Shestness@cs.utexas.edu
2817903Shestness@cs.utexas.edu    return NULL;
28210905Sandreas.sandberg@arm.com}
2837903Shestness@cs.utexas.edu