1/* 2 * Copyright (c) 2002-2005 The Regents of The University of Michigan 3 * Copyright (c) 2011 Advanced Micro Devices, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Nathan Binkert 30 * Steve Reinhardt 31 * Gabe Black 32 */ 33
|
35#include "base/trace.hh" 36#include "config/the_isa.hh" 37#include "debug/TimeSync.hh" 38#include "sim/eventq_impl.hh" 39#include "sim/full_system.hh" 40#include "sim/root.hh" 41 42Root *Root::_root = NULL; 43 44/* 45 * This function is called periodically by an event in M5 and ensures that 46 * at least as much real time has passed between invocations as simulated time. 47 * If not, the function either sleeps, or if the difference is small enough 48 * spin waits. 49 */ 50void 51Root::timeSync() 52{ 53 Time cur_time, diff, period = timeSyncPeriod(); 54 55 do { 56 cur_time.setTimer(); 57 diff = cur_time - lastTime; 58 Time remainder = period - diff; 59 if (diff < period && remainder > _spinThreshold) { 60 DPRINTF(TimeSync, "Sleeping to sync with real time.\n"); 61 // Sleep until the end of the period, or until a signal. 62 sleep(remainder); 63 // Refresh the current time. 64 cur_time.setTimer(); 65 } 66 } while (diff < period); 67 lastTime = cur_time; 68 schedule(&syncEvent, curTick() + _periodTick); 69} 70 71void 72Root::timeSyncEnable(bool en) 73{ 74 if (en == _enabled) 75 return; 76 _enabled = en; 77 if (_enabled) { 78 // Get event going. 79 Tick periods = ((curTick() + _periodTick - 1) / _periodTick); 80 Tick nextPeriod = periods * _periodTick; 81 schedule(&syncEvent, nextPeriod); 82 } else { 83 // Stop event. 84 deschedule(&syncEvent); 85 } 86} 87 88/// Configure the period for time sync events. 89void 90Root::timeSyncPeriod(Time newPeriod) 91{ 92 bool en = timeSyncEnabled(); 93 _period = newPeriod; 94 _periodTick = _period.getTick(); 95 timeSyncEnable(en); 96} 97 98/// Set the threshold for time remaining to spin wait. 99void 100Root::timeSyncSpinThreshold(Time newThreshold) 101{ 102 bool en = timeSyncEnabled(); 103 _spinThreshold = newThreshold; 104 timeSyncEnable(en); 105} 106 107Root::Root(RootParams *p) 108 : SimObject(p), _enabled(false), _periodTick(p->time_sync_period), 109 syncEvent([this]{ timeSync(); }, name()) 110{ 111 _period.setTick(p->time_sync_period); 112 _spinThreshold.setTick(p->time_sync_spin_threshold); 113 114 assert(_root == NULL); 115 _root = this; 116 lastTime.setTimer(); 117 118 simQuantum = p->sim_quantum; 119} 120 121void 122Root::startup() 123{ 124 timeSyncEnable(params()->time_sync_enable); 125} 126 127void 128Root::serialize(CheckpointOut &cp) const 129{ 130 SERIALIZE_SCALAR(FullSystem); 131 std::string isa = THE_ISA_STR; 132 SERIALIZE_SCALAR(isa); 133} 134 135 136bool FullSystem; 137unsigned int FullSystemInt; 138 139Root * 140RootParams::create() 141{ 142 static bool created = false; 143 if (created) 144 panic("only one root object allowed!"); 145 146 created = true; 147 148 FullSystem = full_system; 149 FullSystemInt = full_system ? 1 : 0; 150 151 return new Root(this); 152}
|