kernel.cc revision 13191
12789Sktlim@umich.edu/* 213954Sgiacomo.gabrielli@arm.com * Copyright 2018 Google, Inc. 38733Sgeoffrey.blake@arm.com * 48733Sgeoffrey.blake@arm.com * Redistribution and use in source and binary forms, with or without 58733Sgeoffrey.blake@arm.com * modification, are permitted provided that the following conditions are 68733Sgeoffrey.blake@arm.com * met: redistributions of source code must retain the above copyright 78733Sgeoffrey.blake@arm.com * notice, this list of conditions and the following disclaimer; 88733Sgeoffrey.blake@arm.com * redistributions in binary form must reproduce the above copyright 98733Sgeoffrey.blake@arm.com * notice, this list of conditions and the following disclaimer in the 108733Sgeoffrey.blake@arm.com * documentation and/or other materials provided with the distribution; 118733Sgeoffrey.blake@arm.com * neither the name of the copyright holders nor the names of its 128733Sgeoffrey.blake@arm.com * contributors may be used to endorse or promote products derived from 138733Sgeoffrey.blake@arm.com * this software without specific prior written permission. 142789Sktlim@umich.edu * 152789Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162789Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172789Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182789Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192789Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202789Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212789Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222789Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232789Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242789Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252789Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262789Sktlim@umich.edu * 272789Sktlim@umich.edu * Authors: Gabe Black 282789Sktlim@umich.edu */ 292789Sktlim@umich.edu 302789Sktlim@umich.edu#include "systemc/core/kernel.hh" 312789Sktlim@umich.edu 322789Sktlim@umich.edu#include "base/logging.hh" 332789Sktlim@umich.edu#include "systemc/core/channel.hh" 342789Sktlim@umich.edu#include "systemc/core/module.hh" 352789Sktlim@umich.edu#include "systemc/core/scheduler.hh" 362789Sktlim@umich.edu 372789Sktlim@umich.edunamespace sc_gem5 382789Sktlim@umich.edu{ 392789Sktlim@umich.edu 402789Sktlim@umich.edunamespace 418733Sgeoffrey.blake@arm.com{ 422789Sktlim@umich.edu 432789Sktlim@umich.edubool scMainDone = false; 4411793Sbrandon.potter@amd.combool stopAfterCallbacks = false; 4511793Sbrandon.potter@amd.combool startComplete = false; 462789Sktlim@umich.edubool endComplete = false; 472789Sktlim@umich.edu 482789Sktlim@umich.edusc_core::sc_status _status = sc_core::SC_ELABORATION; 4910687SAndreas.Sandberg@ARM.com 508793Sgblack@eecs.umich.edu} // anonymous namespace 512789Sktlim@umich.edu 522789Sktlim@umich.edubool Kernel::startOfSimulationComplete() { return startComplete; } 533348Sbinkertn@umich.edubool Kernel::endOfSimulationComplete() { return endComplete; } 542789Sktlim@umich.edu 5513954Sgiacomo.gabrielli@arm.combool Kernel::scMainFinished() { return scMainDone; } 568733Sgeoffrey.blake@arm.comvoid Kernel::scMainFinished(bool finished) { scMainDone = finished; } 578887Sgeoffrey.blake@arm.com 582789Sktlim@umich.edusc_core::sc_status Kernel::status() { return _status; } 592789Sktlim@umich.eduvoid Kernel::status(sc_core::sc_status s) { _status = s; } 608733Sgeoffrey.blake@arm.com 612789Sktlim@umich.eduKernel::Kernel(Params *params) : 622789Sktlim@umich.edu SimObject(params), t0Event(this, false, EventBase::Default_Pri - 1) 632789Sktlim@umich.edu{ 642789Sktlim@umich.edu // Install ourselves as the scheduler's event manager. 6512680Sgiacomo.travaglini@arm.com ::sc_gem5::scheduler.setEventQueue(eventQueue()); 662789Sktlim@umich.edu} 672789Sktlim@umich.edu 682789Sktlim@umich.eduvoid 699176Sandreas.hansson@arm.comKernel::init() 7013453Srekai.gonzalezalberquilla@arm.com{ 7113453Srekai.gonzalezalberquilla@arm.com if (scMainDone) 7213453Srekai.gonzalezalberquilla@arm.com return; 732789Sktlim@umich.edu 748733Sgeoffrey.blake@arm.com if (stopAfterCallbacks) 758733Sgeoffrey.blake@arm.com fatal("Simulation called sc_stop during elaboration.\n"); 762789Sktlim@umich.edu 772789Sktlim@umich.edu status(::sc_core::SC_BEFORE_END_OF_ELABORATION); 782789Sktlim@umich.edu for (auto m: sc_gem5::allModules) 792789Sktlim@umich.edu m->beforeEndOfElaboration(); 802789Sktlim@umich.edu for (auto c: sc_gem5::allChannels) 812789Sktlim@umich.edu c->sc_chan()->before_end_of_elaboration(); 822789Sktlim@umich.edu} 8310034SGeoffrey.Blake@arm.com 842789Sktlim@umich.eduvoid 852789Sktlim@umich.eduKernel::regStats() 862789Sktlim@umich.edu{ 872789Sktlim@umich.edu if (scMainDone || stopAfterCallbacks) 882789Sktlim@umich.edu return; 898733Sgeoffrey.blake@arm.com 902789Sktlim@umich.edu try { 918733Sgeoffrey.blake@arm.com for (auto m: sc_gem5::allModules) 922789Sktlim@umich.edu for (auto p: m->ports) 932789Sktlim@umich.edu p->_gem5Finalize(); 942789Sktlim@umich.edu 952789Sktlim@umich.edu status(::sc_core::SC_END_OF_ELABORATION); 962789Sktlim@umich.edu for (auto m: sc_gem5::allModules) 972789Sktlim@umich.edu m->endOfElaboration(); 982789Sktlim@umich.edu for (auto c: sc_gem5::allChannels) 992789Sktlim@umich.edu c->sc_chan()->end_of_elaboration(); 1002789Sktlim@umich.edu } catch (...) { 1019384SAndreas.Sandberg@arm.com ::sc_gem5::scheduler.throwToScMain(); 1029384SAndreas.Sandberg@arm.com } 1032789Sktlim@umich.edu 1042789Sktlim@umich.edu ::sc_gem5::scheduler.elaborationDone(true); 1058887Sgeoffrey.blake@arm.com} 1069384SAndreas.Sandberg@arm.com 1079384SAndreas.Sandberg@arm.comvoid 1088887Sgeoffrey.blake@arm.comKernel::startup() 1098887Sgeoffrey.blake@arm.com{ 1108887Sgeoffrey.blake@arm.com if (scMainDone) 1119384SAndreas.Sandberg@arm.com return; 1128887Sgeoffrey.blake@arm.com 1132789Sktlim@umich.edu schedule(t0Event, curTick()); 1142789Sktlim@umich.edu 1152789Sktlim@umich.edu if (stopAfterCallbacks) 1162789Sktlim@umich.edu return; 1178887Sgeoffrey.blake@arm.com 1188887Sgeoffrey.blake@arm.com try { 1192789Sktlim@umich.edu status(::sc_core::SC_START_OF_SIMULATION); 1202789Sktlim@umich.edu for (auto m: sc_gem5::allModules) 1212789Sktlim@umich.edu m->startOfSimulation(); 1229608Sandreas.hansson@arm.com for (auto c: sc_gem5::allChannels) 1232789Sktlim@umich.edu c->sc_chan()->start_of_simulation(); 1242789Sktlim@umich.edu } catch (...) { 1252789Sktlim@umich.edu ::sc_gem5::scheduler.throwToScMain(); 1262789Sktlim@umich.edu } 1272789Sktlim@umich.edu 1289608Sandreas.hansson@arm.com startComplete = true; 1292789Sktlim@umich.edu 1302789Sktlim@umich.edu if (stopAfterCallbacks) 1312789Sktlim@umich.edu stopWork(); 1322789Sktlim@umich.edu 1332789Sktlim@umich.edu kernel->status(::sc_core::SC_RUNNING); 13410905Sandreas.sandberg@arm.com} 1352789Sktlim@umich.edu 1362789Sktlim@umich.eduvoid 1372789Sktlim@umich.eduKernel::stop() 1382789Sktlim@umich.edu{ 13910905Sandreas.sandberg@arm.com if (status() < ::sc_core::SC_RUNNING) 1402789Sktlim@umich.edu stopAfterCallbacks = true; 1412789Sktlim@umich.edu else 1422789Sktlim@umich.edu stopWork(); 14313954Sgiacomo.gabrielli@arm.com} 14413954Sgiacomo.gabrielli@arm.com 14513954Sgiacomo.gabrielli@arm.comvoid 14613954Sgiacomo.gabrielli@arm.comKernel::stopWork() 14713954Sgiacomo.gabrielli@arm.com{ 14813954Sgiacomo.gabrielli@arm.com status(::sc_core::SC_END_OF_SIMULATION); 14913954Sgiacomo.gabrielli@arm.com try { 15013954Sgiacomo.gabrielli@arm.com for (auto m: sc_gem5::allModules) 15113954Sgiacomo.gabrielli@arm.com m->endOfSimulation(); 15213954Sgiacomo.gabrielli@arm.com for (auto c: sc_gem5::allChannels) 15313954Sgiacomo.gabrielli@arm.com c->sc_chan()->end_of_simulation(); 15413954Sgiacomo.gabrielli@arm.com } catch (...) { 15513954Sgiacomo.gabrielli@arm.com ::sc_gem5::scheduler.throwToScMain(); 15613954Sgiacomo.gabrielli@arm.com } 15713954Sgiacomo.gabrielli@arm.com 15813954Sgiacomo.gabrielli@arm.com endComplete = true; 15913954Sgiacomo.gabrielli@arm.com 16013954Sgiacomo.gabrielli@arm.com status(::sc_core::SC_STOPPED); 16113954Sgiacomo.gabrielli@arm.com} 16213954Sgiacomo.gabrielli@arm.com 16313954Sgiacomo.gabrielli@arm.comvoid 16413954Sgiacomo.gabrielli@arm.comKernel::t0Handler() 16513954Sgiacomo.gabrielli@arm.com{ 16613954Sgiacomo.gabrielli@arm.com if (stopAfterCallbacks) { 16713954Sgiacomo.gabrielli@arm.com scheduler.clear(); 16813954Sgiacomo.gabrielli@arm.com ::sc_gem5::scheduler.initPhase(); 16913954Sgiacomo.gabrielli@arm.com scheduler.scheduleStop(false); 17013954Sgiacomo.gabrielli@arm.com } else { 17113954Sgiacomo.gabrielli@arm.com ::sc_gem5::scheduler.initPhase(); 17213954Sgiacomo.gabrielli@arm.com status(::sc_core::SC_RUNNING); 17313954Sgiacomo.gabrielli@arm.com } 17413954Sgiacomo.gabrielli@arm.com} 17513954Sgiacomo.gabrielli@arm.com 1762789Sktlim@umich.eduKernel *kernel; 17711608Snikos.nikoleris@arm.com 17813954Sgiacomo.gabrielli@arm.com} // namespace sc_gem5 17913954Sgiacomo.gabrielli@arm.com 1802789Sktlim@umich.edusc_gem5::Kernel * 1818733Sgeoffrey.blake@arm.comSystemC_KernelParams::create() 1828733Sgeoffrey.blake@arm.com{ 1838733Sgeoffrey.blake@arm.com panic_if(sc_gem5::kernel, 1848733Sgeoffrey.blake@arm.com "Only one systemc kernel object may be defined.\n"); 1852789Sktlim@umich.edu sc_gem5::kernel = new sc_gem5::Kernel(this); 18613954Sgiacomo.gabrielli@arm.com return sc_gem5::kernel; 18713954Sgiacomo.gabrielli@arm.com} 18813954Sgiacomo.gabrielli@arm.com