mem_checker_monitor.hh revision 13892
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2012-2014 ARM Limited 311308Santhony.gutierrez@amd.com * All rights reserved 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * The license below extends only to copyright in the software and shall 611308Santhony.gutierrez@amd.com * not be construed as granting a license to any other intellectual 711308Santhony.gutierrez@amd.com * property including but not limited to intellectual property relating 811308Santhony.gutierrez@amd.com * to a hardware implementation of the functionality of the software 911308Santhony.gutierrez@amd.com * licensed hereunder. You may use the software subject to the license 1011308Santhony.gutierrez@amd.com * terms below provided that you ensure that this notice is replicated 1111308Santhony.gutierrez@amd.com * unmodified and in its entirety in all distributions of the software, 1211308Santhony.gutierrez@amd.com * modified or unmodified, in source code or in binary form. 1311308Santhony.gutierrez@amd.com * 1411308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 1511308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 1611308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 1711308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 1811308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1911308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 2011308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 2111308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 2211308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 2311308Santhony.gutierrez@amd.com * this software without specific prior written permission. 2411308Santhony.gutierrez@amd.com * 2511308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2611308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2711308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2811308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2911308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3011308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3111308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3211308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3311308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3411308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3511308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3611308Santhony.gutierrez@amd.com * 3711308Santhony.gutierrez@amd.com * Authors: Thomas Grass 3811308Santhony.gutierrez@amd.com * Andreas Hansson 3911308Santhony.gutierrez@amd.com * Marco Elver 4011308Santhony.gutierrez@amd.com */ 4111308Santhony.gutierrez@amd.com 4211308Santhony.gutierrez@amd.com#ifndef __MEM_MEM_CHECKER_MONITOR_HH__ 4311308Santhony.gutierrez@amd.com#define __MEM_MEM_CHECKER_MONITOR_HH__ 4411692Santhony.gutierrez@amd.com 4511534Sjohn.kalamatianos@amd.com#include "base/statistics.hh" 4611692Santhony.gutierrez@amd.com#include "mem/mem_checker.hh" 4711692Santhony.gutierrez@amd.com#include "params/MemCheckerMonitor.hh" 4811308Santhony.gutierrez@amd.com#include "sim/sim_object.hh" 4911534Sjohn.kalamatianos@amd.com#include "sim/system.hh" 5011534Sjohn.kalamatianos@amd.com 5111534Sjohn.kalamatianos@amd.com/** 5211534Sjohn.kalamatianos@amd.com * Implements a MemChecker monitor, to be inserted between two ports. 5311534Sjohn.kalamatianos@amd.com */ 5411534Sjohn.kalamatianos@amd.comclass MemCheckerMonitor : public SimObject 5511534Sjohn.kalamatianos@amd.com{ 5611534Sjohn.kalamatianos@amd.com public: 5711534Sjohn.kalamatianos@amd.com 5811534Sjohn.kalamatianos@amd.com /** Parameters of memchecker monitor */ 5911534Sjohn.kalamatianos@amd.com typedef MemCheckerMonitorParams Params; 6011534Sjohn.kalamatianos@amd.com const Params* params() const 6111534Sjohn.kalamatianos@amd.com { return reinterpret_cast<const Params*>(_params); } 6211534Sjohn.kalamatianos@amd.com 6311534Sjohn.kalamatianos@amd.com /** 6411534Sjohn.kalamatianos@amd.com * Constructor based on the Python params 6511534Sjohn.kalamatianos@amd.com * 6611534Sjohn.kalamatianos@amd.com * @param params Python parameters 6711308Santhony.gutierrez@amd.com */ 6811308Santhony.gutierrez@amd.com MemCheckerMonitor(Params* params); 6911308Santhony.gutierrez@amd.com 7011692Santhony.gutierrez@amd.com /** Destructor */ 7111308Santhony.gutierrez@amd.com ~MemCheckerMonitor(); 7211692Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com Port &getPort(const std::string &if_name, 7411308Santhony.gutierrez@amd.com PortID idx=InvalidPortID) override; 7511308Santhony.gutierrez@amd.com 7611308Santhony.gutierrez@amd.com void init() override; 7711308Santhony.gutierrez@amd.com 7811692Santhony.gutierrez@amd.com private: 7911308Santhony.gutierrez@amd.com 8011308Santhony.gutierrez@amd.com struct MemCheckerMonitorSenderState : public Packet::SenderState 8111308Santhony.gutierrez@amd.com { 8211308Santhony.gutierrez@amd.com MemCheckerMonitorSenderState(MemChecker::Serial _serial) 8311308Santhony.gutierrez@amd.com : serial(_serial) 8411692Santhony.gutierrez@amd.com {} 8511308Santhony.gutierrez@amd.com 8611308Santhony.gutierrez@amd.com MemChecker::Serial serial; 8711308Santhony.gutierrez@amd.com }; 8811308Santhony.gutierrez@amd.com 8911308Santhony.gutierrez@amd.com /** 9011692Santhony.gutierrez@amd.com * This is the master port of the communication monitor. All recv 9111308Santhony.gutierrez@amd.com * functions call a function in MemCheckerMonitor, where the 9211308Santhony.gutierrez@amd.com * send function of the slave port is called. Besides this, these 9311308Santhony.gutierrez@amd.com * functions can also perform actions for capturing statistics. 9411308Santhony.gutierrez@amd.com */ 9511308Santhony.gutierrez@amd.com class MonitorMasterPort : public MasterPort 9611692Santhony.gutierrez@amd.com { 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com public: 9911308Santhony.gutierrez@amd.com 10011308Santhony.gutierrez@amd.com MonitorMasterPort(const std::string& _name, MemCheckerMonitor& _mon) 10111308Santhony.gutierrez@amd.com : MasterPort(_name, &_mon), mon(_mon) 10211692Santhony.gutierrez@amd.com { } 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.com protected: 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com void recvFunctionalSnoop(PacketPtr pkt) 10711308Santhony.gutierrez@amd.com { 10811692Santhony.gutierrez@amd.com mon.recvFunctionalSnoop(pkt); 10911308Santhony.gutierrez@amd.com } 11011308Santhony.gutierrez@amd.com 11111308Santhony.gutierrez@amd.com Tick recvAtomicSnoop(PacketPtr pkt) 11211308Santhony.gutierrez@amd.com { 11311308Santhony.gutierrez@amd.com return mon.recvAtomicSnoop(pkt); 11411692Santhony.gutierrez@amd.com } 11511308Santhony.gutierrez@amd.com 11611308Santhony.gutierrez@amd.com bool recvTimingResp(PacketPtr pkt) 11711308Santhony.gutierrez@amd.com { 11811308Santhony.gutierrez@amd.com return mon.recvTimingResp(pkt); 11911308Santhony.gutierrez@amd.com } 12011692Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com void recvTimingSnoopReq(PacketPtr pkt) 12211308Santhony.gutierrez@amd.com { 12311308Santhony.gutierrez@amd.com mon.recvTimingSnoopReq(pkt); 12411308Santhony.gutierrez@amd.com } 12511308Santhony.gutierrez@amd.com 12611692Santhony.gutierrez@amd.com void recvRangeChange() 12711308Santhony.gutierrez@amd.com { 12811308Santhony.gutierrez@amd.com mon.recvRangeChange(); 12911308Santhony.gutierrez@amd.com } 13011308Santhony.gutierrez@amd.com 13111308Santhony.gutierrez@amd.com bool isSnooping() const 13211692Santhony.gutierrez@amd.com { 13311308Santhony.gutierrez@amd.com return mon.isSnooping(); 13411308Santhony.gutierrez@amd.com } 13511308Santhony.gutierrez@amd.com 13611308Santhony.gutierrez@amd.com void recvReqRetry() 13711308Santhony.gutierrez@amd.com { 13811308Santhony.gutierrez@amd.com mon.recvReqRetry(); 13911308Santhony.gutierrez@amd.com } 14011308Santhony.gutierrez@amd.com 14111308Santhony.gutierrez@amd.com private: 14211308Santhony.gutierrez@amd.com 14311308Santhony.gutierrez@amd.com MemCheckerMonitor& mon; 14411692Santhony.gutierrez@amd.com 14511308Santhony.gutierrez@amd.com }; 14611308Santhony.gutierrez@amd.com 14711308Santhony.gutierrez@amd.com /** Instance of master port, facing the memory side */ 14811308Santhony.gutierrez@amd.com MonitorMasterPort masterPort; 14911308Santhony.gutierrez@amd.com 15011308Santhony.gutierrez@amd.com /** 15111308Santhony.gutierrez@amd.com * This is the slave port of the communication monitor. All recv 15211308Santhony.gutierrez@amd.com * functions call a function in MemCheckerMonitor, where the 15311308Santhony.gutierrez@amd.com * send function of the master port is called. Besides this, these 15411692Santhony.gutierrez@amd.com * functions can also perform actions for capturing statistics. 15511308Santhony.gutierrez@amd.com */ 15611308Santhony.gutierrez@amd.com class MonitorSlavePort : public SlavePort 15711308Santhony.gutierrez@amd.com { 15811693Santhony.gutierrez@amd.com 15911693Santhony.gutierrez@amd.com public: 16011693Santhony.gutierrez@amd.com 16111693Santhony.gutierrez@amd.com MonitorSlavePort(const std::string& _name, MemCheckerMonitor& _mon) 16211693Santhony.gutierrez@amd.com : SlavePort(_name, &_mon), mon(_mon) 16311693Santhony.gutierrez@amd.com { } 16411692Santhony.gutierrez@amd.com 16511692Santhony.gutierrez@amd.com protected: 16611692Santhony.gutierrez@amd.com 16711692Santhony.gutierrez@amd.com void recvFunctional(PacketPtr pkt) 16811308Santhony.gutierrez@amd.com { 16911692Santhony.gutierrez@amd.com mon.recvFunctional(pkt); 17011308Santhony.gutierrez@amd.com } 17111692Santhony.gutierrez@amd.com 17211692Santhony.gutierrez@amd.com Tick recvAtomic(PacketPtr pkt) 17311692Santhony.gutierrez@amd.com { 17411692Santhony.gutierrez@amd.com return mon.recvAtomic(pkt); 17511692Santhony.gutierrez@amd.com } 17611692Santhony.gutierrez@amd.com 17711692Santhony.gutierrez@amd.com bool recvTimingReq(PacketPtr pkt) 17811692Santhony.gutierrez@amd.com { 17911692Santhony.gutierrez@amd.com return mon.recvTimingReq(pkt); 18011692Santhony.gutierrez@amd.com } 18111692Santhony.gutierrez@amd.com 18211692Santhony.gutierrez@amd.com bool recvTimingSnoopResp(PacketPtr pkt) 18311692Santhony.gutierrez@amd.com { 18411692Santhony.gutierrez@amd.com return mon.recvTimingSnoopResp(pkt); 18511692Santhony.gutierrez@amd.com } 18611692Santhony.gutierrez@amd.com 18711692Santhony.gutierrez@amd.com AddrRangeList getAddrRanges() const 18811692Santhony.gutierrez@amd.com { 18911692Santhony.gutierrez@amd.com return mon.getAddrRanges(); 19011692Santhony.gutierrez@amd.com } 19111692Santhony.gutierrez@amd.com 19211692Santhony.gutierrez@amd.com void recvRespRetry() 19311692Santhony.gutierrez@amd.com { 19411692Santhony.gutierrez@amd.com mon.recvRespRetry(); 19511692Santhony.gutierrez@amd.com } 19611692Santhony.gutierrez@amd.com 19711692Santhony.gutierrez@amd.com private: 19811692Santhony.gutierrez@amd.com 19911692Santhony.gutierrez@amd.com MemCheckerMonitor& mon; 20011692Santhony.gutierrez@amd.com 20111692Santhony.gutierrez@amd.com }; 20211692Santhony.gutierrez@amd.com 20311692Santhony.gutierrez@amd.com /** Instance of slave port, i.e. on the CPU side */ 20411692Santhony.gutierrez@amd.com MonitorSlavePort slavePort; 20511692Santhony.gutierrez@amd.com 20611692Santhony.gutierrez@amd.com void recvFunctional(PacketPtr pkt); 20711692Santhony.gutierrez@amd.com 20811692Santhony.gutierrez@amd.com void recvFunctionalSnoop(PacketPtr pkt); 20911692Santhony.gutierrez@amd.com 21011692Santhony.gutierrez@amd.com Tick recvAtomic(PacketPtr pkt); 21111692Santhony.gutierrez@amd.com 21211692Santhony.gutierrez@amd.com Tick recvAtomicSnoop(PacketPtr pkt); 21311692Santhony.gutierrez@amd.com 21411692Santhony.gutierrez@amd.com bool recvTimingReq(PacketPtr pkt); 21511692Santhony.gutierrez@amd.com 21611692Santhony.gutierrez@amd.com bool recvTimingResp(PacketPtr pkt); 21711692Santhony.gutierrez@amd.com 21811692Santhony.gutierrez@amd.com void recvTimingSnoopReq(PacketPtr pkt); 21911692Santhony.gutierrez@amd.com 22011692Santhony.gutierrez@amd.com bool recvTimingSnoopResp(PacketPtr pkt); 22111692Santhony.gutierrez@amd.com 22211692Santhony.gutierrez@amd.com AddrRangeList getAddrRanges() const; 22311692Santhony.gutierrez@amd.com 22411692Santhony.gutierrez@amd.com bool isSnooping() const; 22511692Santhony.gutierrez@amd.com 22611692Santhony.gutierrez@amd.com void recvReqRetry(); 22711692Santhony.gutierrez@amd.com 22811692Santhony.gutierrez@amd.com void recvRespRetry(); 22911692Santhony.gutierrez@amd.com 23011692Santhony.gutierrez@amd.com void recvRangeChange(); 23111692Santhony.gutierrez@amd.com 23211692Santhony.gutierrez@amd.com bool warnOnly; 23311692Santhony.gutierrez@amd.com 23411692Santhony.gutierrez@amd.com MemChecker *memchecker; 23511692Santhony.gutierrez@amd.com}; 23611692Santhony.gutierrez@amd.com 23711692Santhony.gutierrez@amd.com#endif //__MEM_MEM_CHECKER_MONITOR_HH__ 23811692Santhony.gutierrez@amd.com