110995Sandreas.sandberg@arm.com/*
210995Sandreas.sandberg@arm.com * Copyright (c) 2015 ARM Limited
310995Sandreas.sandberg@arm.com * All rights reserved
410995Sandreas.sandberg@arm.com *
510995Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
610995Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
710995Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
810995Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
910995Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1010995Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1110995Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1210995Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1310995Sandreas.sandberg@arm.com *
1410995Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1510995Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
1610995Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
1710995Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
1810995Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1910995Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2010995Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2110995Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2210995Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2310995Sandreas.sandberg@arm.com * this software without specific prior written permission.
2410995Sandreas.sandberg@arm.com *
2510995Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610995Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710995Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810995Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910995Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010995Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110995Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210995Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310995Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410995Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510995Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610995Sandreas.sandberg@arm.com *
3710995Sandreas.sandberg@arm.com * Authors: Andreas Sandberg
3810995Sandreas.sandberg@arm.com */
3910995Sandreas.sandberg@arm.com
4010995Sandreas.sandberg@arm.com#include "mem/probes/stack_dist.hh"
4110995Sandreas.sandberg@arm.com
4210995Sandreas.sandberg@arm.com#include "params/StackDistProbe.hh"
4310995Sandreas.sandberg@arm.com#include "sim/system.hh"
4410995Sandreas.sandberg@arm.com
4510995Sandreas.sandberg@arm.comStackDistProbe::StackDistProbe(StackDistProbeParams *p)
4610995Sandreas.sandberg@arm.com    : BaseMemProbe(p),
4710995Sandreas.sandberg@arm.com      lineSize(p->line_size),
4810995Sandreas.sandberg@arm.com      disableLinearHists(p->disable_linear_hists),
4910995Sandreas.sandberg@arm.com      disableLogHists(p->disable_log_hists),
5010995Sandreas.sandberg@arm.com      calc(p->verify)
5110995Sandreas.sandberg@arm.com{
5210995Sandreas.sandberg@arm.com    fatal_if(p->system->cacheLineSize() > p->line_size,
5310995Sandreas.sandberg@arm.com             "The stack distance probe must use a cache line size that is "
5410995Sandreas.sandberg@arm.com             "larger or equal to the system's cahce line size.");
5510995Sandreas.sandberg@arm.com}
5610995Sandreas.sandberg@arm.com
5710995Sandreas.sandberg@arm.comvoid
5810995Sandreas.sandberg@arm.comStackDistProbe::regStats()
5910995Sandreas.sandberg@arm.com{
6011523Sdavid.guillen@arm.com    BaseMemProbe::regStats();
6111523Sdavid.guillen@arm.com
6210995Sandreas.sandberg@arm.com    const StackDistProbeParams *p(
6310995Sandreas.sandberg@arm.com        dynamic_cast<const StackDistProbeParams *>(params()));
6410995Sandreas.sandberg@arm.com    assert(p);
6510995Sandreas.sandberg@arm.com
6610995Sandreas.sandberg@arm.com    using namespace Stats;
6710995Sandreas.sandberg@arm.com
6810995Sandreas.sandberg@arm.com    readLinearHist
6910995Sandreas.sandberg@arm.com        .init(p->linear_hist_bins)
7010995Sandreas.sandberg@arm.com        .name(name() + ".readLinearHist")
7110995Sandreas.sandberg@arm.com        .desc("Reads linear distribution")
7210995Sandreas.sandberg@arm.com        .flags(disableLinearHists ? nozero : pdf);
7310995Sandreas.sandberg@arm.com
7410995Sandreas.sandberg@arm.com    readLogHist
7510995Sandreas.sandberg@arm.com        .init(p->log_hist_bins)
7610995Sandreas.sandberg@arm.com        .name(name() + ".readLogHist")
7710995Sandreas.sandberg@arm.com        .desc("Reads logarithmic distribution")
7810995Sandreas.sandberg@arm.com        .flags(disableLogHists ? nozero : pdf);
7910995Sandreas.sandberg@arm.com
8010995Sandreas.sandberg@arm.com    writeLinearHist
8110995Sandreas.sandberg@arm.com        .init(p->linear_hist_bins)
8210995Sandreas.sandberg@arm.com        .name(name() + ".writeLinearHist")
8310995Sandreas.sandberg@arm.com        .desc("Writes linear distribution")
8410995Sandreas.sandberg@arm.com        .flags(disableLinearHists ? nozero : pdf);
8510995Sandreas.sandberg@arm.com
8610995Sandreas.sandberg@arm.com    writeLogHist
8710995Sandreas.sandberg@arm.com        .init(p->log_hist_bins)
8810995Sandreas.sandberg@arm.com        .name(name() + ".writeLogHist")
8910995Sandreas.sandberg@arm.com        .desc("Writes logarithmic distribution")
9010995Sandreas.sandberg@arm.com        .flags(disableLogHists ? nozero : pdf);
9110995Sandreas.sandberg@arm.com
9210995Sandreas.sandberg@arm.com    infiniteSD
9310995Sandreas.sandberg@arm.com        .name(name() + ".infinity")
9410995Sandreas.sandberg@arm.com        .desc("Number of requests with infinite stack distance")
9510995Sandreas.sandberg@arm.com        .flags(nozero);
9610995Sandreas.sandberg@arm.com}
9710995Sandreas.sandberg@arm.com
9810995Sandreas.sandberg@arm.comvoid
9911139Sandreas.hansson@arm.comStackDistProbe::handleRequest(const ProbePoints::PacketInfo &pkt_info)
10010995Sandreas.sandberg@arm.com{
10110995Sandreas.sandberg@arm.com    // only capturing read and write requests (which allocate in the
10210995Sandreas.sandberg@arm.com    // cache)
10311139Sandreas.hansson@arm.com    if (!pkt_info.cmd.isRead() && !pkt_info.cmd.isWrite())
10410995Sandreas.sandberg@arm.com        return;
10510995Sandreas.sandberg@arm.com
10610995Sandreas.sandberg@arm.com    // Align the address to a cache line size
10711139Sandreas.hansson@arm.com    const Addr aligned_addr(roundDown(pkt_info.addr, lineSize));
10810995Sandreas.sandberg@arm.com
10910995Sandreas.sandberg@arm.com    // Calculate the stack distance
11010995Sandreas.sandberg@arm.com    const uint64_t sd(calc.calcStackDistAndUpdate(aligned_addr).first);
11110995Sandreas.sandberg@arm.com    if (sd == StackDistCalc::Infinity) {
11210995Sandreas.sandberg@arm.com        infiniteSD++;
11310995Sandreas.sandberg@arm.com        return;
11410995Sandreas.sandberg@arm.com    }
11510995Sandreas.sandberg@arm.com
11610995Sandreas.sandberg@arm.com    // Sample the stack distance of the address in linear bins
11710995Sandreas.sandberg@arm.com    if (!disableLinearHists) {
11811139Sandreas.hansson@arm.com        if (pkt_info.cmd.isRead())
11910995Sandreas.sandberg@arm.com            readLinearHist.sample(sd);
12010995Sandreas.sandberg@arm.com        else
12110995Sandreas.sandberg@arm.com            writeLinearHist.sample(sd);
12210995Sandreas.sandberg@arm.com    }
12310995Sandreas.sandberg@arm.com
12410995Sandreas.sandberg@arm.com    if (!disableLogHists) {
12510995Sandreas.sandberg@arm.com        int sd_lg2 = sd == 0 ? 1 : floorLog2(sd);
12610995Sandreas.sandberg@arm.com
12710995Sandreas.sandberg@arm.com        // Sample the stack distance of the address in log bins
12811139Sandreas.hansson@arm.com        if (pkt_info.cmd.isRead())
12910995Sandreas.sandberg@arm.com            readLogHist.sample(sd_lg2);
13010995Sandreas.sandberg@arm.com        else
13110995Sandreas.sandberg@arm.com            writeLogHist.sample(sd_lg2);
13210995Sandreas.sandberg@arm.com    }
13310995Sandreas.sandberg@arm.com}
13410995Sandreas.sandberg@arm.com
13510995Sandreas.sandberg@arm.com
13610995Sandreas.sandberg@arm.comStackDistProbe *
13710995Sandreas.sandberg@arm.comStackDistProbeParams::create()
13810995Sandreas.sandberg@arm.com{
13910995Sandreas.sandberg@arm.com    return new StackDistProbe(this);
14010995Sandreas.sandberg@arm.com}
141