mem_checker_monitor.cc revision 13449
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 4211793Sbrandon.potter@amd.com#include "mem/mem_checker_monitor.hh" 4311793Sbrandon.potter@amd.com 4410612SMarco.Elver@ARM.com#include <memory> 4510612SMarco.Elver@ARM.com 4613449Sgabeblack@google.com#include "base/logging.hh" 4710612SMarco.Elver@ARM.com#include "base/output.hh" 4810612SMarco.Elver@ARM.com#include "base/trace.hh" 4910612SMarco.Elver@ARM.com#include "debug/MemCheckerMonitor.hh" 5010612SMarco.Elver@ARM.com 5110612SMarco.Elver@ARM.comMemCheckerMonitor::MemCheckerMonitor(Params* params) 5210612SMarco.Elver@ARM.com : MemObject(params), 5310612SMarco.Elver@ARM.com masterPort(name() + "-master", *this), 5410612SMarco.Elver@ARM.com slavePort(name() + "-slave", *this), 5510612SMarco.Elver@ARM.com warnOnly(params->warn_only), 5610612SMarco.Elver@ARM.com memchecker(params->memchecker) 5710612SMarco.Elver@ARM.com{} 5810612SMarco.Elver@ARM.com 5910612SMarco.Elver@ARM.comMemCheckerMonitor::~MemCheckerMonitor() 6010612SMarco.Elver@ARM.com{} 6110612SMarco.Elver@ARM.com 6210612SMarco.Elver@ARM.comMemCheckerMonitor* 6310612SMarco.Elver@ARM.comMemCheckerMonitorParams::create() 6410612SMarco.Elver@ARM.com{ 6510612SMarco.Elver@ARM.com return new MemCheckerMonitor(this); 6610612SMarco.Elver@ARM.com} 6710612SMarco.Elver@ARM.com 6810612SMarco.Elver@ARM.comvoid 6910612SMarco.Elver@ARM.comMemCheckerMonitor::init() 7010612SMarco.Elver@ARM.com{ 7110612SMarco.Elver@ARM.com // make sure both sides of the monitor are connected 7210612SMarco.Elver@ARM.com if (!slavePort.isConnected() || !masterPort.isConnected()) 7310612SMarco.Elver@ARM.com fatal("Communication monitor is not connected on both sides.\n"); 7410612SMarco.Elver@ARM.com} 7510612SMarco.Elver@ARM.com 7610612SMarco.Elver@ARM.comBaseMasterPort& 7710612SMarco.Elver@ARM.comMemCheckerMonitor::getMasterPort(const std::string& if_name, PortID idx) 7810612SMarco.Elver@ARM.com{ 7910612SMarco.Elver@ARM.com if (if_name == "master" || if_name == "mem_side") { 8010612SMarco.Elver@ARM.com return masterPort; 8110612SMarco.Elver@ARM.com } else { 8210612SMarco.Elver@ARM.com return MemObject::getMasterPort(if_name, idx); 8310612SMarco.Elver@ARM.com } 8410612SMarco.Elver@ARM.com} 8510612SMarco.Elver@ARM.com 8610612SMarco.Elver@ARM.comBaseSlavePort& 8710612SMarco.Elver@ARM.comMemCheckerMonitor::getSlavePort(const std::string& if_name, PortID idx) 8810612SMarco.Elver@ARM.com{ 8910612SMarco.Elver@ARM.com if (if_name == "slave" || if_name == "cpu_side") { 9010612SMarco.Elver@ARM.com return slavePort; 9110612SMarco.Elver@ARM.com } else { 9210612SMarco.Elver@ARM.com return MemObject::getSlavePort(if_name, idx); 9310612SMarco.Elver@ARM.com } 9410612SMarco.Elver@ARM.com} 9510612SMarco.Elver@ARM.com 9610612SMarco.Elver@ARM.comvoid 9710612SMarco.Elver@ARM.comMemCheckerMonitor::recvFunctional(PacketPtr pkt) 9810612SMarco.Elver@ARM.com{ 9910612SMarco.Elver@ARM.com Addr addr = pkt->getAddr(); 10010612SMarco.Elver@ARM.com unsigned size = pkt->getSize(); 10110612SMarco.Elver@ARM.com 10210612SMarco.Elver@ARM.com // Conservatively reset this address-range. Alternatively we could try to 10310612SMarco.Elver@ARM.com // update the values seen by the memchecker, however, there may be other 10410612SMarco.Elver@ARM.com // reads/writes to these location from other devices we do not see. 10510612SMarco.Elver@ARM.com memchecker->reset(addr, size); 10610612SMarco.Elver@ARM.com 10710612SMarco.Elver@ARM.com masterPort.sendFunctional(pkt); 10810612SMarco.Elver@ARM.com 10910612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 11010612SMarco.Elver@ARM.com "Forwarded functional access: addr = %#llx, size = %d\n", 11110612SMarco.Elver@ARM.com addr, size); 11210612SMarco.Elver@ARM.com} 11310612SMarco.Elver@ARM.com 11410612SMarco.Elver@ARM.comvoid 11510612SMarco.Elver@ARM.comMemCheckerMonitor::recvFunctionalSnoop(PacketPtr pkt) 11610612SMarco.Elver@ARM.com{ 11710612SMarco.Elver@ARM.com Addr addr = pkt->getAddr(); 11810612SMarco.Elver@ARM.com unsigned size = pkt->getSize(); 11910612SMarco.Elver@ARM.com 12010612SMarco.Elver@ARM.com // See above. 12110612SMarco.Elver@ARM.com memchecker->reset(addr, size); 12210612SMarco.Elver@ARM.com 12310612SMarco.Elver@ARM.com slavePort.sendFunctionalSnoop(pkt); 12410612SMarco.Elver@ARM.com 12510612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 12610612SMarco.Elver@ARM.com "Received functional snoop: addr = %#llx, size = %d\n", 12710612SMarco.Elver@ARM.com addr, size); 12810612SMarco.Elver@ARM.com} 12910612SMarco.Elver@ARM.com 13010612SMarco.Elver@ARM.comTick 13110612SMarco.Elver@ARM.comMemCheckerMonitor::recvAtomic(PacketPtr pkt) 13210612SMarco.Elver@ARM.com{ 13313449Sgabeblack@google.com panic("Atomic not supported"); 13410612SMarco.Elver@ARM.com} 13510612SMarco.Elver@ARM.com 13610612SMarco.Elver@ARM.comTick 13710612SMarco.Elver@ARM.comMemCheckerMonitor::recvAtomicSnoop(PacketPtr pkt) 13810612SMarco.Elver@ARM.com{ 13913449Sgabeblack@google.com panic("Atomic not supported"); 14010612SMarco.Elver@ARM.com} 14110612SMarco.Elver@ARM.com 14210612SMarco.Elver@ARM.combool 14310612SMarco.Elver@ARM.comMemCheckerMonitor::recvTimingReq(PacketPtr pkt) 14410612SMarco.Elver@ARM.com{ 14510612SMarco.Elver@ARM.com // should always see a request 14610612SMarco.Elver@ARM.com assert(pkt->isRequest()); 14710612SMarco.Elver@ARM.com 14810612SMarco.Elver@ARM.com // Store relevant fields of packet, because packet may be modified 14910612SMarco.Elver@ARM.com // or even deleted when sendTiming() is called. 15010612SMarco.Elver@ARM.com // 15110612SMarco.Elver@ARM.com // For reads we are only interested in real reads, and not prefetches, as 15210612SMarco.Elver@ARM.com // it is not guaranteed that the prefetch returns any useful data. 15310612SMarco.Elver@ARM.com bool is_read = pkt->isRead() && !pkt->req->isPrefetch(); 15410612SMarco.Elver@ARM.com bool is_write = pkt->isWrite(); 15510612SMarco.Elver@ARM.com unsigned size = pkt->getSize(); 15610612SMarco.Elver@ARM.com Addr addr = pkt->getAddr(); 15711284Sandreas.hansson@arm.com bool expects_response = pkt->needsResponse() && !pkt->cacheResponding(); 15811489Sandreas.hansson@arm.com std::unique_ptr<uint8_t[]> pkt_data; 15910612SMarco.Elver@ARM.com MemCheckerMonitorSenderState* state = NULL; 16010612SMarco.Elver@ARM.com 16110612SMarco.Elver@ARM.com if (expects_response && is_write) { 16210612SMarco.Elver@ARM.com // On receipt of a request, only need to allocate pkt_data if this is a 16310612SMarco.Elver@ARM.com // write. For reads, we have no data yet, so it doesn't make sense to 16410612SMarco.Elver@ARM.com // allocate. 16510612SMarco.Elver@ARM.com pkt_data.reset(new uint8_t[size]); 16613377Sodanrc@yahoo.com.br pkt->writeData(pkt_data.get()); 16710612SMarco.Elver@ARM.com } 16810612SMarco.Elver@ARM.com 16910612SMarco.Elver@ARM.com // If a cache miss is served by a cache, a monitor near the memory 17010612SMarco.Elver@ARM.com // would see a request which needs a response, but this response 17111284Sandreas.hansson@arm.com // would not come back from the memory. Therefore 17210612SMarco.Elver@ARM.com // we additionally have to check the inhibit flag. 17310612SMarco.Elver@ARM.com if (expects_response && (is_read || is_write)) { 17410612SMarco.Elver@ARM.com state = new MemCheckerMonitorSenderState(0); 17510612SMarco.Elver@ARM.com pkt->pushSenderState(state); 17610612SMarco.Elver@ARM.com } 17710612SMarco.Elver@ARM.com 17811284Sandreas.hansson@arm.com // Attempt to send the packet 17910612SMarco.Elver@ARM.com bool successful = masterPort.sendTimingReq(pkt); 18010612SMarco.Elver@ARM.com 18110612SMarco.Elver@ARM.com // If not successful, restore the sender state 18210612SMarco.Elver@ARM.com if (!successful && expects_response && (is_read || is_write)) { 18310612SMarco.Elver@ARM.com delete pkt->popSenderState(); 18410612SMarco.Elver@ARM.com } 18510612SMarco.Elver@ARM.com 18610612SMarco.Elver@ARM.com if (successful && expects_response) { 18710612SMarco.Elver@ARM.com if (is_read) { 18810612SMarco.Elver@ARM.com MemChecker::Serial serial = memchecker->startRead(curTick(), 18910612SMarco.Elver@ARM.com addr, 19010612SMarco.Elver@ARM.com size); 19110612SMarco.Elver@ARM.com 19210612SMarco.Elver@ARM.com // At the time where we push the sender-state, we do not yet know 19310612SMarco.Elver@ARM.com // the serial the MemChecker class will assign to this request. We 19410612SMarco.Elver@ARM.com // cannot call startRead at the time we push the sender-state, as 19510612SMarco.Elver@ARM.com // the masterPort may not be successful in executing sendTimingReq, 19610612SMarco.Elver@ARM.com // and in case of a failure, we must not modify the state of the 19710612SMarco.Elver@ARM.com // MemChecker. 19810612SMarco.Elver@ARM.com // 19910612SMarco.Elver@ARM.com // Once we know that sendTimingReq was successful, we can set the 20010612SMarco.Elver@ARM.com // serial of the newly constructed sender-state. This is legal, as 20110612SMarco.Elver@ARM.com // we know that nobody else will touch nor is responsible for 20210612SMarco.Elver@ARM.com // deletion of our sender-state. 20310612SMarco.Elver@ARM.com state->serial = serial; 20410612SMarco.Elver@ARM.com 20510612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 20610612SMarco.Elver@ARM.com "Forwarded read request: serial = %d, addr = %#llx, " 20710612SMarco.Elver@ARM.com "size = %d\n", 20810612SMarco.Elver@ARM.com serial, addr, size); 20910612SMarco.Elver@ARM.com } else if (is_write) { 21010612SMarco.Elver@ARM.com MemChecker::Serial serial = memchecker->startWrite(curTick(), 21110612SMarco.Elver@ARM.com addr, 21210612SMarco.Elver@ARM.com size, 21310612SMarco.Elver@ARM.com pkt_data.get()); 21410612SMarco.Elver@ARM.com 21510612SMarco.Elver@ARM.com state->serial = serial; 21610612SMarco.Elver@ARM.com 21710612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 21810612SMarco.Elver@ARM.com "Forwarded write request: serial = %d, addr = %#llx, " 21910612SMarco.Elver@ARM.com "size = %d\n", 22010612SMarco.Elver@ARM.com serial, addr, size); 22110612SMarco.Elver@ARM.com } else { 22210612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 22310612SMarco.Elver@ARM.com "Forwarded non read/write request: addr = %#llx\n", addr); 22410612SMarco.Elver@ARM.com } 22510612SMarco.Elver@ARM.com } else if (successful) { 22610612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 22711284Sandreas.hansson@arm.com "Forwarded request marked for cache response: addr = %#llx\n", 22811284Sandreas.hansson@arm.com addr); 22910612SMarco.Elver@ARM.com } 23010612SMarco.Elver@ARM.com 23110612SMarco.Elver@ARM.com return successful; 23210612SMarco.Elver@ARM.com} 23310612SMarco.Elver@ARM.com 23410612SMarco.Elver@ARM.combool 23510612SMarco.Elver@ARM.comMemCheckerMonitor::recvTimingResp(PacketPtr pkt) 23610612SMarco.Elver@ARM.com{ 23710612SMarco.Elver@ARM.com // should always see responses 23810612SMarco.Elver@ARM.com assert(pkt->isResponse()); 23910612SMarco.Elver@ARM.com 24010612SMarco.Elver@ARM.com // Store relevant fields of packet, because packet may be modified 24110612SMarco.Elver@ARM.com // or even deleted when sendTiming() is called. 24210612SMarco.Elver@ARM.com bool is_read = pkt->isRead() && !pkt->req->isPrefetch(); 24310612SMarco.Elver@ARM.com bool is_write = pkt->isWrite(); 24410612SMarco.Elver@ARM.com bool is_failed_LLSC = pkt->isLLSC() && pkt->req->getExtraData() == 0; 24510612SMarco.Elver@ARM.com unsigned size = pkt->getSize(); 24610612SMarco.Elver@ARM.com Addr addr = pkt->getAddr(); 24711489Sandreas.hansson@arm.com std::unique_ptr<uint8_t[]> pkt_data; 24810612SMarco.Elver@ARM.com MemCheckerMonitorSenderState* received_state = NULL; 24910612SMarco.Elver@ARM.com 25010612SMarco.Elver@ARM.com if (is_read) { 25110612SMarco.Elver@ARM.com // On receipt of a response, only need to allocate pkt_data if this is 25210612SMarco.Elver@ARM.com // a read. For writes, we have already given the MemChecker the data on 25310612SMarco.Elver@ARM.com // the request, so it doesn't make sense to allocate on write. 25410612SMarco.Elver@ARM.com pkt_data.reset(new uint8_t[size]); 25513377Sodanrc@yahoo.com.br pkt->writeData(pkt_data.get()); 25610612SMarco.Elver@ARM.com } 25710612SMarco.Elver@ARM.com 25810612SMarco.Elver@ARM.com if (is_read || is_write) { 25910612SMarco.Elver@ARM.com received_state = 26010612SMarco.Elver@ARM.com dynamic_cast<MemCheckerMonitorSenderState*>(pkt->senderState); 26110612SMarco.Elver@ARM.com 26210612SMarco.Elver@ARM.com // Restore initial sender state 26310612SMarco.Elver@ARM.com panic_if(received_state == NULL, 26410612SMarco.Elver@ARM.com "Monitor got a response without monitor sender state\n"); 26510612SMarco.Elver@ARM.com 26610612SMarco.Elver@ARM.com // Restore the state 26710612SMarco.Elver@ARM.com pkt->senderState = received_state->predecessor; 26810612SMarco.Elver@ARM.com } 26910612SMarco.Elver@ARM.com 27010612SMarco.Elver@ARM.com // Attempt to send the packet 27110612SMarco.Elver@ARM.com bool successful = slavePort.sendTimingResp(pkt); 27210612SMarco.Elver@ARM.com 27310612SMarco.Elver@ARM.com // If packet successfully send, complete transaction in MemChecker 27410612SMarco.Elver@ARM.com // instance, and delete sender state, otherwise restore state. 27510612SMarco.Elver@ARM.com if (successful) { 27610612SMarco.Elver@ARM.com if (is_read) { 27710612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 27810612SMarco.Elver@ARM.com "Received read response: serial = %d, addr = %#llx, " 27910612SMarco.Elver@ARM.com "size = %d\n", 28010612SMarco.Elver@ARM.com received_state->serial, addr, size); 28110612SMarco.Elver@ARM.com 28210612SMarco.Elver@ARM.com bool result = memchecker->completeRead(received_state->serial, 28310612SMarco.Elver@ARM.com curTick(), 28410612SMarco.Elver@ARM.com addr, 28510612SMarco.Elver@ARM.com size, 28610612SMarco.Elver@ARM.com pkt_data.get()); 28710612SMarco.Elver@ARM.com 28810612SMarco.Elver@ARM.com if (!result) { 28910612SMarco.Elver@ARM.com warn("%s: read of %#llx @ cycle %d failed:\n%s\n", 29010612SMarco.Elver@ARM.com name(), 29110612SMarco.Elver@ARM.com addr, curTick(), 29210612SMarco.Elver@ARM.com memchecker->getErrorMessage().c_str()); 29310612SMarco.Elver@ARM.com 29410612SMarco.Elver@ARM.com panic_if(!warnOnly, "MemChecker violation!"); 29510612SMarco.Elver@ARM.com } 29610612SMarco.Elver@ARM.com 29710612SMarco.Elver@ARM.com delete received_state; 29810612SMarco.Elver@ARM.com } else if (is_write) { 29910612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 30010612SMarco.Elver@ARM.com "Received write response: serial = %d, addr = %#llx, " 30110612SMarco.Elver@ARM.com "size = %d\n", 30210612SMarco.Elver@ARM.com received_state->serial, addr, size); 30310612SMarco.Elver@ARM.com 30410612SMarco.Elver@ARM.com if (is_failed_LLSC) { 30510612SMarco.Elver@ARM.com // The write was not successful, let MemChecker know. 30610612SMarco.Elver@ARM.com memchecker->abortWrite(received_state->serial, 30710612SMarco.Elver@ARM.com addr, 30810612SMarco.Elver@ARM.com size); 30910612SMarco.Elver@ARM.com } else { 31010612SMarco.Elver@ARM.com memchecker->completeWrite(received_state->serial, 31110612SMarco.Elver@ARM.com curTick(), 31210612SMarco.Elver@ARM.com addr, 31310612SMarco.Elver@ARM.com size); 31410612SMarco.Elver@ARM.com } 31510612SMarco.Elver@ARM.com 31610612SMarco.Elver@ARM.com delete received_state; 31710612SMarco.Elver@ARM.com } else { 31810612SMarco.Elver@ARM.com DPRINTF(MemCheckerMonitor, 31910612SMarco.Elver@ARM.com "Received non read/write response: addr = %#llx\n", addr); 32010612SMarco.Elver@ARM.com } 32110612SMarco.Elver@ARM.com } else if (is_read || is_write) { 32210612SMarco.Elver@ARM.com // Don't delete anything and let the packet look like we 32310612SMarco.Elver@ARM.com // did not touch it 32410612SMarco.Elver@ARM.com pkt->senderState = received_state; 32510612SMarco.Elver@ARM.com } 32610612SMarco.Elver@ARM.com 32710612SMarco.Elver@ARM.com return successful; 32810612SMarco.Elver@ARM.com} 32910612SMarco.Elver@ARM.com 33010612SMarco.Elver@ARM.comvoid 33110612SMarco.Elver@ARM.comMemCheckerMonitor::recvTimingSnoopReq(PacketPtr pkt) 33210612SMarco.Elver@ARM.com{ 33310612SMarco.Elver@ARM.com slavePort.sendTimingSnoopReq(pkt); 33410612SMarco.Elver@ARM.com} 33510612SMarco.Elver@ARM.com 33610612SMarco.Elver@ARM.combool 33710612SMarco.Elver@ARM.comMemCheckerMonitor::recvTimingSnoopResp(PacketPtr pkt) 33810612SMarco.Elver@ARM.com{ 33910612SMarco.Elver@ARM.com return masterPort.sendTimingSnoopResp(pkt); 34010612SMarco.Elver@ARM.com} 34110612SMarco.Elver@ARM.com 34210612SMarco.Elver@ARM.combool 34310612SMarco.Elver@ARM.comMemCheckerMonitor::isSnooping() const 34410612SMarco.Elver@ARM.com{ 34510612SMarco.Elver@ARM.com // check if the connected master port is snooping 34610612SMarco.Elver@ARM.com return slavePort.isSnooping(); 34710612SMarco.Elver@ARM.com} 34810612SMarco.Elver@ARM.com 34910612SMarco.Elver@ARM.comAddrRangeList 35010612SMarco.Elver@ARM.comMemCheckerMonitor::getAddrRanges() const 35110612SMarco.Elver@ARM.com{ 35210612SMarco.Elver@ARM.com // get the address ranges of the connected slave port 35310612SMarco.Elver@ARM.com return masterPort.getAddrRanges(); 35410612SMarco.Elver@ARM.com} 35510612SMarco.Elver@ARM.com 35610612SMarco.Elver@ARM.comvoid 35710713Sandreas.hansson@arm.comMemCheckerMonitor::recvReqRetry() 35810612SMarco.Elver@ARM.com{ 35910713Sandreas.hansson@arm.com slavePort.sendRetryReq(); 36010612SMarco.Elver@ARM.com} 36110612SMarco.Elver@ARM.com 36210612SMarco.Elver@ARM.comvoid 36310713Sandreas.hansson@arm.comMemCheckerMonitor::recvRespRetry() 36410612SMarco.Elver@ARM.com{ 36510713Sandreas.hansson@arm.com masterPort.sendRetryResp(); 36610612SMarco.Elver@ARM.com} 36710612SMarco.Elver@ARM.com 36810612SMarco.Elver@ARM.comvoid 36910612SMarco.Elver@ARM.comMemCheckerMonitor::recvRangeChange() 37010612SMarco.Elver@ARM.com{ 37110612SMarco.Elver@ARM.com slavePort.sendRangeChange(); 37210612SMarco.Elver@ARM.com} 373