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