mshr.cc revision 4665
110915Sandreas.sandberg@arm.com/*
211313Sandreas.sandberg@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan
310915Sandreas.sandberg@arm.com * All rights reserved.
410915Sandreas.sandberg@arm.com *
510915Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
610915Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
710915Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
810915Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
910915Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1010915Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1110915Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1210915Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1310915Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
1410915Sandreas.sandberg@arm.com * this software without specific prior written permission.
1510915Sandreas.sandberg@arm.com *
1610915Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710915Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810915Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910915Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010915Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110915Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210915Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310915Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410915Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510915Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610915Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710915Sandreas.sandberg@arm.com *
2810915Sandreas.sandberg@arm.com * Authors: Erik Hallnor
2910915Sandreas.sandberg@arm.com *          Dave Greene
3010915Sandreas.sandberg@arm.com */
3111313Sandreas.sandberg@arm.com
3211313Sandreas.sandberg@arm.com/**
3311313Sandreas.sandberg@arm.com * @file
3411313Sandreas.sandberg@arm.com * Miss Status and Handling Register (MSHR) definitions.
3510915Sandreas.sandberg@arm.com */
3610915Sandreas.sandberg@arm.com
3710915Sandreas.sandberg@arm.com#include <assert.h>
3810915Sandreas.sandberg@arm.com#include <string>
3910915Sandreas.sandberg@arm.com#include <vector>
4010915Sandreas.sandberg@arm.com
4110915Sandreas.sandberg@arm.com#include "mem/cache/miss/mshr.hh"
4210915Sandreas.sandberg@arm.com#include "sim/core.hh" // for curTick
4310915Sandreas.sandberg@arm.com#include "sim/host.hh"
4410915Sandreas.sandberg@arm.com#include "base/misc.hh"
4510915Sandreas.sandberg@arm.com#include "mem/cache/cache.hh"
4610915Sandreas.sandberg@arm.com
4710915Sandreas.sandberg@arm.comusing namespace std;
4810915Sandreas.sandberg@arm.com
4910915Sandreas.sandberg@arm.comMSHR::MSHR()
5010915Sandreas.sandberg@arm.com{
5110915Sandreas.sandberg@arm.com    inService = false;
5210915Sandreas.sandberg@arm.com    ntargets = 0;
5310915Sandreas.sandberg@arm.com    threadNum = -1;
5410915Sandreas.sandberg@arm.com}
5510915Sandreas.sandberg@arm.com
5610915Sandreas.sandberg@arm.comvoid
5710915Sandreas.sandberg@arm.comMSHR::allocate(Addr _addr, int _size, PacketPtr target)
5810915Sandreas.sandberg@arm.com{
5910915Sandreas.sandberg@arm.com    addr = _addr;
6010915Sandreas.sandberg@arm.com    size = _size;
6110915Sandreas.sandberg@arm.com    assert(target);
6210915Sandreas.sandberg@arm.com    isCacheFill = false;
6310915Sandreas.sandberg@arm.com    needsExclusive = target->needsExclusive();
6410915Sandreas.sandberg@arm.com    _isUncacheable = target->req->isUncacheable();
6510915Sandreas.sandberg@arm.com    inService = false;
6610915Sandreas.sandberg@arm.com    threadNum = 0;
6710915Sandreas.sandberg@arm.com    ntargets = 1;
6810915Sandreas.sandberg@arm.com    // Don't know of a case where we would allocate a new MSHR for a
6910915Sandreas.sandberg@arm.com    // snoop (mem0-side request), so set cpuSide to true here.
7010915Sandreas.sandberg@arm.com    targets.push_back(Target(target, true));
7110915Sandreas.sandberg@arm.com    assert(deferredTargets.empty());
7210915Sandreas.sandberg@arm.com    deferredNeedsExclusive = false;
7310915Sandreas.sandberg@arm.com    pendingInvalidate = false;
7410915Sandreas.sandberg@arm.com}
7510915Sandreas.sandberg@arm.com
7610915Sandreas.sandberg@arm.comvoid
7710915Sandreas.sandberg@arm.comMSHR::deallocate()
7810915Sandreas.sandberg@arm.com{
7910915Sandreas.sandberg@arm.com    assert(targets.empty());
8010915Sandreas.sandberg@arm.com    assert(deferredTargets.empty());
8110915Sandreas.sandberg@arm.com    assert(ntargets == 0);
8210915Sandreas.sandberg@arm.com    inService = false;
8310915Sandreas.sandberg@arm.com    //allocIter = NULL;
8410915Sandreas.sandberg@arm.com    //readyIter = NULL;
8510915Sandreas.sandberg@arm.com}
8610915Sandreas.sandberg@arm.com
8710915Sandreas.sandberg@arm.com/*
8810915Sandreas.sandberg@arm.com * Adds a target to an MSHR
8910915Sandreas.sandberg@arm.com */
9010915Sandreas.sandberg@arm.comvoid
9110915Sandreas.sandberg@arm.comMSHR::allocateTarget(PacketPtr target)
9210915Sandreas.sandberg@arm.com{
9310915Sandreas.sandberg@arm.com    if (inService) {
9410915Sandreas.sandberg@arm.com        if (!deferredTargets.empty() || pendingInvalidate ||
9510915Sandreas.sandberg@arm.com            (!needsExclusive && target->needsExclusive())) {
9610915Sandreas.sandberg@arm.com            // need to put on deferred list
9710915Sandreas.sandberg@arm.com            deferredTargets.push_back(Target(target, true));
9810915Sandreas.sandberg@arm.com            if (target->needsExclusive()) {
9910915Sandreas.sandberg@arm.com                deferredNeedsExclusive = true;
10010915Sandreas.sandberg@arm.com            }
10110915Sandreas.sandberg@arm.com        } else {
10210915Sandreas.sandberg@arm.com            // still OK to append to outstanding request
10310915Sandreas.sandberg@arm.com            targets.push_back(Target(target, true));
10410915Sandreas.sandberg@arm.com        }
10510915Sandreas.sandberg@arm.com    } else {
10610915Sandreas.sandberg@arm.com        if (target->needsExclusive()) {
10710915Sandreas.sandberg@arm.com            needsExclusive = true;
10810915Sandreas.sandberg@arm.com        }
10910915Sandreas.sandberg@arm.com
11010915Sandreas.sandberg@arm.com        targets.push_back(Target(target, true));
11111313Sandreas.sandberg@arm.com    }
11210915Sandreas.sandberg@arm.com
11310915Sandreas.sandberg@arm.com    ++ntargets;
11410915Sandreas.sandberg@arm.com}
11510915Sandreas.sandberg@arm.com
11610915Sandreas.sandberg@arm.comvoid
11710915Sandreas.sandberg@arm.comMSHR::allocateSnoopTarget(PacketPtr target)
11810915Sandreas.sandberg@arm.com{
11910915Sandreas.sandberg@arm.com    assert(inService); // don't bother to call otherwise
12010915Sandreas.sandberg@arm.com
12110915Sandreas.sandberg@arm.com    if (pendingInvalidate) {
12210915Sandreas.sandberg@arm.com        // a prior snoop has already appended an invalidation, so
12310915Sandreas.sandberg@arm.com        // logically we don't have the block anymore...
12410915Sandreas.sandberg@arm.com        return;
12510915Sandreas.sandberg@arm.com    }
12610915Sandreas.sandberg@arm.com
12710915Sandreas.sandberg@arm.com    if (needsExclusive) {
12810915Sandreas.sandberg@arm.com        // We're awaiting an exclusive copy, so ownership is pending.
12910915Sandreas.sandberg@arm.com        // It's up to us to respond once the data arrives.
13010915Sandreas.sandberg@arm.com        target->assertMemInhibit();
13111313Sandreas.sandberg@arm.com    } else if (target->needsExclusive()) {
13210915Sandreas.sandberg@arm.com        // This transaction will take away our pending copy
13310915Sandreas.sandberg@arm.com        pendingInvalidate = true;
13410915Sandreas.sandberg@arm.com    } else {
13510915Sandreas.sandberg@arm.com        // If we're not going to supply data or perform an
13610915Sandreas.sandberg@arm.com        // invalidation, we don't need to save this.
13710915Sandreas.sandberg@arm.com        return;
13810915Sandreas.sandberg@arm.com    }
13910915Sandreas.sandberg@arm.com
14010915Sandreas.sandberg@arm.com    targets.push_back(Target(target, false));
14110915Sandreas.sandberg@arm.com    ++ntargets;
14210915Sandreas.sandberg@arm.com}
14310915Sandreas.sandberg@arm.com
14410915Sandreas.sandberg@arm.com
14510915Sandreas.sandberg@arm.combool
14610915Sandreas.sandberg@arm.comMSHR::promoteDeferredTargets()
14710915Sandreas.sandberg@arm.com{
14810915Sandreas.sandberg@arm.com    if (deferredTargets.empty()) {
14910915Sandreas.sandberg@arm.com        return false;
15010915Sandreas.sandberg@arm.com    }
15110915Sandreas.sandberg@arm.com
15210915Sandreas.sandberg@arm.com    assert(targets.empty());
15310915Sandreas.sandberg@arm.com    targets = deferredTargets;
15410915Sandreas.sandberg@arm.com    deferredTargets.clear();
15510915Sandreas.sandberg@arm.com    assert(targets.size() == ntargets);
15610915Sandreas.sandberg@arm.com
15710915Sandreas.sandberg@arm.com    needsExclusive = deferredNeedsExclusive;
15810915Sandreas.sandberg@arm.com    pendingInvalidate = false;
15910915Sandreas.sandberg@arm.com    deferredNeedsExclusive = false;
16010915Sandreas.sandberg@arm.com
16110915Sandreas.sandberg@arm.com    return true;
16210915Sandreas.sandberg@arm.com}
16310915Sandreas.sandberg@arm.com
16410915Sandreas.sandberg@arm.com
16510915Sandreas.sandberg@arm.comvoid
16610915Sandreas.sandberg@arm.comMSHR::dump()
16710915Sandreas.sandberg@arm.com{
16810915Sandreas.sandberg@arm.com    ccprintf(cerr,
16910915Sandreas.sandberg@arm.com             "inService: %d thread: %d\n"
17010915Sandreas.sandberg@arm.com             "Addr: %x ntargets %d\n"
17110915Sandreas.sandberg@arm.com             "Targets:\n",
17210915Sandreas.sandberg@arm.com             inService, threadNum, addr, ntargets);
17310915Sandreas.sandberg@arm.com
17410915Sandreas.sandberg@arm.com    TargetListIterator tar_it = targets.begin();
17510915Sandreas.sandberg@arm.com    for (int i = 0; i < ntargets; i++) {
17610915Sandreas.sandberg@arm.com        assert(tar_it != targets.end());
17710915Sandreas.sandberg@arm.com
17810915Sandreas.sandberg@arm.com        ccprintf(cerr, "\t%d: Addr: %x cmd: %s\n",
17910915Sandreas.sandberg@arm.com                 i, tar_it->pkt->getAddr(), tar_it->pkt->cmdString());
18010915Sandreas.sandberg@arm.com
18110915Sandreas.sandberg@arm.com        tar_it++;
18210915Sandreas.sandberg@arm.com    }
18310915Sandreas.sandberg@arm.com    ccprintf(cerr, "\n");
18410915Sandreas.sandberg@arm.com}
18510915Sandreas.sandberg@arm.com
18610915Sandreas.sandberg@arm.comMSHR::~MSHR()
18710915Sandreas.sandberg@arm.com{
18810915Sandreas.sandberg@arm.com}
18910915Sandreas.sandberg@arm.com