diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/commit.hh --- a/src/cpu/o3/commit.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/commit.hh Thu Nov 14 15:04:42 2013 -0600 @@ -50,6 +50,7 @@ #include "cpu/exetrace.hh" #include "cpu/inst_seq.hh" #include "cpu/timebuf.hh" +#include "sim/probe/probe.hh" struct DerivO3CPUParams; @@ -150,6 +151,10 @@ /** Commit policy used in SMT mode. */ CommitPolicy commitPolicy; + /** Probe Points. */ + ProbePointArg *ppCommit; + ProbePointArg *ppCommitStall; + public: /** Construct a DefaultCommit with the given parameters. */ DefaultCommit(O3CPU *_cpu, DerivO3CPUParams *params); @@ -160,6 +165,9 @@ /** Registers statistics. */ void regStats(); + /** Registers probes. */ + void regProbePoints(); + /** Sets the list of threads. */ void setThreads(std::vector &threads); diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/commit_impl.hh --- a/src/cpu/o3/commit_impl.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/commit_impl.hh Thu Nov 14 15:04:42 2013 -0600 @@ -163,6 +163,14 @@ template void +DefaultCommit::regProbePoints() +{ + ppCommit = new ProbePointArg(cpu->getProbeManager(), "Commit"); + ppCommitStall = new ProbePointArg(cpu->getProbeManager(), "CommitStall"); +} + +template +void DefaultCommit::regStats() { using namespace Stats; @@ -705,6 +713,8 @@ } else if (!rob->isEmpty(tid)) { DynInstPtr inst = rob->readHeadInst(tid); + ppCommitStall->notify(inst); + DPRINTF(Commit,"[tid:%i]: Can't commit, Instruction [sn:%lli] PC " "%s is head of ROB and not ready\n", tid, inst->seqNum, inst->pcState()); @@ -1017,6 +1027,7 @@ if (commit_success) { ++num_committed; + ppCommit->notify(head_inst); changedROBNumEntries[tid] = true; diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/cpu.hh --- a/src/cpu/o3/cpu.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/cpu.hh Thu Nov 14 15:04:42 2013 -0600 @@ -375,6 +375,12 @@ /** Registers statistics. */ void regStats(); + ProbePointArg *ppInstAccessComplete; + ProbePointArg > *ppDataAccessComplete; + + /** Register probe points. */ + void regProbePoints(); + void demapPage(Addr vaddr, uint64_t asn) { this->itb->demapPage(vaddr, asn); diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/cpu.cc --- a/src/cpu/o3/cpu.cc Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/cpu.cc Thu Nov 14 15:04:42 2013 -0600 @@ -468,6 +468,17 @@ template void +FullO3CPU::regProbePoints() +{ + ppInstAccessComplete = new ProbePointArg(getProbeManager(), "InstAccessComplete"); + ppDataAccessComplete = new ProbePointArg >(getProbeManager(), "DataAccessComplete"); + fetch.regProbePoints(); + iew.regProbePoints(); + commit.regProbePoints(); +} + +template +void FullO3CPU::regStats() { BaseO3CPU::regStats(); diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/fetch.hh --- a/src/cpu/o3/fetch.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/fetch.hh Thu Nov 14 15:04:42 2013 -0600 @@ -55,6 +55,7 @@ #include "mem/packet.hh" #include "mem/port.hh" #include "sim/eventq.hh" +#include "sim/probe/probe.hh" struct DerivO3CPUParams; @@ -194,6 +195,9 @@ /** List that has the threads organized by priority. */ std::list priorityList; + /** Probe points. */ + ProbePointArg *ppFetch; + public: /** DefaultFetch constructor. */ DefaultFetch(O3CPU *_cpu, DerivO3CPUParams *params); @@ -204,6 +208,9 @@ /** Registers statistics. */ void regStats(); + /** Registers probes. */ + void regProbePoints(); + /** Sets the main backwards communication time buffer pointer. */ void setTimeBuffer(TimeBuffer *time_buffer); diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/fetch_impl.hh --- a/src/cpu/o3/fetch_impl.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/fetch_impl.hh Thu Nov 14 15:04:42 2013 -0600 @@ -153,6 +153,13 @@ template void +DefaultFetch::regProbePoints() +{ + ppFetch = new ProbePointArg(cpu->getProbeManager(), "Fetch"); +} + +template +void DefaultFetch::regStats() { icacheStallCycles @@ -393,6 +400,7 @@ } pkt->req->setAccessLatency(); + cpu->ppInstAccessComplete->notify(pkt); // Reset the mem req to NULL. delete pkt->req; delete pkt; @@ -657,7 +665,6 @@ DPRINTF(Fetch, "[tid:%i]: Doing Icache access.\n", tid); DPRINTF(Activity, "[tid:%i]: Activity: Waiting on I-cache " "response.\n", tid); - lastIcacheStall[tid] = curTick(); fetchStatus[tid] = IcacheWaitResponse; } @@ -1302,6 +1309,7 @@ buildInst(tid, staticInst, curMacroop, thisPC, nextPC, true); + ppFetch->notify(instruction); numInst++; #if TRACING_ON diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/iew.hh --- a/src/cpu/o3/iew.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/iew.hh Thu Nov 14 15:04:42 2013 -0600 @@ -52,6 +52,7 @@ #include "cpu/o3/scoreboard.hh" #include "cpu/timebuf.hh" #include "debug/IEW.hh" +#include "sim/probe/probe.hh" struct DerivO3CPUParams; class FUPool; @@ -122,6 +123,10 @@ /** Writeback status. */ StageStatus wbStatus; + /** Probe points. */ + ProbePointArg *ppMispredict; + ProbePointArg *ppDispatch; + public: /** Constructs a DefaultIEW with the given parameters. */ DefaultIEW(O3CPU *_cpu, DerivO3CPUParams *params); @@ -132,6 +137,9 @@ /** Registers statistics. */ void regStats(); + /** Registers probes. */ + void regProbePoints(); + /** Initializes stage; sends back the number of free IQ and LSQ entries. */ void startupStage(); diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/iew_impl.hh --- a/src/cpu/o3/iew_impl.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/iew_impl.hh Thu Nov 14 15:04:42 2013 -0600 @@ -113,6 +113,14 @@ template void +DefaultIEW::regProbePoints() +{ + ppDispatch = new ProbePointArg(cpu->getProbeManager(), "Dispatch"); + ppMispredict = new ProbePointArg(cpu->getProbeManager(), "Mispredict"); +} + +template +void DefaultIEW::regStats() { using namespace Stats; @@ -1158,6 +1166,7 @@ #if TRACING_ON inst->dispatchTick = curTick() - inst->fetchTick; #endif + ppDispatch->notify(inst); } if (!insts_to_dispatch.empty()) { @@ -1357,6 +1366,8 @@ // If incorrect, then signal the ROB that it must be squashed. squashDueToBranch(inst, tid); + ppMispredict->notify(inst); + if (inst->readPredTaken()) { predictedTakenIncorrect++; } else { diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/lsq_unit_impl.hh --- a/src/cpu/o3/lsq_unit_impl.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/cpu/o3/lsq_unit_impl.hh Thu Nov 14 15:04:42 2013 -0600 @@ -131,6 +131,8 @@ } pkt->req->setAccessLatency(); + cpu->ppDataAccessComplete->notify(std::make_pair(inst, pkt)); + delete state; delete pkt->req; delete pkt; diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/probe/SConscript --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cpu/o3/probe/SConscript Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,45 @@ +# -*- mode:python -*- + +# Copyright (c) 2013 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Matt Horsnell + +Import('*') + +if 'O3CPU' in env['CPU_MODELS']: + SimObject('SimpleTrace.py') + Source('simple_trace.cc') + DebugFlag('SimpleTrace') diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/probe/SimpleTrace.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cpu/o3/probe/SimpleTrace.py Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,42 @@ +# Copyright (c) 2013 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Matt Horsnell + +from Probe import * + +class SimpleTrace(ProbeListenerObject): + type = 'SimpleTrace' + cxx_header = 'cpu/o3/probe/simple_trace.hh' diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/probe/simple_trace.hh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cpu/o3/probe/simple_trace.hh Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,73 @@ + /* + * Copyright (c) 2013 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Matt Horsnell + */ + +/** + * @file This file initializes a simple trace unit which listens to + * a probe point in the fetch and commit stage of the O3 pipeline + * and simply outputs those events as a dissassembled instruction stream + * to the trace output. + */ +#ifndef __CPU_O3_PROBE_SIMPLE_TRACE_HH__ +#define __CPU_O3_PROBE_SIMPLE_TRACE_HH__ + +#include "cpu/o3/dyn_inst.hh" +#include "cpu/o3/impl.hh" +#include "params/SimpleTrace.hh" +#include "sim/probe/probe.hh" + +class SimpleTrace : public ProbeListenerObject { + + public: + SimpleTrace(const SimpleTraceParams *params): + ProbeListenerObject(params) + { + } + + /** Register the probe listeners. */ + void regProbeListeners(); + + /** Returns the name of the trace. */ + const std::string name() const { return ProbeListenerObject::name() + ".trace"; } + + private: + void traceFetch(const O3CPUImpl::DynInstPtr &dynInst); + void traceCommit(const O3CPUImpl::DynInstPtr &dynInst); + +}; +#endif//__CPU_O3_PROBE_SIMPLE_TRACE_HH__ diff -r e45c2ada8442 -r 8319c028bbd8 src/cpu/o3/probe/simple_trace.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cpu/o3/probe/simple_trace.cc Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2013 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Matt Horsnell + */ + +#include "base/trace.hh" +#include "cpu/o3/probe/simple_trace.hh" +#include "debug/SimpleTrace.hh" + +void SimpleTrace::traceCommit(const O3CPUImpl::DynInstPtr &dynInst) +{ + DPRINTFR(SimpleTrace, "[%s]: Commit 0x%08x %s.\n", name(), + dynInst->instAddr(), + dynInst->staticInst->disassemble(dynInst->instAddr())); +} + +void SimpleTrace::traceFetch(const O3CPUImpl::DynInstPtr &dynInst) +{ + DPRINTFR(SimpleTrace, "[%s]: Fetch 0x%08x %s.\n", name(), + dynInst->instAddr(), + dynInst->staticInst->disassemble(dynInst->instAddr())); +} + +void SimpleTrace::regProbeListeners() +{ + typedef ProbeListenerArg DynInstListener; + listeners.push_back(new DynInstListener(this, "Commit", &SimpleTrace::traceCommit)); + listeners.push_back(new DynInstListener(this, "Fetch", &SimpleTrace::traceFetch)); +} + +SimpleTrace* +SimpleTraceParams::create() +{ + return new SimpleTrace(this); +} diff -r e45c2ada8442 -r 8319c028bbd8 src/python/m5/SimObject.py --- a/src/python/m5/SimObject.py Thu Nov 14 15:04:27 2013 -0600 +++ b/src/python/m5/SimObject.py Thu Nov 14 15:04:42 2013 -0600 @@ -613,6 +613,8 @@ void initState(); void regStats(); void resetStats(); + void regProbePoints(); + void regProbeListeners(); void startup(); ''') diff -r e45c2ada8442 -r 8319c028bbd8 src/python/m5/simulate.py --- a/src/python/m5/simulate.py Thu Nov 14 15:04:27 2013 -0600 +++ b/src/python/m5/simulate.py Thu Nov 14 15:04:42 2013 -0600 @@ -118,6 +118,12 @@ # Do a third pass to initialize statistics for obj in root.descendants(): obj.regStats() + # Do a fourth pass to initialize probe points + for obj in root.descendants(): obj.regProbePoints() + + # Do a fifth pass to connect probe listeners + for obj in root.descendants(): obj.regProbeListeners() + # We're done registering statistics. Enable the stats package now. stats.enable() diff -r e45c2ada8442 -r 8319c028bbd8 src/sim/probe/Probe.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sim/probe/Probe.py Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,47 @@ +# -*- mode:python -*- + +# Copyright (c) 2013 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Matt Horsnell + +from m5.SimObject import SimObject +from m5.params import * +from m5.proxy import * + +class ProbeListenerObject(SimObject): + type = 'ProbeListenerObject' + cxx_header = 'sim/probe/probe.hh' + manager = Param.SimObject(Parent.any, "ProbeManager") diff -r e45c2ada8442 -r 8319c028bbd8 src/sim/probe/SConscript --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sim/probe/SConscript Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,44 @@ +# -*- mode:python -*- + +# Copyright (c) 2013 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Matt Horsnell + +Import('*') + +SimObject('Probe.py') +Source('probe.cc') +DebugFlag('ProbeVerbose') \ No newline at end of file diff -r e45c2ada8442 -r 8319c028bbd8 src/sim/probe/probe.hh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sim/probe/probe.hh Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2013 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Matt Horsnell + */ + +/** + * @file This file describes the base components used for the probe system. + * There are currently 3 components: + * + * ProbePoint: an event probe point i.e. send a notify from the point + * at which an instruction was committed. + * + * ProbeListener: a listener provide a notify method that is called when + * a probe point event occurs. Multiple ProbeListeners + * can be added to each ProbePoint. + * + * ProbeListenerObject: a wrapper around a SimObject that can connect to another + * SimObject on which is will add ProbeListeners. + * + * ProbeManager: used to match up ProbeListeners and ProbePoints. + * At simulation init this is handled by regProbePoints + * followed by regProbeListeners being called on each + * SimObject in hierarchical ordering. + * ProbeListeners can be added/removed dynamically at runtime. + */ + +#ifndef __SIM_PROBE_PROBE_HH__ +#define __SIM_PROBE_PROBE_HH__ + +#include +#include + +#include "base/trace.hh" +#include "params/ProbeListenerObject.hh" +#include "sim/sim_object.hh" + +/** Forward declare the ProbeManager. */ +class ProbeManager; +class ProbeListener; + +/** + * This class is a minimal wrapper around SimObject. It is used to declare + * a python derived object that can be added as a ProbeListener to any other + * SimObject. + * + * It instantiates manager from a call to Parent.any. + * The vector of listeners is used simply to hold onto listeners until the + * ProbeListenerObject is destroyed. + */ +class ProbeListenerObject : public SimObject +{ + protected: + ProbeManager *manager; + std::vector listeners; + + public: + ProbeListenerObject(const ProbeListenerObjectParams *params); + virtual ~ProbeListenerObject(); + ProbeManager* getProbeManager() { return manager; } +}; + +/** + * ProbeListener base class; here to simplify things like containers + * containing multiple types of ProbeListener. + * + * Note a ProbeListener is added to the ProbePoint in constructor by + * using the ProbeManager passed in. + */ +class ProbeListener +{ + public: + ProbeListener(ProbeManager *manager, const std::string &name); + virtual ~ProbeListener() {} +}; + +/** + * ProbeListener base class; again used to simplify use of ProbePoints + * in containers and used as to define interface for adding removing + * listeners to the ProbePoint. + */ +class ProbePoint +{ + protected: + const std::string name; + public: + ProbePoint(ProbeManager *manager, const std::string &name); + virtual ~ProbePoint() {} + + virtual void addListener(ProbeListener *listener) = 0; + virtual void removeListener(ProbeListener *listener) = 0; + std::string getName() const { return name; } +}; + +/** + * ProbeManager is a conduit class that lives on each SimObject, + * and is used to match up probe listeners with probe points. + */ +class ProbeManager +{ + private: + /** Required for sensible debug messages.*/ + const SimObject *object; + /** Vector for name look-up. */ + std::vector points; + + public: + ProbeManager(SimObject *obj) + : object(obj) + {} + virtual ~ProbeManager() {} + + /** + * @brief Add a ProbeListener to the ProbePoint named by pointName. + * If the name doesn't resolve a ProbePoint return false. + * @param pointName the name of the ProbePoint to add the ProbeListener to. + * @param listener the ProbeListener to add. + * @return true if added, false otherwise. + */ + bool addListener(std::string pointName, ProbeListener &listener); + + /** + * @brief Remove a ProbeListener from the ProbePoint named by pointName. + * If the name doesn't resolve a ProbePoint return false. + * @param pointName the name of the ProbePoint to remove the ProbeListener + * from. + * @param listener the ProbeListener to remove. + * @return true if removed, false otherwise. + */ + bool removeListener(std::string pointName, ProbeListener &listener); + + /** + * @brief Add a ProbePoint to this SimObject ProbeManager. + * @param point the ProbePoint to add. + */ + void addPoint(ProbePoint &point); +}; + +/** + * ProbeListenerArgBase is used to define the base interface to a + * ProbeListenerArg (i.e the notify method on specific type). + * + * It is necessary to split this out from ProbeListenerArg, as that + * templates off the class containing the function that notify calls. + */ +template +class ProbeListenerArgBase : public ProbeListener +{ + public: + ProbeListenerArgBase(ProbeManager *pm, const std::string &name) + : ProbeListener(pm, name) + {} + virtual void notify(const Arg &val) = 0; +}; + +/** + * ProbeListenerArg generates a listener for the class of Arg and the + * class type T which is the class containing the function that notify will + * call. + * + * Note that the function is passed as a pointer on construction. + */ +template +class ProbeListenerArg : public ProbeListenerArgBase +{ + private: + T *object; + void (T::* function)(const Arg &); + + public: + /** + * @param obj the class of type Tcontaining the method to call on notify. + * @param name the name of the ProbePoint to add this listener to. + * @param func a pointer to the function on obj (called on notify). + */ + ProbeListenerArg(T *obj, const std::string &name, void (T::* func)(const Arg &)) + : ProbeListenerArgBase(obj->getProbeManager(), name), + object(obj), + function(func) + {} + + /** + * @brief called when the ProbePoint calls notify. This is a shim through to + * the function passed during construction. + * @param val the argument value to pass. + */ + virtual void notify(const Arg &val) { (object->*function)(val); } +}; + +/** + * ProbePointArg generates a point for the class of Arg. As ProbePointArgs talk + * directly to ProbeListenerArgs of the same type, we can store the vector of + * ProbeListeners as their Arg type (and not as base type). + * + * Methods are provided to addListener, removeListener and notify. + */ +template +class ProbePointArg : public ProbePoint +{ + /** The attached listeners. */ + std::vector *> listeners; + + public: + ProbePointArg(ProbeManager *manager, std::string name) + : ProbePoint(manager, name) + { + } + + /** + * @brief adds a ProbeListener to this ProbePoints notify list. + * @param l the ProbeListener to add to the notify list. + */ + void addListener(ProbeListener *l) + { + // check listener not already added + if (std::find(listeners.begin(), listeners.end(), l) == listeners.end()) { + listeners.push_back(static_cast *>(l)); + } + } + + /** + * @brief remove a ProbeListener from this ProbePoints notify list. + * @param l the ProbeListener to remove from the notify list. + */ + void removeListener(ProbeListener *l) + { + listeners.erase(std::remove(listeners.begin(), listeners.end(), l), + listeners.end()); + } + + /** + * @brief called at the ProbePoint call site, passes arg to each listener. + * @param arg the argument to pass to each listener. + */ + void notify(const Arg &arg) + { + for (auto l = listeners.begin(); l != listeners.end(); ++l) { + (*l)->notify(arg); + } + } +}; +#endif//__SIM_PROBE_PROBE_HH__ diff -r e45c2ada8442 -r 8319c028bbd8 src/sim/probe/probe.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sim/probe/probe.cc Thu Nov 14 15:04:42 2013 -0600 @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2013 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Matt Horsnell + */ + +#include "debug/ProbeVerbose.hh" +#include "sim/probe/probe.hh" + +ProbePoint::ProbePoint(ProbeManager *manager, const std::string& _name) + : name(_name) +{ + if (manager) { + manager->addPoint(*this); + } +} + +ProbeListenerObject::ProbeListenerObject(const ProbeListenerObjectParams *params) + : SimObject(params), + manager(params->manager->getProbeManager()) +{ +} + +ProbeListenerObject::~ProbeListenerObject() +{ + for (auto l = listeners.begin(); l != listeners.end(); ++l) { + delete (*l); + } + listeners.clear(); +} + +ProbeListener::ProbeListener(ProbeManager *manager, const std::string &name) +{ + manager->addListener(name, *this); +} + +ProbeListenerObject* +ProbeListenerObjectParams::create() +{ + return new ProbeListenerObject(this); +} + +bool +ProbeManager::addListener(std::string pointName, ProbeListener &listener) +{ + DPRINTFR(ProbeVerbose, "Probes: Call to addListener to \"%s\" on %s.\n", pointName, object->name()); + bool added = false; + for (auto p = points.begin(); p != points.end(); ++p) { + if ((*p)->getName() == pointName) { + (*p)->addListener(&listener); + added = true; + } + } + if (!added) { + DPRINTFR(ProbeVerbose, "Probes: Call to addListener to \"%s\" on %s failed, no such point.\n", pointName, object->name()); + } + return added; +} + +bool +ProbeManager::removeListener(std::string pointName, ProbeListener &listener) +{ + DPRINTFR(ProbeVerbose, "Probes: Call to removeListener from \"%s\" on %s.\n", pointName, object->name()); + bool removed = false; + for (auto p = points.begin(); p != points.end(); ++p) { + if ((*p)->getName() == pointName) { + (*p)->removeListener(&listener); + removed = true; + } + } + if (!removed) { + DPRINTFR(ProbeVerbose, "Probes: Call to removeListener from \"%s\" on %s failed, no such point.\n", pointName, object->name()); + } + return removed; +} + +void +ProbeManager::addPoint(ProbePoint &point) +{ + DPRINTFR(ProbeVerbose, "Probes: Call to addPoint \"%s\" to %s.\n", point.getName(), object->name()); + + for (auto p = points.begin(); p != points.end(); ++p) { + if ((*p)->getName() == point.getName()) { + DPRINTFR(ProbeVerbose, "Probes: Call to addPoint \"%s\" to %s failed, already added.\n", point.getName(), object->name()); + return; + } + } + points.push_back(&point); +} diff -r e45c2ada8442 -r 8319c028bbd8 src/sim/sim_object.hh --- a/src/sim/sim_object.hh Thu Nov 14 15:04:27 2013 -0600 +++ b/src/sim/sim_object.hh Thu Nov 14 15:04:42 2013 -0600 @@ -51,7 +51,7 @@ class BaseCPU; class Event; - +class ProbeManager; /** * Abstract superclass for simulation objects. Represents things that * correspond to physical components and can be specified via the @@ -90,6 +90,9 @@ /** List of all instantiated simulation objects. */ static SimObjectList simObjectList; + /** Manager coordinates hooking up probe points with listeners. */ + ProbeManager *probeManager; + protected: /** Cached copy of the object parameters. */ const SimObjectParams *_params; @@ -143,6 +146,21 @@ virtual void resetStats(); /** + * Register probe points for this object. + */ + virtual void regProbePoints(); + + /** + * Register probe listeners for this object. + */ + virtual void regProbeListeners(); + + /** + * Get the probe manager for this object. + */ + ProbeManager *getProbeManager(); + + /** * startup() is the final initialization call before simulation. * All state is initialized (including unserialized state, if any, * such as the curTick() value), so this is the appropriate place to diff -r e45c2ada8442 -r 8319c028bbd8 src/sim/sim_object.cc --- a/src/sim/sim_object.cc Thu Nov 14 15:04:27 2013 -0600 +++ b/src/sim/sim_object.cc Thu Nov 14 15:04:42 2013 -0600 @@ -39,6 +39,7 @@ #include "base/trace.hh" #include "base/types.hh" #include "debug/Checkpoint.hh" +#include "sim/probe/probe.hh" #include "sim/sim_object.hh" #include "sim/stats.hh" @@ -65,8 +66,8 @@ #ifdef DEBUG doDebugBreak = false; #endif - simObjectList.push_back(this); + probeManager = new ProbeManager(this); } void @@ -108,6 +109,28 @@ { } +/** + * No probe points by default, so do nothing in base. + */ +void +SimObject::regProbePoints() +{ +} + +/** + * No probe listeners by default, so do nothing in base. + */ +void +SimObject::regProbeListeners() +{ +} + +ProbeManager * +SimObject::getProbeManager() +{ + return probeManager; +} + // // static function: serialize all SimObjects. //