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 &section);
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 &section);
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