mem_checker_monitor.cc revision 11793:ef606668d247
13569Sgblack@eecs.umich.edu/* 23569Sgblack@eecs.umich.edu * Copyright (c) 2012-2014 ARM Limited 33569Sgblack@eecs.umich.edu * All rights reserved 43569Sgblack@eecs.umich.edu * 53569Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 63569Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 73569Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 83569Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 93569Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 103569Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 113569Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 123569Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 133569Sgblack@eecs.umich.edu * 143569Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 153569Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 163569Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 173569Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 183569Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 193569Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 203569Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 213569Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 223569Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 233569Sgblack@eecs.umich.edu * this software without specific prior written permission. 243569Sgblack@eecs.umich.edu * 253569Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 263569Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 273569Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 283804Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 293569Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 303569Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3111793Sbrandon.potter@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3211793Sbrandon.potter@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 333918Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 343918Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 353804Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 367678Sgblack@eecs.umich.edu * 376335Sgblack@eecs.umich.edu * Authors: Thomas Grass 383824Ssaidi@eecs.umich.edu * Andreas Hansson 3912620Sgabeblack@google.com * Marco Elver 403811Ssaidi@eecs.umich.edu */ 418229Snate@binkert.org 423811Ssaidi@eecs.umich.edu#include "mem/mem_checker_monitor.hh" 438232Snate@binkert.org 448232Snate@binkert.org#include <memory> 453823Ssaidi@eecs.umich.edu 463823Ssaidi@eecs.umich.edu#include "base/output.hh" 478751Sgblack@eecs.umich.edu#include "base/trace.hh" 484103Ssaidi@eecs.umich.edu#include "debug/MemCheckerMonitor.hh" 493569Sgblack@eecs.umich.edu 503804Ssaidi@eecs.umich.eduusing namespace std; 513804Ssaidi@eecs.umich.edu 524088Sbinkertn@umich.eduMemCheckerMonitor::MemCheckerMonitor(Params* params) 533569Sgblack@eecs.umich.edu : MemObject(params), 545034Smilesck@eecs.umich.edu masterPort(name() + "-master", *this), 555358Sgblack@eecs.umich.edu slavePort(name() + "-slave", *this), 568374Sksewell@umich.edu warnOnly(params->warn_only), 573804Ssaidi@eecs.umich.edu memchecker(params->memchecker) 583804Ssaidi@eecs.umich.edu{} 593804Ssaidi@eecs.umich.edu 605555Snate@binkert.orgMemCheckerMonitor::~MemCheckerMonitor() 613569Sgblack@eecs.umich.edu{} 623804Ssaidi@eecs.umich.edu 633918Ssaidi@eecs.umich.eduMemCheckerMonitor* 643881Ssaidi@eecs.umich.eduMemCheckerMonitorParams::create() 653881Ssaidi@eecs.umich.edu{ 663881Ssaidi@eecs.umich.edu return new MemCheckerMonitor(this); 674990Sgblack@eecs.umich.edu} 684990Sgblack@eecs.umich.edu 694990Sgblack@eecs.umich.eduvoid 704990Sgblack@eecs.umich.eduMemCheckerMonitor::init() 714990Sgblack@eecs.umich.edu{ 724990Sgblack@eecs.umich.edu // make sure both sides of the monitor are connected 734990Sgblack@eecs.umich.edu if (!slavePort.isConnected() || !masterPort.isConnected()) 744990Sgblack@eecs.umich.edu fatal("Communication monitor is not connected on both sides.\n"); 754990Sgblack@eecs.umich.edu} 766022Sgblack@eecs.umich.edu 776022Sgblack@eecs.umich.eduBaseMasterPort& 786022Sgblack@eecs.umich.eduMemCheckerMonitor::getMasterPort(const std::string& if_name, PortID idx) 793804Ssaidi@eecs.umich.edu{ 803569Sgblack@eecs.umich.edu if (if_name == "master" || if_name == "mem_side") { 813804Ssaidi@eecs.umich.edu return masterPort; 823804Ssaidi@eecs.umich.edu } else { 833804Ssaidi@eecs.umich.edu return MemObject::getMasterPort(if_name, idx); 843804Ssaidi@eecs.umich.edu } 853881Ssaidi@eecs.umich.edu} 863804Ssaidi@eecs.umich.edu 873804Ssaidi@eecs.umich.eduBaseSlavePort& 883804Ssaidi@eecs.umich.eduMemCheckerMonitor::getSlavePort(const std::string& if_name, PortID idx) 893804Ssaidi@eecs.umich.edu{ 903804Ssaidi@eecs.umich.edu if (if_name == "slave" || if_name == "cpu_side") { 913804Ssaidi@eecs.umich.edu return slavePort; 923804Ssaidi@eecs.umich.edu } else { 933569Sgblack@eecs.umich.edu return MemObject::getSlavePort(if_name, idx); 943569Sgblack@eecs.umich.edu } 953804Ssaidi@eecs.umich.edu} 963804Ssaidi@eecs.umich.edu 973826Ssaidi@eecs.umich.eduvoid 983804Ssaidi@eecs.umich.eduMemCheckerMonitor::recvFunctional(PacketPtr pkt) 993804Ssaidi@eecs.umich.edu{ 1003826Ssaidi@eecs.umich.edu Addr addr = pkt->getAddr(); 1013907Ssaidi@eecs.umich.edu unsigned size = pkt->getSize(); 1023826Ssaidi@eecs.umich.edu 1033811Ssaidi@eecs.umich.edu // Conservatively reset this address-range. Alternatively we could try to 1043836Ssaidi@eecs.umich.edu // update the values seen by the memchecker, however, there may be other 1053915Ssaidi@eecs.umich.edu // reads/writes to these location from other devices we do not see. 1063907Ssaidi@eecs.umich.edu memchecker->reset(addr, size); 1073881Ssaidi@eecs.umich.edu 1083881Ssaidi@eecs.umich.edu masterPort.sendFunctional(pkt); 1093881Ssaidi@eecs.umich.edu 1103881Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 1113907Ssaidi@eecs.umich.edu "Forwarded functional access: addr = %#llx, size = %d\n", 1123881Ssaidi@eecs.umich.edu addr, size); 1135555Snate@binkert.org} 1145555Snate@binkert.org 1155555Snate@binkert.orgvoid 1163881Ssaidi@eecs.umich.eduMemCheckerMonitor::recvFunctionalSnoop(PacketPtr pkt) 1173881Ssaidi@eecs.umich.edu{ 1183907Ssaidi@eecs.umich.edu Addr addr = pkt->getAddr(); 1193907Ssaidi@eecs.umich.edu unsigned size = pkt->getSize(); 1203907Ssaidi@eecs.umich.edu 1213907Ssaidi@eecs.umich.edu // See above. 1223907Ssaidi@eecs.umich.edu memchecker->reset(addr, size); 1233907Ssaidi@eecs.umich.edu 1243907Ssaidi@eecs.umich.edu slavePort.sendFunctionalSnoop(pkt); 1253907Ssaidi@eecs.umich.edu 1263907Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 1273907Ssaidi@eecs.umich.edu "Received functional snoop: addr = %#llx, size = %d\n", 1283907Ssaidi@eecs.umich.edu addr, size); 1293907Ssaidi@eecs.umich.edu} 1303907Ssaidi@eecs.umich.edu 1313907Ssaidi@eecs.umich.eduTick 1323907Ssaidi@eecs.umich.eduMemCheckerMonitor::recvAtomic(PacketPtr pkt) 1333907Ssaidi@eecs.umich.edu{ 1343907Ssaidi@eecs.umich.edu assert(false && "Atomic not supported"); 1353907Ssaidi@eecs.umich.edu return masterPort.sendAtomic(pkt); 1363907Ssaidi@eecs.umich.edu} 1373907Ssaidi@eecs.umich.edu 1383907Ssaidi@eecs.umich.eduTick 1393826Ssaidi@eecs.umich.eduMemCheckerMonitor::recvAtomicSnoop(PacketPtr pkt) 1403826Ssaidi@eecs.umich.edu{ 1413826Ssaidi@eecs.umich.edu assert(false && "Atomic not supported"); 1423826Ssaidi@eecs.umich.edu return slavePort.sendAtomicSnoop(pkt); 1433881Ssaidi@eecs.umich.edu} 1443881Ssaidi@eecs.umich.edu 1453881Ssaidi@eecs.umich.edubool 1463881Ssaidi@eecs.umich.eduMemCheckerMonitor::recvTimingReq(PacketPtr pkt) 1473881Ssaidi@eecs.umich.edu{ 1483881Ssaidi@eecs.umich.edu // should always see a request 1493881Ssaidi@eecs.umich.edu assert(pkt->isRequest()); 1503881Ssaidi@eecs.umich.edu 1513881Ssaidi@eecs.umich.edu // Store relevant fields of packet, because packet may be modified 1523881Ssaidi@eecs.umich.edu // or even deleted when sendTiming() is called. 1533881Ssaidi@eecs.umich.edu // 1543881Ssaidi@eecs.umich.edu // For reads we are only interested in real reads, and not prefetches, as 1553881Ssaidi@eecs.umich.edu // it is not guaranteed that the prefetch returns any useful data. 1563881Ssaidi@eecs.umich.edu bool is_read = pkt->isRead() && !pkt->req->isPrefetch(); 1573569Sgblack@eecs.umich.edu bool is_write = pkt->isWrite(); 1583569Sgblack@eecs.umich.edu unsigned size = pkt->getSize(); 1593881Ssaidi@eecs.umich.edu Addr addr = pkt->getAddr(); 1603804Ssaidi@eecs.umich.edu bool expects_response = pkt->needsResponse() && !pkt->cacheResponding(); 1613881Ssaidi@eecs.umich.edu std::unique_ptr<uint8_t[]> pkt_data; 1623826Ssaidi@eecs.umich.edu MemCheckerMonitorSenderState* state = NULL; 1633881Ssaidi@eecs.umich.edu 1643881Ssaidi@eecs.umich.edu if (expects_response && is_write) { 1653881Ssaidi@eecs.umich.edu // On receipt of a request, only need to allocate pkt_data if this is a 1663907Ssaidi@eecs.umich.edu // write. For reads, we have no data yet, so it doesn't make sense to 1673907Ssaidi@eecs.umich.edu // allocate. 1683929Ssaidi@eecs.umich.edu pkt_data.reset(new uint8_t[size]); 1693929Ssaidi@eecs.umich.edu memcpy(pkt_data.get(), pkt->getConstPtr<uint8_t*>(), size); 1703907Ssaidi@eecs.umich.edu } 1713907Ssaidi@eecs.umich.edu 1723804Ssaidi@eecs.umich.edu // If a cache miss is served by a cache, a monitor near the memory 1733804Ssaidi@eecs.umich.edu // would see a request which needs a response, but this response 1743881Ssaidi@eecs.umich.edu // would not come back from the memory. Therefore 1753804Ssaidi@eecs.umich.edu // we additionally have to check the inhibit flag. 1763804Ssaidi@eecs.umich.edu if (expects_response && (is_read || is_write)) { 1773804Ssaidi@eecs.umich.edu state = new MemCheckerMonitorSenderState(0); 1783804Ssaidi@eecs.umich.edu pkt->pushSenderState(state); 1793804Ssaidi@eecs.umich.edu } 1803804Ssaidi@eecs.umich.edu 1813804Ssaidi@eecs.umich.edu // Attempt to send the packet 1823569Sgblack@eecs.umich.edu bool successful = masterPort.sendTimingReq(pkt); 1833863Ssaidi@eecs.umich.edu 1843863Ssaidi@eecs.umich.edu // If not successful, restore the sender state 1853804Ssaidi@eecs.umich.edu if (!successful && expects_response && (is_read || is_write)) { 1865555Snate@binkert.org delete pkt->popSenderState(); 1875555Snate@binkert.org } 1883804Ssaidi@eecs.umich.edu 1893804Ssaidi@eecs.umich.edu if (successful && expects_response) { 1903804Ssaidi@eecs.umich.edu if (is_read) { 1913804Ssaidi@eecs.umich.edu MemChecker::Serial serial = memchecker->startRead(curTick(), 1923804Ssaidi@eecs.umich.edu addr, 1933569Sgblack@eecs.umich.edu size); 1943804Ssaidi@eecs.umich.edu 1953804Ssaidi@eecs.umich.edu // At the time where we push the sender-state, we do not yet know 1963804Ssaidi@eecs.umich.edu // the serial the MemChecker class will assign to this request. We 1975555Snate@binkert.org // cannot call startRead at the time we push the sender-state, as 1985555Snate@binkert.org // the masterPort may not be successful in executing sendTimingReq, 1993804Ssaidi@eecs.umich.edu // and in case of a failure, we must not modify the state of the 2003804Ssaidi@eecs.umich.edu // MemChecker. 2013804Ssaidi@eecs.umich.edu // 2023804Ssaidi@eecs.umich.edu // Once we know that sendTimingReq was successful, we can set the 2033804Ssaidi@eecs.umich.edu // serial of the newly constructed sender-state. This is legal, as 2043811Ssaidi@eecs.umich.edu // we know that nobody else will touch nor is responsible for 2053811Ssaidi@eecs.umich.edu // deletion of our sender-state. 2063804Ssaidi@eecs.umich.edu state->serial = serial; 2073804Ssaidi@eecs.umich.edu 2085312Sgblack@eecs.umich.edu DPRINTF(MemCheckerMonitor, 2093804Ssaidi@eecs.umich.edu "Forwarded read request: serial = %d, addr = %#llx, " 2103804Ssaidi@eecs.umich.edu "size = %d\n", 2113804Ssaidi@eecs.umich.edu serial, addr, size); 2123804Ssaidi@eecs.umich.edu } else if (is_write) { 2133804Ssaidi@eecs.umich.edu MemChecker::Serial serial = memchecker->startWrite(curTick(), 2143804Ssaidi@eecs.umich.edu addr, 2153804Ssaidi@eecs.umich.edu size, 2163811Ssaidi@eecs.umich.edu pkt_data.get()); 2173804Ssaidi@eecs.umich.edu 2183804Ssaidi@eecs.umich.edu state->serial = serial; 2193804Ssaidi@eecs.umich.edu 2203804Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 2213804Ssaidi@eecs.umich.edu "Forwarded write request: serial = %d, addr = %#llx, " 2223826Ssaidi@eecs.umich.edu "size = %d\n", 2233826Ssaidi@eecs.umich.edu serial, addr, size); 2244070Ssaidi@eecs.umich.edu } else { 2255555Snate@binkert.org DPRINTF(MemCheckerMonitor, 2265555Snate@binkert.org "Forwarded non read/write request: addr = %#llx\n", addr); 2274070Ssaidi@eecs.umich.edu } 2283804Ssaidi@eecs.umich.edu } else if (successful) { 2293804Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 2303804Ssaidi@eecs.umich.edu "Forwarded request marked for cache response: addr = %#llx\n", 2313804Ssaidi@eecs.umich.edu addr); 2323804Ssaidi@eecs.umich.edu } 2333804Ssaidi@eecs.umich.edu 2343804Ssaidi@eecs.umich.edu return successful; 2353804Ssaidi@eecs.umich.edu} 2363804Ssaidi@eecs.umich.edu 2373804Ssaidi@eecs.umich.edubool 2383804Ssaidi@eecs.umich.eduMemCheckerMonitor::recvTimingResp(PacketPtr pkt) 2393804Ssaidi@eecs.umich.edu{ 2403826Ssaidi@eecs.umich.edu // should always see responses 2413826Ssaidi@eecs.umich.edu assert(pkt->isResponse()); 2423826Ssaidi@eecs.umich.edu 2433863Ssaidi@eecs.umich.edu // Store relevant fields of packet, because packet may be modified 2443826Ssaidi@eecs.umich.edu // or even deleted when sendTiming() is called. 2453826Ssaidi@eecs.umich.edu bool is_read = pkt->isRead() && !pkt->req->isPrefetch(); 2463826Ssaidi@eecs.umich.edu bool is_write = pkt->isWrite(); 2473826Ssaidi@eecs.umich.edu bool is_failed_LLSC = pkt->isLLSC() && pkt->req->getExtraData() == 0; 2483826Ssaidi@eecs.umich.edu unsigned size = pkt->getSize(); 2493826Ssaidi@eecs.umich.edu Addr addr = pkt->getAddr(); 2503826Ssaidi@eecs.umich.edu std::unique_ptr<uint8_t[]> pkt_data; 2513826Ssaidi@eecs.umich.edu MemCheckerMonitorSenderState* received_state = NULL; 2523826Ssaidi@eecs.umich.edu 2533804Ssaidi@eecs.umich.edu if (is_read) { 2543804Ssaidi@eecs.umich.edu // On receipt of a response, only need to allocate pkt_data if this is 2553804Ssaidi@eecs.umich.edu // a read. For writes, we have already given the MemChecker the data on 2563804Ssaidi@eecs.umich.edu // the request, so it doesn't make sense to allocate on write. 2573804Ssaidi@eecs.umich.edu pkt_data.reset(new uint8_t[size]); 2583804Ssaidi@eecs.umich.edu memcpy(pkt_data.get(), pkt->getConstPtr<uint8_t*>(), size); 2593804Ssaidi@eecs.umich.edu } 2603863Ssaidi@eecs.umich.edu 2613863Ssaidi@eecs.umich.edu if (is_read || is_write) { 2623863Ssaidi@eecs.umich.edu received_state = 2633836Ssaidi@eecs.umich.edu dynamic_cast<MemCheckerMonitorSenderState*>(pkt->senderState); 2643836Ssaidi@eecs.umich.edu 2653804Ssaidi@eecs.umich.edu // Restore initial sender state 2663804Ssaidi@eecs.umich.edu panic_if(received_state == NULL, 2675312Sgblack@eecs.umich.edu "Monitor got a response without monitor sender state\n"); 2683804Ssaidi@eecs.umich.edu 2693804Ssaidi@eecs.umich.edu // Restore the state 2703804Ssaidi@eecs.umich.edu pkt->senderState = received_state->predecessor; 2713804Ssaidi@eecs.umich.edu } 2723804Ssaidi@eecs.umich.edu 2733804Ssaidi@eecs.umich.edu // Attempt to send the packet 2743804Ssaidi@eecs.umich.edu bool successful = slavePort.sendTimingResp(pkt); 2753863Ssaidi@eecs.umich.edu 2763804Ssaidi@eecs.umich.edu // If packet successfully send, complete transaction in MemChecker 2773804Ssaidi@eecs.umich.edu // instance, and delete sender state, otherwise restore state. 2783804Ssaidi@eecs.umich.edu if (successful) { 2793804Ssaidi@eecs.umich.edu if (is_read) { 2803804Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 2813881Ssaidi@eecs.umich.edu "Received read response: serial = %d, addr = %#llx, " 2823804Ssaidi@eecs.umich.edu "size = %d\n", 2833804Ssaidi@eecs.umich.edu received_state->serial, addr, size); 2843804Ssaidi@eecs.umich.edu 2853804Ssaidi@eecs.umich.edu bool result = memchecker->completeRead(received_state->serial, 2863804Ssaidi@eecs.umich.edu curTick(), 2873804Ssaidi@eecs.umich.edu addr, 2883804Ssaidi@eecs.umich.edu size, 2893863Ssaidi@eecs.umich.edu pkt_data.get()); 2903863Ssaidi@eecs.umich.edu 2913836Ssaidi@eecs.umich.edu if (!result) { 2925555Snate@binkert.org warn("%s: read of %#llx @ cycle %d failed:\n%s\n", 2933804Ssaidi@eecs.umich.edu name(), 2943804Ssaidi@eecs.umich.edu addr, curTick(), 29510231Ssteve.reinhardt@amd.com memchecker->getErrorMessage().c_str()); 2963881Ssaidi@eecs.umich.edu 2973881Ssaidi@eecs.umich.edu panic_if(!warnOnly, "MemChecker violation!"); 2983804Ssaidi@eecs.umich.edu } 2993804Ssaidi@eecs.umich.edu 3003804Ssaidi@eecs.umich.edu delete received_state; 3013804Ssaidi@eecs.umich.edu } else if (is_write) { 3023804Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 3033804Ssaidi@eecs.umich.edu "Received write response: serial = %d, addr = %#llx, " 3043804Ssaidi@eecs.umich.edu "size = %d\n", 3053804Ssaidi@eecs.umich.edu received_state->serial, addr, size); 3063804Ssaidi@eecs.umich.edu 3073804Ssaidi@eecs.umich.edu if (is_failed_LLSC) { 3083804Ssaidi@eecs.umich.edu // The write was not successful, let MemChecker know. 3093804Ssaidi@eecs.umich.edu memchecker->abortWrite(received_state->serial, 3103804Ssaidi@eecs.umich.edu addr, 3113863Ssaidi@eecs.umich.edu size); 3123836Ssaidi@eecs.umich.edu } else { 3135555Snate@binkert.org memchecker->completeWrite(received_state->serial, 3145288Sgblack@eecs.umich.edu curTick(), 3155288Sgblack@eecs.umich.edu addr, 3165288Sgblack@eecs.umich.edu size); 3173804Ssaidi@eecs.umich.edu } 3183804Ssaidi@eecs.umich.edu 3193804Ssaidi@eecs.umich.edu delete received_state; 3203804Ssaidi@eecs.umich.edu } else { 3213804Ssaidi@eecs.umich.edu DPRINTF(MemCheckerMonitor, 3223804Ssaidi@eecs.umich.edu "Received non read/write response: addr = %#llx\n", addr); 3233804Ssaidi@eecs.umich.edu } 3243804Ssaidi@eecs.umich.edu } else if (is_read || is_write) { 3253804Ssaidi@eecs.umich.edu // Don't delete anything and let the packet look like we 3263804Ssaidi@eecs.umich.edu // did not touch it 3273804Ssaidi@eecs.umich.edu pkt->senderState = received_state; 3289423SAndreas.Sandberg@arm.com } 3293804Ssaidi@eecs.umich.edu 3303836Ssaidi@eecs.umich.edu return successful; 3315555Snate@binkert.org} 3323836Ssaidi@eecs.umich.edu 3335555Snate@binkert.orgvoid 33410231Ssteve.reinhardt@amd.comMemCheckerMonitor::recvTimingSnoopReq(PacketPtr pkt) 3353881Ssaidi@eecs.umich.edu{ 3363804Ssaidi@eecs.umich.edu slavePort.sendTimingSnoopReq(pkt); 3373907Ssaidi@eecs.umich.edu} 3383804Ssaidi@eecs.umich.edu 3393804Ssaidi@eecs.umich.edubool 3403804Ssaidi@eecs.umich.eduMemCheckerMonitor::recvTimingSnoopResp(PacketPtr pkt) 3413804Ssaidi@eecs.umich.edu{ 3423804Ssaidi@eecs.umich.edu return masterPort.sendTimingSnoopResp(pkt); 3435555Snate@binkert.org} 3445555Snate@binkert.org 3453881Ssaidi@eecs.umich.edubool 3463881Ssaidi@eecs.umich.eduMemCheckerMonitor::isSnooping() const 3473881Ssaidi@eecs.umich.edu{ 3483804Ssaidi@eecs.umich.edu // check if the connected master port is snooping 3493881Ssaidi@eecs.umich.edu return slavePort.isSnooping(); 3503881Ssaidi@eecs.umich.edu} 3513881Ssaidi@eecs.umich.edu 3523881Ssaidi@eecs.umich.eduAddrRangeList 3533804Ssaidi@eecs.umich.eduMemCheckerMonitor::getAddrRanges() const 3543804Ssaidi@eecs.umich.edu{ 3553804Ssaidi@eecs.umich.edu // get the address ranges of the connected slave port 3565555Snate@binkert.org return masterPort.getAddrRanges(); 3575555Snate@binkert.org} 3583804Ssaidi@eecs.umich.edu 3593804Ssaidi@eecs.umich.eduvoid 3603881Ssaidi@eecs.umich.eduMemCheckerMonitor::recvReqRetry() 3613881Ssaidi@eecs.umich.edu{ 3623804Ssaidi@eecs.umich.edu slavePort.sendRetryReq(); 3633881Ssaidi@eecs.umich.edu} 3643881Ssaidi@eecs.umich.edu 3653881Ssaidi@eecs.umich.eduvoid 3663804Ssaidi@eecs.umich.eduMemCheckerMonitor::recvRespRetry() 3673804Ssaidi@eecs.umich.edu{ 3683804Ssaidi@eecs.umich.edu masterPort.sendRetryResp(); 3693804Ssaidi@eecs.umich.edu} 3703804Ssaidi@eecs.umich.edu 3713804Ssaidi@eecs.umich.eduvoid 3723804Ssaidi@eecs.umich.eduMemCheckerMonitor::recvRangeChange() 3733804Ssaidi@eecs.umich.edu{ 3743804Ssaidi@eecs.umich.edu slavePort.sendRangeChange(); 3753804Ssaidi@eecs.umich.edu} 3763804Ssaidi@eecs.umich.edu