kernel_stats.hh revision 1917
110458Sandreas.hansson@arm.com/* 210458Sandreas.hansson@arm.com * Copyright (c) 2004-2005 The Regents of The University of Michigan 310458Sandreas.hansson@arm.com * All rights reserved. 410458Sandreas.hansson@arm.com * 510458Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 610458Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 710458Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 810458Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 910458Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1010458Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1110458Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1210458Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1310458Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1410458Sandreas.hansson@arm.com * this software without specific prior written permission. 1510458Sandreas.hansson@arm.com * 1610458Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710458Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810458Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910458Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010458Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110458Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210458Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310458Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410458Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510458Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610458Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710458Sandreas.hansson@arm.com */ 2810458Sandreas.hansson@arm.com 2910458Sandreas.hansson@arm.com#ifndef __KERNEL_STATS_HH__ 3010458Sandreas.hansson@arm.com#define __KERNEL_STATS_HH__ 3110458Sandreas.hansson@arm.com 3210458Sandreas.hansson@arm.com#include <map> 3310458Sandreas.hansson@arm.com#include <stack> 3410458Sandreas.hansson@arm.com#include <string> 3510458Sandreas.hansson@arm.com#include <vector> 3610458Sandreas.hansson@arm.com 3710458Sandreas.hansson@arm.com#include "cpu/static_inst.hh" 3810458Sandreas.hansson@arm.com 3910458Sandreas.hansson@arm.comclass BaseCPU; 4010458Sandreas.hansson@arm.comclass ExecContext; 4110458Sandreas.hansson@arm.comclass FnEvent; 4210458Sandreas.hansson@arm.com// What does kernel stats expect is included? 4310458Sandreas.hansson@arm.comclass System; 4410458Sandreas.hansson@arm.comenum Fault; 4510458Sandreas.hansson@arm.com 4610458Sandreas.hansson@arm.comnamespace Kernel { 4710458Sandreas.hansson@arm.com 4810458Sandreas.hansson@arm.comenum cpu_mode { kernel, user, idle, interrupt, cpu_mode_num }; 4910458Sandreas.hansson@arm.comextern const char *modestr[]; 5010458Sandreas.hansson@arm.com 5110458Sandreas.hansson@arm.comclass Binning 5210458Sandreas.hansson@arm.com{ 5310458Sandreas.hansson@arm.com private: 5410458Sandreas.hansson@arm.com std::string myname; 5510458Sandreas.hansson@arm.com System *system; 5610458Sandreas.hansson@arm.com 5710458Sandreas.hansson@arm.com private: 5810458Sandreas.hansson@arm.com // lisa's binning stuff 5910458Sandreas.hansson@arm.com struct fnCall 6010458Sandreas.hansson@arm.com { 6110458Sandreas.hansson@arm.com Stats::MainBin *myBin; 6210458Sandreas.hansson@arm.com std::string name; 6310458Sandreas.hansson@arm.com }; 6410458Sandreas.hansson@arm.com 6510458Sandreas.hansson@arm.com struct SWContext 6610458Sandreas.hansson@arm.com { 6710458Sandreas.hansson@arm.com Counter calls; 6810458Sandreas.hansson@arm.com std::stack<fnCall *> callStack; 6910458Sandreas.hansson@arm.com }; 7010458Sandreas.hansson@arm.com 7110458Sandreas.hansson@arm.com std::map<const std::string, Stats::MainBin *> fnBins; 7210458Sandreas.hansson@arm.com std::map<const Addr, SWContext *> swCtxMap; 7310458Sandreas.hansson@arm.com 7410458Sandreas.hansson@arm.com std::multimap<const std::string, std::string> callerMap; 7510458Sandreas.hansson@arm.com void populateMap(std::string caller, std::string callee); 7610458Sandreas.hansson@arm.com 7710458Sandreas.hansson@arm.com std::vector<FnEvent *> fnEvents; 7810458Sandreas.hansson@arm.com 7910458Sandreas.hansson@arm.com Stats::Scalar<> fnCalls; 8010458Sandreas.hansson@arm.com 8110458Sandreas.hansson@arm.com Stats::MainBin *getBin(const std::string &name); 8210458Sandreas.hansson@arm.com bool findCaller(std::string, std::string) const; 8310458Sandreas.hansson@arm.com 8410458Sandreas.hansson@arm.com SWContext *findContext(Addr pcb); 8510458Sandreas.hansson@arm.com bool addContext(Addr pcb, SWContext *ctx) 8610458Sandreas.hansson@arm.com { 8710458Sandreas.hansson@arm.com return (swCtxMap.insert(std::make_pair(pcb, ctx))).second; 8810458Sandreas.hansson@arm.com } 8910458Sandreas.hansson@arm.com 9010458Sandreas.hansson@arm.com void remContext(Addr pcb) 9110458Sandreas.hansson@arm.com { 9210458Sandreas.hansson@arm.com swCtxMap.erase(pcb); 9310458Sandreas.hansson@arm.com } 9410458Sandreas.hansson@arm.com 9510458Sandreas.hansson@arm.com void dumpState() const; 9610458Sandreas.hansson@arm.com 9710458Sandreas.hansson@arm.com SWContext *swctx; 9810458Sandreas.hansson@arm.com std::vector<std::string> binned_fns; 9910458Sandreas.hansson@arm.com 10010458Sandreas.hansson@arm.com private: 10110458Sandreas.hansson@arm.com Stats::MainBin *modeBin[cpu_mode_num]; 10210458Sandreas.hansson@arm.com 10310458Sandreas.hansson@arm.com public: 10410458Sandreas.hansson@arm.com const bool bin; 105 const bool fnbin; 106 107 cpu_mode themode; 108 void palSwapContext(ExecContext *xc); 109 void execute(ExecContext *xc, StaticInstPtr<TheISA> inst); 110 void call(ExecContext *xc, Stats::MainBin *myBin); 111 void changeMode(cpu_mode mode); 112 113 public: 114 Binning(System *sys); 115 virtual ~Binning(); 116 117 const std::string name() const { return myname; } 118 void regStats(const std::string &name); 119 120 public: 121 virtual void serialize(std::ostream &os); 122 virtual void unserialize(Checkpoint *cp, const std::string §ion); 123}; 124 125class Statistics : public Serializable 126{ 127 friend class Binning; 128 129 private: 130 std::string myname; 131 ExecContext *xc; 132 133 Addr idleProcess; 134 cpu_mode themode; 135 Tick lastModeTick; 136 bool bin_int; 137 138 void changeMode(cpu_mode newmode); 139 140 private: 141 Stats::Scalar<> _arm; 142 Stats::Scalar<> _quiesce; 143 Stats::Scalar<> _ivlb; 144 Stats::Scalar<> _ivle; 145 Stats::Scalar<> _hwrei; 146 147 Stats::Vector<> _iplCount; 148 Stats::Vector<> _iplGood; 149 Stats::Vector<> _iplTicks; 150 Stats::Formula _iplUsed; 151 152 Stats::Vector<> _callpal; 153 Stats::Vector<> _syscall; 154 Stats::Vector<> _faults; 155 156 Stats::Vector<> _mode; 157 Stats::Vector<> _modeGood; 158 Stats::Formula _modeFraction; 159 Stats::Vector<> _modeTicks; 160 161 Stats::Scalar<> _swap_context; 162 163 private: 164 int iplLast; 165 Tick iplLastTick; 166 167 public: 168 Statistics(ExecContext *context); 169 170 const std::string name() const { return myname; } 171 void regStats(const std::string &name); 172 173 public: 174 void arm() { _arm++; } 175 void quiesce() { _quiesce++; } 176 void ivlb() { _ivlb++; } 177 void ivle() { _ivle++; } 178 void hwrei() { _hwrei++; } 179 void fault(Fault fault) { _faults[fault]++; } 180 void swpipl(int ipl); 181 void mode(cpu_mode newmode); 182 void context(Addr oldpcbb, Addr newpcbb); 183 void callpal(int code); 184 185 void setIdleProcess(Addr idle); 186 187 public: 188 virtual void serialize(std::ostream &os); 189 virtual void unserialize(Checkpoint *cp, const std::string §ion); 190}; 191 192/* end namespace Kernel */ } 193 194#endif // __KERNEL_STATS_HH__ 195