mem_checker_monitor.hh revision 10612
110612SMarco.Elver@ARM.com/* 210612SMarco.Elver@ARM.com * Copyright (c) 2012-2014 ARM Limited 310612SMarco.Elver@ARM.com * All rights reserved 410612SMarco.Elver@ARM.com * 510612SMarco.Elver@ARM.com * The license below extends only to copyright in the software and shall 610612SMarco.Elver@ARM.com * not be construed as granting a license to any other intellectual 710612SMarco.Elver@ARM.com * property including but not limited to intellectual property relating 810612SMarco.Elver@ARM.com * to a hardware implementation of the functionality of the software 910612SMarco.Elver@ARM.com * licensed hereunder. You may use the software subject to the license 1010612SMarco.Elver@ARM.com * terms below provided that you ensure that this notice is replicated 1110612SMarco.Elver@ARM.com * unmodified and in its entirety in all distributions of the software, 1210612SMarco.Elver@ARM.com * modified or unmodified, in source code or in binary form. 1310612SMarco.Elver@ARM.com * 1410612SMarco.Elver@ARM.com * Redistribution and use in source and binary forms, with or without 1510612SMarco.Elver@ARM.com * modification, are permitted provided that the following conditions are 1610612SMarco.Elver@ARM.com * met: redistributions of source code must retain the above copyright 1710612SMarco.Elver@ARM.com * notice, this list of conditions and the following disclaimer; 1810612SMarco.Elver@ARM.com * redistributions in binary form must reproduce the above copyright 1910612SMarco.Elver@ARM.com * notice, this list of conditions and the following disclaimer in the 2010612SMarco.Elver@ARM.com * documentation and/or other materials provided with the distribution; 2110612SMarco.Elver@ARM.com * neither the name of the copyright holders nor the names of its 2210612SMarco.Elver@ARM.com * contributors may be used to endorse or promote products derived from 2310612SMarco.Elver@ARM.com * this software without specific prior written permission. 2410612SMarco.Elver@ARM.com * 2510612SMarco.Elver@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610612SMarco.Elver@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710612SMarco.Elver@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810612SMarco.Elver@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910612SMarco.Elver@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010612SMarco.Elver@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110612SMarco.Elver@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210612SMarco.Elver@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310612SMarco.Elver@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410612SMarco.Elver@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510612SMarco.Elver@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610612SMarco.Elver@ARM.com * 3710612SMarco.Elver@ARM.com * Authors: Thomas Grass 3810612SMarco.Elver@ARM.com * Andreas Hansson 3910612SMarco.Elver@ARM.com * Marco Elver 4010612SMarco.Elver@ARM.com */ 4110612SMarco.Elver@ARM.com 4210612SMarco.Elver@ARM.com#ifndef __MEM_MEM_CHECKER_MONITOR_HH__ 4310612SMarco.Elver@ARM.com#define __MEM_MEM_CHECKER_MONITOR_HH__ 4410612SMarco.Elver@ARM.com 4510612SMarco.Elver@ARM.com#include "base/statistics.hh" 4610612SMarco.Elver@ARM.com#include "mem/mem_checker.hh" 4710612SMarco.Elver@ARM.com#include "mem/mem_object.hh" 4810612SMarco.Elver@ARM.com#include "params/MemCheckerMonitor.hh" 4910612SMarco.Elver@ARM.com#include "sim/system.hh" 5010612SMarco.Elver@ARM.com 5110612SMarco.Elver@ARM.com/** 5210612SMarco.Elver@ARM.com * Implements a MemChecker monitor, to be inserted between two ports. 5310612SMarco.Elver@ARM.com */ 5410612SMarco.Elver@ARM.comclass MemCheckerMonitor : public MemObject 5510612SMarco.Elver@ARM.com{ 5610612SMarco.Elver@ARM.com public: 5710612SMarco.Elver@ARM.com 5810612SMarco.Elver@ARM.com /** Parameters of memchecker monitor */ 5910612SMarco.Elver@ARM.com typedef MemCheckerMonitorParams Params; 6010612SMarco.Elver@ARM.com const Params* params() const 6110612SMarco.Elver@ARM.com { return reinterpret_cast<const Params*>(_params); } 6210612SMarco.Elver@ARM.com 6310612SMarco.Elver@ARM.com /** 6410612SMarco.Elver@ARM.com * Constructor based on the Python params 6510612SMarco.Elver@ARM.com * 6610612SMarco.Elver@ARM.com * @param params Python parameters 6710612SMarco.Elver@ARM.com */ 6810612SMarco.Elver@ARM.com MemCheckerMonitor(Params* params); 6910612SMarco.Elver@ARM.com 7010612SMarco.Elver@ARM.com /** Destructor */ 7110612SMarco.Elver@ARM.com ~MemCheckerMonitor(); 7210612SMarco.Elver@ARM.com 7310612SMarco.Elver@ARM.com virtual BaseMasterPort& getMasterPort(const std::string& if_name, 7410612SMarco.Elver@ARM.com PortID idx = InvalidPortID); 7510612SMarco.Elver@ARM.com 7610612SMarco.Elver@ARM.com virtual BaseSlavePort& getSlavePort(const std::string& if_name, 7710612SMarco.Elver@ARM.com PortID idx = InvalidPortID); 7810612SMarco.Elver@ARM.com 7910612SMarco.Elver@ARM.com virtual void init(); 8010612SMarco.Elver@ARM.com 8110612SMarco.Elver@ARM.com private: 8210612SMarco.Elver@ARM.com 8310612SMarco.Elver@ARM.com struct MemCheckerMonitorSenderState : public Packet::SenderState 8410612SMarco.Elver@ARM.com { 8510612SMarco.Elver@ARM.com MemCheckerMonitorSenderState(MemChecker::Serial _serial) 8610612SMarco.Elver@ARM.com : serial(_serial) 8710612SMarco.Elver@ARM.com {} 8810612SMarco.Elver@ARM.com 8910612SMarco.Elver@ARM.com MemChecker::Serial serial; 9010612SMarco.Elver@ARM.com }; 9110612SMarco.Elver@ARM.com 9210612SMarco.Elver@ARM.com /** 9310612SMarco.Elver@ARM.com * This is the master port of the communication monitor. All recv 9410612SMarco.Elver@ARM.com * functions call a function in MemCheckerMonitor, where the 9510612SMarco.Elver@ARM.com * send function of the slave port is called. Besides this, these 9610612SMarco.Elver@ARM.com * functions can also perform actions for capturing statistics. 9710612SMarco.Elver@ARM.com */ 9810612SMarco.Elver@ARM.com class MonitorMasterPort : public MasterPort 9910612SMarco.Elver@ARM.com { 10010612SMarco.Elver@ARM.com 10110612SMarco.Elver@ARM.com public: 10210612SMarco.Elver@ARM.com 10310612SMarco.Elver@ARM.com MonitorMasterPort(const std::string& _name, MemCheckerMonitor& _mon) 10410612SMarco.Elver@ARM.com : MasterPort(_name, &_mon), mon(_mon) 10510612SMarco.Elver@ARM.com { } 10610612SMarco.Elver@ARM.com 10710612SMarco.Elver@ARM.com protected: 10810612SMarco.Elver@ARM.com 10910612SMarco.Elver@ARM.com void recvFunctionalSnoop(PacketPtr pkt) 11010612SMarco.Elver@ARM.com { 11110612SMarco.Elver@ARM.com mon.recvFunctionalSnoop(pkt); 11210612SMarco.Elver@ARM.com } 11310612SMarco.Elver@ARM.com 11410612SMarco.Elver@ARM.com Tick recvAtomicSnoop(PacketPtr pkt) 11510612SMarco.Elver@ARM.com { 11610612SMarco.Elver@ARM.com return mon.recvAtomicSnoop(pkt); 11710612SMarco.Elver@ARM.com } 11810612SMarco.Elver@ARM.com 11910612SMarco.Elver@ARM.com bool recvTimingResp(PacketPtr pkt) 12010612SMarco.Elver@ARM.com { 12110612SMarco.Elver@ARM.com return mon.recvTimingResp(pkt); 12210612SMarco.Elver@ARM.com } 12310612SMarco.Elver@ARM.com 12410612SMarco.Elver@ARM.com void recvTimingSnoopReq(PacketPtr pkt) 12510612SMarco.Elver@ARM.com { 12610612SMarco.Elver@ARM.com mon.recvTimingSnoopReq(pkt); 12710612SMarco.Elver@ARM.com } 12810612SMarco.Elver@ARM.com 12910612SMarco.Elver@ARM.com void recvRangeChange() 13010612SMarco.Elver@ARM.com { 13110612SMarco.Elver@ARM.com mon.recvRangeChange(); 13210612SMarco.Elver@ARM.com } 13310612SMarco.Elver@ARM.com 13410612SMarco.Elver@ARM.com bool isSnooping() const 13510612SMarco.Elver@ARM.com { 13610612SMarco.Elver@ARM.com return mon.isSnooping(); 13710612SMarco.Elver@ARM.com } 13810612SMarco.Elver@ARM.com 13910612SMarco.Elver@ARM.com void recvRetry() 14010612SMarco.Elver@ARM.com { 14110612SMarco.Elver@ARM.com mon.recvRetryMaster(); 14210612SMarco.Elver@ARM.com } 14310612SMarco.Elver@ARM.com 14410612SMarco.Elver@ARM.com private: 14510612SMarco.Elver@ARM.com 14610612SMarco.Elver@ARM.com MemCheckerMonitor& mon; 14710612SMarco.Elver@ARM.com 14810612SMarco.Elver@ARM.com }; 14910612SMarco.Elver@ARM.com 15010612SMarco.Elver@ARM.com /** Instance of master port, facing the memory side */ 15110612SMarco.Elver@ARM.com MonitorMasterPort masterPort; 15210612SMarco.Elver@ARM.com 15310612SMarco.Elver@ARM.com /** 15410612SMarco.Elver@ARM.com * This is the slave port of the communication monitor. All recv 15510612SMarco.Elver@ARM.com * functions call a function in MemCheckerMonitor, where the 15610612SMarco.Elver@ARM.com * send function of the master port is called. Besides this, these 15710612SMarco.Elver@ARM.com * functions can also perform actions for capturing statistics. 15810612SMarco.Elver@ARM.com */ 15910612SMarco.Elver@ARM.com class MonitorSlavePort : public SlavePort 16010612SMarco.Elver@ARM.com { 16110612SMarco.Elver@ARM.com 16210612SMarco.Elver@ARM.com public: 16310612SMarco.Elver@ARM.com 16410612SMarco.Elver@ARM.com MonitorSlavePort(const std::string& _name, MemCheckerMonitor& _mon) 16510612SMarco.Elver@ARM.com : SlavePort(_name, &_mon), mon(_mon) 16610612SMarco.Elver@ARM.com { } 16710612SMarco.Elver@ARM.com 16810612SMarco.Elver@ARM.com protected: 16910612SMarco.Elver@ARM.com 17010612SMarco.Elver@ARM.com void recvFunctional(PacketPtr pkt) 17110612SMarco.Elver@ARM.com { 17210612SMarco.Elver@ARM.com mon.recvFunctional(pkt); 17310612SMarco.Elver@ARM.com } 17410612SMarco.Elver@ARM.com 17510612SMarco.Elver@ARM.com Tick recvAtomic(PacketPtr pkt) 17610612SMarco.Elver@ARM.com { 17710612SMarco.Elver@ARM.com return mon.recvAtomic(pkt); 17810612SMarco.Elver@ARM.com } 17910612SMarco.Elver@ARM.com 18010612SMarco.Elver@ARM.com bool recvTimingReq(PacketPtr pkt) 18110612SMarco.Elver@ARM.com { 18210612SMarco.Elver@ARM.com return mon.recvTimingReq(pkt); 18310612SMarco.Elver@ARM.com } 18410612SMarco.Elver@ARM.com 18510612SMarco.Elver@ARM.com bool recvTimingSnoopResp(PacketPtr pkt) 18610612SMarco.Elver@ARM.com { 18710612SMarco.Elver@ARM.com return mon.recvTimingSnoopResp(pkt); 18810612SMarco.Elver@ARM.com } 18910612SMarco.Elver@ARM.com 19010612SMarco.Elver@ARM.com AddrRangeList getAddrRanges() const 19110612SMarco.Elver@ARM.com { 19210612SMarco.Elver@ARM.com return mon.getAddrRanges(); 19310612SMarco.Elver@ARM.com } 19410612SMarco.Elver@ARM.com 19510612SMarco.Elver@ARM.com void recvRetry() 19610612SMarco.Elver@ARM.com { 19710612SMarco.Elver@ARM.com mon.recvRetrySlave(); 19810612SMarco.Elver@ARM.com } 19910612SMarco.Elver@ARM.com 20010612SMarco.Elver@ARM.com private: 20110612SMarco.Elver@ARM.com 20210612SMarco.Elver@ARM.com MemCheckerMonitor& mon; 20310612SMarco.Elver@ARM.com 20410612SMarco.Elver@ARM.com }; 20510612SMarco.Elver@ARM.com 20610612SMarco.Elver@ARM.com /** Instance of slave port, i.e. on the CPU side */ 20710612SMarco.Elver@ARM.com MonitorSlavePort slavePort; 20810612SMarco.Elver@ARM.com 20910612SMarco.Elver@ARM.com void recvFunctional(PacketPtr pkt); 21010612SMarco.Elver@ARM.com 21110612SMarco.Elver@ARM.com void recvFunctionalSnoop(PacketPtr pkt); 21210612SMarco.Elver@ARM.com 21310612SMarco.Elver@ARM.com Tick recvAtomic(PacketPtr pkt); 21410612SMarco.Elver@ARM.com 21510612SMarco.Elver@ARM.com Tick recvAtomicSnoop(PacketPtr pkt); 21610612SMarco.Elver@ARM.com 21710612SMarco.Elver@ARM.com bool recvTimingReq(PacketPtr pkt); 21810612SMarco.Elver@ARM.com 21910612SMarco.Elver@ARM.com bool recvTimingResp(PacketPtr pkt); 22010612SMarco.Elver@ARM.com 22110612SMarco.Elver@ARM.com void recvTimingSnoopReq(PacketPtr pkt); 22210612SMarco.Elver@ARM.com 22310612SMarco.Elver@ARM.com bool recvTimingSnoopResp(PacketPtr pkt); 22410612SMarco.Elver@ARM.com 22510612SMarco.Elver@ARM.com AddrRangeList getAddrRanges() const; 22610612SMarco.Elver@ARM.com 22710612SMarco.Elver@ARM.com bool isSnooping() const; 22810612SMarco.Elver@ARM.com 22910612SMarco.Elver@ARM.com void recvRetryMaster(); 23010612SMarco.Elver@ARM.com 23110612SMarco.Elver@ARM.com void recvRetrySlave(); 23210612SMarco.Elver@ARM.com 23310612SMarco.Elver@ARM.com void recvRangeChange(); 23410612SMarco.Elver@ARM.com 23510612SMarco.Elver@ARM.com bool warnOnly; 23610612SMarco.Elver@ARM.com 23710612SMarco.Elver@ARM.com MemChecker *memchecker; 23810612SMarco.Elver@ARM.com}; 23910612SMarco.Elver@ARM.com 24010612SMarco.Elver@ARM.com#endif //__MEM_MEM_CHECKER_MONITOR_HH__ 241