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