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