kernel_stats.hh revision 2107
14120Sgblack@eecs.umich.edu/* 24120Sgblack@eecs.umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan 34120Sgblack@eecs.umich.edu * All rights reserved. 44120Sgblack@eecs.umich.edu * 54120Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64120Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 74120Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94120Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114120Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144120Sgblack@eecs.umich.edu * this software without specific prior written permission. 154120Sgblack@eecs.umich.edu * 164120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274120Sgblack@eecs.umich.edu */ 284120Sgblack@eecs.umich.edu 294120Sgblack@eecs.umich.edu#ifndef __KERNEL_STATS_HH__ 304120Sgblack@eecs.umich.edu#define __KERNEL_STATS_HH__ 315334Sgblack@eecs.umich.edu 324120Sgblack@eecs.umich.edu#include <map> 334120Sgblack@eecs.umich.edu#include <stack> 344120Sgblack@eecs.umich.edu#include <string> 354120Sgblack@eecs.umich.edu#include <vector> 364120Sgblack@eecs.umich.edu 374120Sgblack@eecs.umich.edu#include "cpu/static_inst.hh" 384120Sgblack@eecs.umich.edu 394120Sgblack@eecs.umich.educlass BaseCPU; 404120Sgblack@eecs.umich.educlass ExecContext; 414120Sgblack@eecs.umich.educlass FnEvent; 424120Sgblack@eecs.umich.edu// What does kernel stats expect is included? 434120Sgblack@eecs.umich.educlass System; 444120Sgblack@eecs.umich.educlass Fault; 454120Sgblack@eecs.umich.edu 464120Sgblack@eecs.umich.edunamespace Kernel { 474120Sgblack@eecs.umich.edu 484120Sgblack@eecs.umich.eduenum cpu_mode { kernel, user, idle, interrupt, cpu_mode_num }; 494120Sgblack@eecs.umich.eduextern const char *modestr[]; 504120Sgblack@eecs.umich.edu 514120Sgblack@eecs.umich.educlass Binning 524120Sgblack@eecs.umich.edu{ 534120Sgblack@eecs.umich.edu protected: 544120Sgblack@eecs.umich.edu typedef TheISA::Addr Addr; 554120Sgblack@eecs.umich.edu private: 564120Sgblack@eecs.umich.edu std::string myname; 574120Sgblack@eecs.umich.edu System *system; 584120Sgblack@eecs.umich.edu 594120Sgblack@eecs.umich.edu private: 604120Sgblack@eecs.umich.edu // lisa's binning stuff 614120Sgblack@eecs.umich.edu struct fnCall 624120Sgblack@eecs.umich.edu { 634120Sgblack@eecs.umich.edu Stats::MainBin *myBin; 644120Sgblack@eecs.umich.edu std::string name; 654120Sgblack@eecs.umich.edu }; 664120Sgblack@eecs.umich.edu 674120Sgblack@eecs.umich.edu struct SWContext 684120Sgblack@eecs.umich.edu { 694120Sgblack@eecs.umich.edu Counter calls; 704120Sgblack@eecs.umich.edu std::stack<fnCall *> callStack; 714120Sgblack@eecs.umich.edu }; 724120Sgblack@eecs.umich.edu 734120Sgblack@eecs.umich.edu std::map<const std::string, Stats::MainBin *> fnBins; 744120Sgblack@eecs.umich.edu std::map<const Addr, SWContext *> swCtxMap; 754120Sgblack@eecs.umich.edu 764120Sgblack@eecs.umich.edu std::multimap<const std::string, std::string> callerMap; 774120Sgblack@eecs.umich.edu void populateMap(std::string caller, std::string callee); 784120Sgblack@eecs.umich.edu 794120Sgblack@eecs.umich.edu std::vector<FnEvent *> fnEvents; 804120Sgblack@eecs.umich.edu 814120Sgblack@eecs.umich.edu Stats::Scalar<> fnCalls; 824120Sgblack@eecs.umich.edu 834120Sgblack@eecs.umich.edu Stats::MainBin *getBin(const std::string &name); 844120Sgblack@eecs.umich.edu bool findCaller(std::string, std::string) const; 854120Sgblack@eecs.umich.edu 864202Sbinkertn@umich.edu SWContext *findContext(Addr pcb); 875069Sgblack@eecs.umich.edu bool addContext(Addr pcb, SWContext *ctx) 884202Sbinkertn@umich.edu { 895659Sgblack@eecs.umich.edu return (swCtxMap.insert(std::make_pair(pcb, ctx))).second; 904601Sgblack@eecs.umich.edu } 914202Sbinkertn@umich.edu 925124Sgblack@eecs.umich.edu void remContext(Addr pcb) 935083Sgblack@eecs.umich.edu { 944679Sgblack@eecs.umich.edu swCtxMap.erase(pcb); 955083Sgblack@eecs.umich.edu } 964679Sgblack@eecs.umich.edu 974679Sgblack@eecs.umich.edu void dumpState() const; 984202Sbinkertn@umich.edu 994202Sbinkertn@umich.edu SWContext *swctx; 1005124Sgblack@eecs.umich.edu std::vector<std::string> binned_fns; 1014249Sgblack@eecs.umich.edu 1024240Sgblack@eecs.umich.edu private: 1034202Sbinkertn@umich.edu Stats::MainBin *modeBin[cpu_mode_num]; 1044202Sbinkertn@umich.edu 1054997Sgblack@eecs.umich.edu public: 1065135Sgblack@eecs.umich.edu const bool bin; 1074997Sgblack@eecs.umich.edu const bool fnbin; 1084997Sgblack@eecs.umich.edu 1095800Snate@binkert.org cpu_mode themode; 1105800Snate@binkert.org void palSwapContext(ExecContext *xc); 1114120Sgblack@eecs.umich.edu void execute(ExecContext *xc, StaticInstPtr inst); 1124202Sbinkertn@umich.edu void call(ExecContext *xc, Stats::MainBin *myBin); 1135800Snate@binkert.org void changeMode(cpu_mode mode); 1145904Sgblack@eecs.umich.edu 1155904Sgblack@eecs.umich.edu public: 1165909Sgblack@eecs.umich.edu Binning(System *sys); 1175649Sgblack@eecs.umich.edu virtual ~Binning(); 1185647Sgblack@eecs.umich.edu 1195132Sgblack@eecs.umich.edu const std::string name() const { return myname; } 1205132Sgblack@eecs.umich.edu void regStats(const std::string &name); 1214202Sbinkertn@umich.edu 1225647Sgblack@eecs.umich.edu public: 1235299Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os); 1245245Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 1255132Sgblack@eecs.umich.edu}; 1265086Sgblack@eecs.umich.edu 1275086Sgblack@eecs.umich.educlass Statistics : public Serializable 1284202Sbinkertn@umich.edu{ 1294202Sbinkertn@umich.edu protected: 1304120Sgblack@eecs.umich.edu typedef TheISA::Addr Addr; 1314202Sbinkertn@umich.edu private: 1324202Sbinkertn@umich.edu friend class Binning; 1334202Sbinkertn@umich.edu 1344120Sgblack@eecs.umich.edu private: 1355069Sgblack@eecs.umich.edu std::string myname; 1365081Sgblack@eecs.umich.edu ExecContext *xc; 1375081Sgblack@eecs.umich.edu 1385081Sgblack@eecs.umich.edu Addr idleProcess; 1395081Sgblack@eecs.umich.edu cpu_mode themode; 1405081Sgblack@eecs.umich.edu Tick lastModeTick; 1415081Sgblack@eecs.umich.edu bool bin_int; 1425081Sgblack@eecs.umich.edu 1435081Sgblack@eecs.umich.edu void changeMode(cpu_mode newmode); 1445081Sgblack@eecs.umich.edu 1455081Sgblack@eecs.umich.edu private: 1465081Sgblack@eecs.umich.edu Stats::Scalar<> _arm; 1475081Sgblack@eecs.umich.edu Stats::Scalar<> _quiesce; 1485081Sgblack@eecs.umich.edu Stats::Scalar<> _ivlb; 1495081Sgblack@eecs.umich.edu Stats::Scalar<> _ivle; 1505081Sgblack@eecs.umich.edu Stats::Scalar<> _hwrei; 1515081Sgblack@eecs.umich.edu 1525081Sgblack@eecs.umich.edu Stats::Vector<> _iplCount; 1535081Sgblack@eecs.umich.edu Stats::Vector<> _iplGood; 1545081Sgblack@eecs.umich.edu Stats::Vector<> _iplTicks; 1555081Sgblack@eecs.umich.edu Stats::Formula _iplUsed; 1565081Sgblack@eecs.umich.edu 1575081Sgblack@eecs.umich.edu Stats::Vector<> _callpal; 1585081Sgblack@eecs.umich.edu Stats::Vector<> _syscall; 1595081Sgblack@eecs.umich.edu Stats::Vector<> _faults; 1605081Sgblack@eecs.umich.edu 1615081Sgblack@eecs.umich.edu Stats::Vector<> _mode; 1625081Sgblack@eecs.umich.edu Stats::Vector<> _modeGood; 1635081Sgblack@eecs.umich.edu Stats::Formula _modeFraction; 1645081Sgblack@eecs.umich.edu Stats::Vector<> _modeTicks; 1655081Sgblack@eecs.umich.edu 1665081Sgblack@eecs.umich.edu Stats::Scalar<> _swap_context; 1675081Sgblack@eecs.umich.edu 1685081Sgblack@eecs.umich.edu private: 1695081Sgblack@eecs.umich.edu int iplLast; 1705081Sgblack@eecs.umich.edu Tick iplLastTick; 1715081Sgblack@eecs.umich.edu 1725081Sgblack@eecs.umich.edu public: 1735081Sgblack@eecs.umich.edu Statistics(ExecContext *context); 1745081Sgblack@eecs.umich.edu 1755081Sgblack@eecs.umich.edu const std::string name() const { return myname; } 1765081Sgblack@eecs.umich.edu void regStats(const std::string &name); 1775081Sgblack@eecs.umich.edu 1785081Sgblack@eecs.umich.edu public: 1795081Sgblack@eecs.umich.edu void arm() { _arm++; } 1805081Sgblack@eecs.umich.edu void quiesce() { _quiesce++; } 1815081Sgblack@eecs.umich.edu void ivlb() { _ivlb++; } 1825081Sgblack@eecs.umich.edu void ivle() { _ivle++; } 1835081Sgblack@eecs.umich.edu void hwrei() { _hwrei++; } 1845081Sgblack@eecs.umich.edu void fault(Fault * fault) 1855081Sgblack@eecs.umich.edu { 1865081Sgblack@eecs.umich.edu if(fault == NoFault) _faults[0]++; 1875081Sgblack@eecs.umich.edu else if(fault == MachineCheckFault) _faults[2]++; 1885081Sgblack@eecs.umich.edu else if(fault == AlignmentFault) _faults[7]++; 1895081Sgblack@eecs.umich.edu else if(fault == FakeMemFault) _faults[17]++; 1905081Sgblack@eecs.umich.edu else _faults[fault->id]++; 1915680Sgblack@eecs.umich.edu }// FIXME: When there are no generic system fault objects, this will go back to _faults[fault]++; } 1925081Sgblack@eecs.umich.edu void swpipl(int ipl); 1935933Sgblack@eecs.umich.edu void mode(cpu_mode newmode); 1945173Sgblack@eecs.umich.edu void context(Addr oldpcbb, Addr newpcbb); 1955359Sgblack@eecs.umich.edu void callpal(int code); 1965081Sgblack@eecs.umich.edu 1975149Sgblack@eecs.umich.edu void setIdleProcess(Addr idle); 1985298Sgblack@eecs.umich.edu 1995081Sgblack@eecs.umich.edu public: 2005081Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os); 2015081Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 2025081Sgblack@eecs.umich.edu}; 2035081Sgblack@eecs.umich.edu 2045081Sgblack@eecs.umich.edu/* end namespace Kernel */ } 2055081Sgblack@eecs.umich.edu 2065081Sgblack@eecs.umich.edu#endif // __KERNEL_STATS_HH__ 2075081Sgblack@eecs.umich.edu