root.cc revision 11077
14467Sstever@eecs.umich.edu/* 23354Srdreslin@umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 33354Srdreslin@umich.edu * Copyright (c) 2011 Advanced Micro Devices, Inc. 43354Srdreslin@umich.edu * All rights reserved. 53354Srdreslin@umich.edu * 63354Srdreslin@umich.edu * Redistribution and use in source and binary forms, with or without 73354Srdreslin@umich.edu * modification, are permitted provided that the following conditions are 83354Srdreslin@umich.edu * met: redistributions of source code must retain the above copyright 93354Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer; 103354Srdreslin@umich.edu * redistributions in binary form must reproduce the above copyright 113354Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer in the 123354Srdreslin@umich.edu * documentation and/or other materials provided with the distribution; 133354Srdreslin@umich.edu * neither the name of the copyright holders nor the names of its 143354Srdreslin@umich.edu * contributors may be used to endorse or promote products derived from 153354Srdreslin@umich.edu * this software without specific prior written permission. 163354Srdreslin@umich.edu * 173354Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 183354Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 193354Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 203354Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 213354Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 223354Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 233354Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 243354Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 253354Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 263354Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 273354Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 283354Srdreslin@umich.edu * 296654Snate@binkert.org * Authors: Nathan Binkert 306654Snate@binkert.org * Steve Reinhardt 316654Snate@binkert.org * Gabe Black 323354Srdreslin@umich.edu */ 333354Srdreslin@umich.edu 343354Srdreslin@umich.edu#include "base/misc.hh" 353354Srdreslin@umich.edu#include "base/trace.hh" 363354Srdreslin@umich.edu#include "config/the_isa.hh" 374626Sstever@eecs.umich.edu#include "debug/TimeSync.hh" 384626Sstever@eecs.umich.edu#include "sim/full_system.hh" 394626Sstever@eecs.umich.edu#include "sim/root.hh" 404626Sstever@eecs.umich.edu 414893Sstever@eecs.umich.eduRoot *Root::_root = NULL; 424892Sstever@eecs.umich.edu 434626Sstever@eecs.umich.edu/* 444626Sstever@eecs.umich.edu * This function is called periodically by an event in M5 and ensures that 454626Sstever@eecs.umich.edu * at least as much real time has passed between invocations as simulated time. 464626Sstever@eecs.umich.edu * If not, the function either sleeps, or if the difference is small enough 474892Sstever@eecs.umich.edu * spin waits. 484892Sstever@eecs.umich.edu */ 494892Sstever@eecs.umich.eduvoid 504892Sstever@eecs.umich.eduRoot::timeSync() 514892Sstever@eecs.umich.edu{ 524892Sstever@eecs.umich.edu Time cur_time, diff, period = timeSyncPeriod(); 534892Sstever@eecs.umich.edu 544892Sstever@eecs.umich.edu do { 554892Sstever@eecs.umich.edu cur_time.setTimer(); 564892Sstever@eecs.umich.edu diff = cur_time - lastTime; 574892Sstever@eecs.umich.edu Time remainder = period - diff; 584892Sstever@eecs.umich.edu if (diff < period && remainder > _spinThreshold) { 594892Sstever@eecs.umich.edu DPRINTF(TimeSync, "Sleeping to sync with real time.\n"); 604892Sstever@eecs.umich.edu // Sleep until the end of the period, or until a signal. 614892Sstever@eecs.umich.edu sleep(remainder); 624892Sstever@eecs.umich.edu // Refresh the current time. 634892Sstever@eecs.umich.edu cur_time.setTimer(); 644892Sstever@eecs.umich.edu } 654892Sstever@eecs.umich.edu } while (diff < period); 664892Sstever@eecs.umich.edu lastTime = cur_time; 674892Sstever@eecs.umich.edu schedule(&syncEvent, curTick() + _periodTick); 684892Sstever@eecs.umich.edu} 694890Sstever@eecs.umich.edu 704891Sstever@eecs.umich.eduvoid 714891Sstever@eecs.umich.eduRoot::timeSyncEnable(bool en) 724890Sstever@eecs.umich.edu{ 734626Sstever@eecs.umich.edu if (en == _enabled) 744626Sstever@eecs.umich.edu return; 754626Sstever@eecs.umich.edu _enabled = en; 764626Sstever@eecs.umich.edu if (_enabled) { 774626Sstever@eecs.umich.edu // Get event going. 784626Sstever@eecs.umich.edu Tick periods = ((curTick() + _periodTick - 1) / _periodTick); 794626Sstever@eecs.umich.edu Tick nextPeriod = periods * _periodTick; 804626Sstever@eecs.umich.edu schedule(&syncEvent, nextPeriod); 813354Srdreslin@umich.edu } else { 824628Sstever@eecs.umich.edu // Stop event. 834628Sstever@eecs.umich.edu deschedule(&syncEvent); 844628Sstever@eecs.umich.edu } 854628Sstever@eecs.umich.edu} 864628Sstever@eecs.umich.edu 873354Srdreslin@umich.edu/// Configure the period for time sync events. 883354Srdreslin@umich.eduvoid 893354Srdreslin@umich.eduRoot::timeSyncPeriod(Time newPeriod) 903354Srdreslin@umich.edu{ 913354Srdreslin@umich.edu bool en = timeSyncEnabled(); 923354Srdreslin@umich.edu _period = newPeriod; 934626Sstever@eecs.umich.edu _periodTick = _period.getTick(); 944626Sstever@eecs.umich.edu timeSyncEnable(en); 954892Sstever@eecs.umich.edu} 964892Sstever@eecs.umich.edu 974892Sstever@eecs.umich.edu/// Set the threshold for time remaining to spin wait. 984892Sstever@eecs.umich.eduvoid 994892Sstever@eecs.umich.eduRoot::timeSyncSpinThreshold(Time newThreshold) 1004892Sstever@eecs.umich.edu{ 1013354Srdreslin@umich.edu bool en = timeSyncEnabled(); 1024890Sstever@eecs.umich.edu _spinThreshold = newThreshold; 1034626Sstever@eecs.umich.edu timeSyncEnable(en); 1044626Sstever@eecs.umich.edu} 1054626Sstever@eecs.umich.edu 1063354Srdreslin@umich.eduRoot::Root(RootParams *p) : SimObject(p), _enabled(false), 1074890Sstever@eecs.umich.edu _periodTick(p->time_sync_period), syncEvent(this) 1084890Sstever@eecs.umich.edu{ 1094890Sstever@eecs.umich.edu _period.setTick(p->time_sync_period); 1104890Sstever@eecs.umich.edu _spinThreshold.setTick(p->time_sync_spin_threshold); 1114890Sstever@eecs.umich.edu 1124890Sstever@eecs.umich.edu assert(_root == NULL); 1139267Sandreas.hansson@arm.com _root = this; 1149267Sandreas.hansson@arm.com lastTime.setTimer(); 1154890Sstever@eecs.umich.edu 1164890Sstever@eecs.umich.edu simQuantum = p->sim_quantum; 1174890Sstever@eecs.umich.edu} 1184890Sstever@eecs.umich.edu 1197656Ssteve.reinhardt@amd.comvoid 1204890Sstever@eecs.umich.eduRoot::initState() 1214893Sstever@eecs.umich.edu{ 1224893Sstever@eecs.umich.edu timeSyncEnable(params()->time_sync_enable); 1234893Sstever@eecs.umich.edu} 1244890Sstever@eecs.umich.edu 1254890Sstever@eecs.umich.eduvoid 1264890Sstever@eecs.umich.eduRoot::loadState(CheckpointIn &cp) 1274890Sstever@eecs.umich.edu{ 1284893Sstever@eecs.umich.edu SimObject::loadState(cp); 1294893Sstever@eecs.umich.edu timeSyncEnable(params()->time_sync_enable); 1304893Sstever@eecs.umich.edu} 1314893Sstever@eecs.umich.edu 1324893Sstever@eecs.umich.eduvoid 1337656Ssteve.reinhardt@amd.comRoot::serialize(CheckpointOut &cp) const 1344890Sstever@eecs.umich.edu{ 1354890Sstever@eecs.umich.edu SERIALIZE_SCALAR(FullSystem); 1364890Sstever@eecs.umich.edu std::string isa = THE_ISA_STR; 1377656Ssteve.reinhardt@amd.com SERIALIZE_SCALAR(isa); 1384890Sstever@eecs.umich.edu} 1397656Ssteve.reinhardt@amd.com 1407656Ssteve.reinhardt@amd.comvoid 1414890Sstever@eecs.umich.eduRoot::unserialize(CheckpointIn &cp) 1424467Sstever@eecs.umich.edu{} 1433354Srdreslin@umich.edu 1448931Sandreas.hansson@arm.com 1459120Sandreas.hansson@arm.combool FullSystem; 1468931Sandreas.hansson@arm.comunsigned int FullSystemInt; 1473354Srdreslin@umich.edu 1484890Sstever@eecs.umich.eduRoot * 1494890Sstever@eecs.umich.eduRootParams::create() 1504890Sstever@eecs.umich.edu{ 1514895Sstever@eecs.umich.edu static bool created = false; 1528847Sandreas.hansson@arm.com if (created) 1539036Sandreas.hansson@arm.com panic("only one root object allowed!"); 1548847Sandreas.hansson@arm.com 1558847Sandreas.hansson@arm.com created = true; 1568847Sandreas.hansson@arm.com 1578847Sandreas.hansson@arm.com FullSystem = full_system; 1588847Sandreas.hansson@arm.com FullSystemInt = full_system ? 1 : 0; 1598847Sandreas.hansson@arm.com 1604890Sstever@eecs.umich.edu return new Root(this); 1614890Sstever@eecs.umich.edu} 1624890Sstever@eecs.umich.edu