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