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