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