kernel_stats.hh revision 1681
110448Snilay@cs.wisc.edu/* 210448Snilay@cs.wisc.edu * Copyright (c) 2003 The Regents of The University of Michigan 310448Snilay@cs.wisc.edu * All rights reserved. 410448Snilay@cs.wisc.edu * 510448Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without 610448Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are 710448Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright 810448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer; 910448Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright 1010448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the 1110448Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution; 1210448Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its 1310448Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from 1410448Snilay@cs.wisc.edu * this software without specific prior written permission. 1510448Snilay@cs.wisc.edu * 1610448Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710448Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810448Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910448Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010448Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110448Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710447Snilay@cs.wisc.edu */ 2810447Snilay@cs.wisc.edu 2910447Snilay@cs.wisc.edu#ifndef __KERNEL_STATS_HH__ 3010447Snilay@cs.wisc.edu#define __KERNEL_STATS_HH__ 3110447Snilay@cs.wisc.edu 3210447Snilay@cs.wisc.edu#include <map> 3310447Snilay@cs.wisc.edu#include <stack> 3410447Snilay@cs.wisc.edu#include <string> 3510447Snilay@cs.wisc.edu#include <vector> 3610447Snilay@cs.wisc.edu 3710447Snilay@cs.wisc.edu#include "base/statistics.hh" 3810447Snilay@cs.wisc.edu#include "sim/serialize.hh" 3910447Snilay@cs.wisc.edu#include "targetarch/isa_traits.hh" 4010447Snilay@cs.wisc.edu 4110447Snilay@cs.wisc.educlass BaseCPU; 4210447Snilay@cs.wisc.educlass ExecContext; 4310447Snilay@cs.wisc.educlass FnEvent; 4410447Snilay@cs.wisc.edu// What does kernel stats expect is included? 4510447Snilay@cs.wisc.educlass StaticInstBase; 4610447Snilay@cs.wisc.educlass System; 4710447Snilay@cs.wisc.eduenum Fault; 4810447Snilay@cs.wisc.edu 4910447Snilay@cs.wisc.edunamespace Kernel { 5010447Snilay@cs.wisc.edu 5110447Snilay@cs.wisc.eduenum cpu_mode { kernel, user, idle, interrupt, cpu_mode_num }; 5210447Snilay@cs.wisc.eduextern const char *modestr[]; 5310447Snilay@cs.wisc.edu 5410447Snilay@cs.wisc.educlass Binning 5510447Snilay@cs.wisc.edu{ 5610447Snilay@cs.wisc.edu private: 5710447Snilay@cs.wisc.edu std::string myname; 5810447Snilay@cs.wisc.edu System *system; 5910447Snilay@cs.wisc.edu 6010447Snilay@cs.wisc.edu private: 6110447Snilay@cs.wisc.edu // lisa's binning stuff 6210447Snilay@cs.wisc.edu struct fnCall 6310447Snilay@cs.wisc.edu { 6410447Snilay@cs.wisc.edu Stats::MainBin *myBin; 6510447Snilay@cs.wisc.edu std::string name; 6610447Snilay@cs.wisc.edu }; 6710447Snilay@cs.wisc.edu 6810447Snilay@cs.wisc.edu struct SWContext 6910447Snilay@cs.wisc.edu { 7010447Snilay@cs.wisc.edu Counter calls; 7110447Snilay@cs.wisc.edu std::stack<fnCall *> callStack; 7210447Snilay@cs.wisc.edu }; 7310447Snilay@cs.wisc.edu 7410447Snilay@cs.wisc.edu std::map<const std::string, Stats::MainBin *> fnBins; 7510447Snilay@cs.wisc.edu std::map<const Addr, SWContext *> swCtxMap; 7610447Snilay@cs.wisc.edu 7710447Snilay@cs.wisc.edu std::multimap<const std::string, std::string> callerMap; 7810447Snilay@cs.wisc.edu void populateMap(std::string caller, std::string callee); 7910447Snilay@cs.wisc.edu 8010447Snilay@cs.wisc.edu std::vector<FnEvent *> fnEvents; 8110447Snilay@cs.wisc.edu 8210447Snilay@cs.wisc.edu Stats::Scalar<> fnCalls; 8310447Snilay@cs.wisc.edu 8410447Snilay@cs.wisc.edu Stats::MainBin *getBin(const std::string &name); 8510447Snilay@cs.wisc.edu bool findCaller(std::string, std::string) const; 8610447Snilay@cs.wisc.edu 8710447Snilay@cs.wisc.edu SWContext *findContext(Addr pcb); 8810447Snilay@cs.wisc.edu bool addContext(Addr pcb, SWContext *ctx) 8910447Snilay@cs.wisc.edu { 9010447Snilay@cs.wisc.edu return (swCtxMap.insert(std::make_pair(pcb, ctx))).second; 9110447Snilay@cs.wisc.edu } 9210447Snilay@cs.wisc.edu 9310447Snilay@cs.wisc.edu void remContext(Addr pcb) 9410447Snilay@cs.wisc.edu { 9510447Snilay@cs.wisc.edu swCtxMap.erase(pcb); 9610447Snilay@cs.wisc.edu } 9710447Snilay@cs.wisc.edu 9810447Snilay@cs.wisc.edu void dumpState() const; 9910447Snilay@cs.wisc.edu 10010447Snilay@cs.wisc.edu SWContext *swctx; 10110447Snilay@cs.wisc.edu std::vector<std::string> binned_fns; 10210447Snilay@cs.wisc.edu 10310447Snilay@cs.wisc.edu private: 10410447Snilay@cs.wisc.edu Stats::MainBin *modeBin[cpu_mode_num]; 10510447Snilay@cs.wisc.edu 10610447Snilay@cs.wisc.edu public: 10710447Snilay@cs.wisc.edu const bool bin; 10810447Snilay@cs.wisc.edu const bool fnbin; 10910447Snilay@cs.wisc.edu 11010447Snilay@cs.wisc.edu cpu_mode themode; 11110447Snilay@cs.wisc.edu void palSwapContext(ExecContext *xc); 11210447Snilay@cs.wisc.edu void execute(ExecContext *xc, const StaticInstBase *inst); 11310447Snilay@cs.wisc.edu void call(ExecContext *xc, Stats::MainBin *myBin); 11410447Snilay@cs.wisc.edu void changeMode(cpu_mode mode); 11510447Snilay@cs.wisc.edu 11610447Snilay@cs.wisc.edu public: 11710447Snilay@cs.wisc.edu Binning(System *sys); 11810447Snilay@cs.wisc.edu virtual ~Binning(); 11910447Snilay@cs.wisc.edu 12010447Snilay@cs.wisc.edu const std::string name() const { return myname; } 12110447Snilay@cs.wisc.edu void regStats(const std::string &name); 12210447Snilay@cs.wisc.edu 12310447Snilay@cs.wisc.edu public: 12410447Snilay@cs.wisc.edu virtual void serialize(std::ostream &os); 12510447Snilay@cs.wisc.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 12610447Snilay@cs.wisc.edu}; 12710447Snilay@cs.wisc.edu 12810447Snilay@cs.wisc.educlass Statistics : public Serializable 12910447Snilay@cs.wisc.edu{ 13010447Snilay@cs.wisc.edu friend class Binning; 13110447Snilay@cs.wisc.edu 13210447Snilay@cs.wisc.edu private: 13310447Snilay@cs.wisc.edu std::string myname; 13410447Snilay@cs.wisc.edu ExecContext *xc; 13510447Snilay@cs.wisc.edu 13610447Snilay@cs.wisc.edu Addr idleProcess; 13710447Snilay@cs.wisc.edu cpu_mode themode; 13810447Snilay@cs.wisc.edu Tick lastModeTick; 13910447Snilay@cs.wisc.edu bool bin_int; 14010447Snilay@cs.wisc.edu 14110447Snilay@cs.wisc.edu void changeMode(cpu_mode newmode); 14210447Snilay@cs.wisc.edu 14310447Snilay@cs.wisc.edu private: 14410447Snilay@cs.wisc.edu Stats::Scalar<> _arm; 14510447Snilay@cs.wisc.edu Stats::Scalar<> _quiesce; 14610447Snilay@cs.wisc.edu Stats::Scalar<> _ivlb; 14710447Snilay@cs.wisc.edu Stats::Scalar<> _ivle; 14810447Snilay@cs.wisc.edu Stats::Scalar<> _hwrei; 14910447Snilay@cs.wisc.edu 15010447Snilay@cs.wisc.edu Stats::Vector<> _iplCount; 15110447Snilay@cs.wisc.edu Stats::Vector<> _iplGood; 15210447Snilay@cs.wisc.edu Stats::Vector<> _iplTicks; 15310447Snilay@cs.wisc.edu Stats::Formula _iplUsed; 15410447Snilay@cs.wisc.edu 15510447Snilay@cs.wisc.edu Stats::Vector<> _callpal; 15610447Snilay@cs.wisc.edu Stats::Vector<> _syscall; 15710447Snilay@cs.wisc.edu Stats::Vector<> _faults; 15810447Snilay@cs.wisc.edu 15910447Snilay@cs.wisc.edu Stats::Vector<> _mode; 16010447Snilay@cs.wisc.edu Stats::Vector<> _modeGood; 16110447Snilay@cs.wisc.edu Stats::Formula _modeFraction; 16210447Snilay@cs.wisc.edu Stats::Vector<> _modeTicks; 16310447Snilay@cs.wisc.edu 16410447Snilay@cs.wisc.edu Stats::Scalar<> _swap_context; 16510447Snilay@cs.wisc.edu 16610447Snilay@cs.wisc.edu private: 16710447Snilay@cs.wisc.edu int iplLast; 16810447Snilay@cs.wisc.edu Tick iplLastTick; 16910447Snilay@cs.wisc.edu 17010447Snilay@cs.wisc.edu public: 17110447Snilay@cs.wisc.edu Statistics(ExecContext *context); 17210447Snilay@cs.wisc.edu 17310447Snilay@cs.wisc.edu const std::string name() const { return myname; } 17410447Snilay@cs.wisc.edu void regStats(const std::string &name); 17510447Snilay@cs.wisc.edu 17610447Snilay@cs.wisc.edu public: 17710447Snilay@cs.wisc.edu void arm() { _arm++; } 17810447Snilay@cs.wisc.edu void quiesce() { _quiesce++; } 17910447Snilay@cs.wisc.edu void ivlb() { _ivlb++; } 18010447Snilay@cs.wisc.edu void ivle() { _ivle++; } 18110447Snilay@cs.wisc.edu void hwrei() { _hwrei++; } 18210447Snilay@cs.wisc.edu void fault(Fault fault) { _faults[fault]++; } 18310447Snilay@cs.wisc.edu void swpipl(int ipl); 18410447Snilay@cs.wisc.edu void mode(cpu_mode newmode); 18510447Snilay@cs.wisc.edu void context(Addr oldpcbb, Addr newpcbb); 18610447Snilay@cs.wisc.edu void callpal(int code); 18710447Snilay@cs.wisc.edu 18810447Snilay@cs.wisc.edu void setIdleProcess(Addr idle); 18910447Snilay@cs.wisc.edu 19010447Snilay@cs.wisc.edu public: 19110447Snilay@cs.wisc.edu virtual void serialize(std::ostream &os); 19210447Snilay@cs.wisc.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 19310447Snilay@cs.wisc.edu}; 19410447Snilay@cs.wisc.edu 19510447Snilay@cs.wisc.edu/* end namespace Kernel */ } 19610447Snilay@cs.wisc.edu 19710447Snilay@cs.wisc.edu#endif // __KERNEL_STATS_HH__ 19810447Snilay@cs.wisc.edu