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