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