kernel.cc revision 13185:286a48639227
111307Santhony.gutierrez@amd.com/* 211307Santhony.gutierrez@amd.com * Copyright 2018 Google, Inc. 311307Santhony.gutierrez@amd.com * 411307Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 511307Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 611307Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 711307Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 811307Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 911307Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1011307Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1111307Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1211307Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1311307Santhony.gutierrez@amd.com * this software without specific prior written permission. 1411307Santhony.gutierrez@amd.com * 1511307Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1611307Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1711307Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1811307Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1911307Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2011307Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2111307Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2211307Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2311307Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2411307Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2511307Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2611307Santhony.gutierrez@amd.com * 2711307Santhony.gutierrez@amd.com * Authors: Gabe Black 2811307Santhony.gutierrez@amd.com */ 2911307Santhony.gutierrez@amd.com 3011307Santhony.gutierrez@amd.com#include "systemc/core/kernel.hh" 3111307Santhony.gutierrez@amd.com 3211307Santhony.gutierrez@amd.com#include "base/logging.hh" 3311307Santhony.gutierrez@amd.com#include "systemc/core/channel.hh" 3411307Santhony.gutierrez@amd.com#include "systemc/core/module.hh" 3511307Santhony.gutierrez@amd.com#include "systemc/core/scheduler.hh" 3611307Santhony.gutierrez@amd.com 3711307Santhony.gutierrez@amd.comnamespace sc_gem5 3811307Santhony.gutierrez@amd.com{ 3911307Santhony.gutierrez@amd.com 4011307Santhony.gutierrez@amd.comnamespace 4111307Santhony.gutierrez@amd.com{ 4211307Santhony.gutierrez@amd.com 4311307Santhony.gutierrez@amd.combool scMainDone = false; 4411307Santhony.gutierrez@amd.combool stopAfterCallbacks = false; 4511307Santhony.gutierrez@amd.combool startComplete = false; 4611307Santhony.gutierrez@amd.combool endComplete = false; 4711307Santhony.gutierrez@amd.com 4811307Santhony.gutierrez@amd.comsc_core::sc_status _status = sc_core::SC_ELABORATION; 4911307Santhony.gutierrez@amd.com 5011307Santhony.gutierrez@amd.com} // anonymous namespace 5111307Santhony.gutierrez@amd.com 5211307Santhony.gutierrez@amd.combool Kernel::startOfSimulationComplete() { return startComplete; } 5311307Santhony.gutierrez@amd.combool Kernel::endOfSimulationComplete() { return endComplete; } 5411307Santhony.gutierrez@amd.com 5511307Santhony.gutierrez@amd.combool Kernel::scMainFinished() { return scMainDone; } 5611307Santhony.gutierrez@amd.comvoid Kernel::scMainFinished(bool finished) { scMainDone = finished; } 5711307Santhony.gutierrez@amd.com 5811307Santhony.gutierrez@amd.comsc_core::sc_status Kernel::status() { return _status; } 5911307Santhony.gutierrez@amd.comvoid Kernel::status(sc_core::sc_status s) { _status = s; } 6011307Santhony.gutierrez@amd.com 6111307Santhony.gutierrez@amd.comKernel::Kernel(Params *params) : 6211307Santhony.gutierrez@amd.com SimObject(params), t0Event(this, false, EventBase::Default_Pri - 1) 6311307Santhony.gutierrez@amd.com{ 6411307Santhony.gutierrez@amd.com // Install ourselves as the scheduler's event manager. 6511307Santhony.gutierrez@amd.com ::sc_gem5::scheduler.setEventQueue(eventQueue()); 6611307Santhony.gutierrez@amd.com} 6711307Santhony.gutierrez@amd.com 6811307Santhony.gutierrez@amd.comvoid 6911307Santhony.gutierrez@amd.comKernel::init() 7011307Santhony.gutierrez@amd.com{ 7111307Santhony.gutierrez@amd.com if (scMainDone) 7211307Santhony.gutierrez@amd.com return; 7311307Santhony.gutierrez@amd.com 7411325Ssteve.reinhardt@amd.com if (stopAfterCallbacks) 7511307Santhony.gutierrez@amd.com fatal("Simulation called sc_stop during elaboration.\n"); 7611307Santhony.gutierrez@amd.com 7711307Santhony.gutierrez@amd.com status(::sc_core::SC_BEFORE_END_OF_ELABORATION); 7811307Santhony.gutierrez@amd.com for (auto m: sc_gem5::allModules) { 7911307Santhony.gutierrez@amd.com callbackModule(m); 8011307Santhony.gutierrez@amd.com m->sc_mod()->before_end_of_elaboration(); 8111307Santhony.gutierrez@amd.com for (auto p: m->ports) 8211307Santhony.gutierrez@amd.com p->before_end_of_elaboration(); 8311307Santhony.gutierrez@amd.com for (auto e: m->exports) 8411307Santhony.gutierrez@amd.com e->before_end_of_elaboration(); 8511307Santhony.gutierrez@amd.com } 8611307Santhony.gutierrez@amd.com callbackModule(nullptr); 8711307Santhony.gutierrez@amd.com for (auto c: sc_gem5::allChannels) 8811307Santhony.gutierrez@amd.com c->sc_chan()->before_end_of_elaboration(); 8911307Santhony.gutierrez@amd.com} 9011307Santhony.gutierrez@amd.com 9111307Santhony.gutierrez@amd.comvoid 9211307Santhony.gutierrez@amd.comKernel::regStats() 9311307Santhony.gutierrez@amd.com{ 9411307Santhony.gutierrez@amd.com if (scMainDone || stopAfterCallbacks) 9511307Santhony.gutierrez@amd.com return; 9611307Santhony.gutierrez@amd.com 9711307Santhony.gutierrez@amd.com for (auto m: sc_gem5::allModules) 9811307Santhony.gutierrez@amd.com for (auto p: m->ports) 9911307Santhony.gutierrez@amd.com p->_gem5Finalize(); 10011307Santhony.gutierrez@amd.com 10111307Santhony.gutierrez@amd.com status(::sc_core::SC_END_OF_ELABORATION); 10211307Santhony.gutierrez@amd.com for (auto m: sc_gem5::allModules) { 10311307Santhony.gutierrez@amd.com callbackModule(m); 10411307Santhony.gutierrez@amd.com m->sc_mod()->end_of_elaboration(); 10511307Santhony.gutierrez@amd.com for (auto p: m->ports) 10611307Santhony.gutierrez@amd.com p->end_of_elaboration(); 10711307Santhony.gutierrez@amd.com for (auto e: m->exports) 10811307Santhony.gutierrez@amd.com e->end_of_elaboration(); 10911307Santhony.gutierrez@amd.com } 11011307Santhony.gutierrez@amd.com callbackModule(nullptr); 11111307Santhony.gutierrez@amd.com for (auto c: sc_gem5::allChannels) 11211307Santhony.gutierrez@amd.com c->sc_chan()->end_of_elaboration(); 11311307Santhony.gutierrez@amd.com} 11411307Santhony.gutierrez@amd.com 11511307Santhony.gutierrez@amd.comvoid 11611307Santhony.gutierrez@amd.comKernel::startup() 11711307Santhony.gutierrez@amd.com{ 11811307Santhony.gutierrez@amd.com if (scMainDone) 11911307Santhony.gutierrez@amd.com return; 12011307Santhony.gutierrez@amd.com 12111307Santhony.gutierrez@amd.com schedule(t0Event, curTick()); 12211307Santhony.gutierrez@amd.com 12311307Santhony.gutierrez@amd.com if (stopAfterCallbacks) 12411307Santhony.gutierrez@amd.com return; 12511307Santhony.gutierrez@amd.com 12611307Santhony.gutierrez@amd.com status(::sc_core::SC_START_OF_SIMULATION); 12711307Santhony.gutierrez@amd.com for (auto m: sc_gem5::allModules) { 12811307Santhony.gutierrez@amd.com m->sc_mod()->start_of_simulation(); 12911307Santhony.gutierrez@amd.com for (auto p: m->ports) 13011307Santhony.gutierrez@amd.com p->start_of_simulation(); 13111307Santhony.gutierrez@amd.com for (auto e: m->exports) 13211307Santhony.gutierrez@amd.com e->start_of_simulation(); 13311307Santhony.gutierrez@amd.com } 13411307Santhony.gutierrez@amd.com for (auto c: sc_gem5::allChannels) 13511307Santhony.gutierrez@amd.com c->sc_chan()->start_of_simulation(); 13611307Santhony.gutierrez@amd.com 13711307Santhony.gutierrez@amd.com startComplete = true; 13811307Santhony.gutierrez@amd.com 13911307Santhony.gutierrez@amd.com if (stopAfterCallbacks) 14011307Santhony.gutierrez@amd.com stopWork(); 14111307Santhony.gutierrez@amd.com 14211307Santhony.gutierrez@amd.com kernel->status(::sc_core::SC_RUNNING); 14311307Santhony.gutierrez@amd.com} 14411307Santhony.gutierrez@amd.com 14511307Santhony.gutierrez@amd.comvoid 14611307Santhony.gutierrez@amd.comKernel::stop() 14711307Santhony.gutierrez@amd.com{ 14811307Santhony.gutierrez@amd.com if (status() < ::sc_core::SC_RUNNING) 14911307Santhony.gutierrez@amd.com stopAfterCallbacks = true; 15011307Santhony.gutierrez@amd.com else 15111307Santhony.gutierrez@amd.com stopWork(); 15211307Santhony.gutierrez@amd.com} 15311307Santhony.gutierrez@amd.com 15411307Santhony.gutierrez@amd.comvoid 15511307Santhony.gutierrez@amd.comKernel::stopWork() 15611307Santhony.gutierrez@amd.com{ 15711307Santhony.gutierrez@amd.com status(::sc_core::SC_END_OF_SIMULATION); 15811307Santhony.gutierrez@amd.com for (auto m: sc_gem5::allModules) { 15911307Santhony.gutierrez@amd.com m->sc_mod()->end_of_simulation(); 16011307Santhony.gutierrez@amd.com for (auto p: m->ports) 16111307Santhony.gutierrez@amd.com p->end_of_simulation(); 16211307Santhony.gutierrez@amd.com for (auto e: m->exports) 16311307Santhony.gutierrez@amd.com e->end_of_simulation(); 16411307Santhony.gutierrez@amd.com } 16511307Santhony.gutierrez@amd.com for (auto c: sc_gem5::allChannels) 16611307Santhony.gutierrez@amd.com c->sc_chan()->end_of_simulation(); 16711307Santhony.gutierrez@amd.com 16811307Santhony.gutierrez@amd.com endComplete = true; 16911307Santhony.gutierrez@amd.com 17011307Santhony.gutierrez@amd.com status(::sc_core::SC_STOPPED); 17111307Santhony.gutierrez@amd.com} 17211307Santhony.gutierrez@amd.com 17311307Santhony.gutierrez@amd.comvoid 17411307Santhony.gutierrez@amd.comKernel::t0Handler() 17511307Santhony.gutierrez@amd.com{ 17611307Santhony.gutierrez@amd.com if (stopAfterCallbacks) { 17711307Santhony.gutierrez@amd.com scheduler.clear(); 17811307Santhony.gutierrez@amd.com ::sc_gem5::scheduler.initPhase(); 17911307Santhony.gutierrez@amd.com scheduler.scheduleStop(false); 18011307Santhony.gutierrez@amd.com } else { 18111307Santhony.gutierrez@amd.com ::sc_gem5::scheduler.initPhase(); 18211307Santhony.gutierrez@amd.com status(::sc_core::SC_RUNNING); 18311307Santhony.gutierrez@amd.com } 18411307Santhony.gutierrez@amd.com} 18511307Santhony.gutierrez@amd.com 18611307Santhony.gutierrez@amd.comKernel *kernel; 18711307Santhony.gutierrez@amd.com 18811307Santhony.gutierrez@amd.com} // namespace sc_gem5 18911307Santhony.gutierrez@amd.com 19011307Santhony.gutierrez@amd.comsc_gem5::Kernel * 19111307Santhony.gutierrez@amd.comSystemC_KernelParams::create() 19211307Santhony.gutierrez@amd.com{ 19311307Santhony.gutierrez@amd.com panic_if(sc_gem5::kernel, 19411307Santhony.gutierrez@amd.com "Only one systemc kernel object may be defined.\n"); 19511307Santhony.gutierrez@amd.com sc_gem5::kernel = new sc_gem5::Kernel(this); 19611307Santhony.gutierrez@amd.com return sc_gem5::kernel; 19711307Santhony.gutierrez@amd.com} 19811307Santhony.gutierrez@amd.com