kernel_stats.cc revision 7823
11049Sbinkertn@umich.edu/*
21758Ssaidi@eecs.umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan
31758Ssaidi@eecs.umich.edu * All rights reserved.
41758Ssaidi@eecs.umich.edu *
51758Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
61758Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
71758Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
81758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
91758Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
101758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
111758Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
121758Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
131758Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
141758Ssaidi@eecs.umich.edu * this software without specific prior written permission.
151758Ssaidi@eecs.umich.edu *
161758Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171758Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181758Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191758Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201758Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211758Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221758Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231758Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241758Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251758Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
261758Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
271758Ssaidi@eecs.umich.edu *
281758Ssaidi@eecs.umich.edu * Authors: Lisa Hsu
291049Sbinkertn@umich.edu *          Nathan Binkert
301318Ssaidi@eecs.umich.edu */
311049Sbinkertn@umich.edu
321049Sbinkertn@umich.edu#include <map>
331049Sbinkertn@umich.edu#include <stack>
341881Sbinkertn@umich.edu#include <string>
351331Ssaidi@eecs.umich.edu
361331Ssaidi@eecs.umich.edu#include "arch/alpha/linux/threadinfo.hh"
371331Ssaidi@eecs.umich.edu#include "arch/alpha/kernel_stats.hh"
381331Ssaidi@eecs.umich.edu#include "arch/alpha/osfpal.hh"
391331Ssaidi@eecs.umich.edu#include "base/trace.hh"
401331Ssaidi@eecs.umich.edu#include "cpu/thread_context.hh"
411331Ssaidi@eecs.umich.edu#include "kern/tru64/tru64_syscalls.hh"
421331Ssaidi@eecs.umich.edu#include "sim/system.hh"
431331Ssaidi@eecs.umich.edu
441331Ssaidi@eecs.umich.eduusing namespace std;
451331Ssaidi@eecs.umich.eduusing namespace Stats;
461331Ssaidi@eecs.umich.edu
471331Ssaidi@eecs.umich.edunamespace AlphaISA {
481596Ssaidi@eecs.umich.edunamespace Kernel {
491596Ssaidi@eecs.umich.edu
501596Ssaidi@eecs.umich.educonst char *modestr[] = { "kernel", "user", "idle" };
511049Sbinkertn@umich.edu
521049Sbinkertn@umich.eduStatistics::Statistics(System *system)
531049Sbinkertn@umich.edu    : ::Kernel::Statistics(system),
541049Sbinkertn@umich.edu      idleProcess((Addr)-1), themode(kernel), lastModeTick(0)
551049Sbinkertn@umich.edu{
561049Sbinkertn@umich.edu}
571049Sbinkertn@umich.edu
581049Sbinkertn@umich.eduvoid
591049Sbinkertn@umich.eduStatistics::regStats(const string &_name)
601049Sbinkertn@umich.edu{
611049Sbinkertn@umich.edu    ::Kernel::Statistics::regStats(_name);
621049Sbinkertn@umich.edu
631049Sbinkertn@umich.edu    _callpal
641049Sbinkertn@umich.edu        .init(256)
651049Sbinkertn@umich.edu        .name(name() + ".callpal")
661049Sbinkertn@umich.edu        .desc("number of callpals executed")
671049Sbinkertn@umich.edu        .flags(total | pdf | nozero | nonan)
681049Sbinkertn@umich.edu        ;
691049Sbinkertn@umich.edu
701049Sbinkertn@umich.edu    for (int i = 0; i < PAL::NumCodes; ++i) {
711049Sbinkertn@umich.edu        const char *str = PAL::name(i);
721049Sbinkertn@umich.edu        if (str)
731049Sbinkertn@umich.edu            _callpal.subname(i, str);
741049Sbinkertn@umich.edu    }
751049Sbinkertn@umich.edu
761049Sbinkertn@umich.edu    _hwrei
771049Sbinkertn@umich.edu        .name(name() + ".inst.hwrei")
781049Sbinkertn@umich.edu        .desc("number of hwrei instructions executed")
791049Sbinkertn@umich.edu        ;
801049Sbinkertn@umich.edu
811049Sbinkertn@umich.edu    _mode
821049Sbinkertn@umich.edu        .init(cpu_mode_num)
831049Sbinkertn@umich.edu        .name(name() + ".mode_switch")
841049Sbinkertn@umich.edu        .desc("number of protection mode switches")
851049Sbinkertn@umich.edu        ;
861049Sbinkertn@umich.edu
871049Sbinkertn@umich.edu    for (int i = 0; i < cpu_mode_num; ++i)
881049Sbinkertn@umich.edu        _mode.subname(i, modestr[i]);
891049Sbinkertn@umich.edu
901049Sbinkertn@umich.edu    _modeGood
911049Sbinkertn@umich.edu        .init(cpu_mode_num)
921049Sbinkertn@umich.edu        .name(name() + ".mode_good")
931049Sbinkertn@umich.edu        ;
941049Sbinkertn@umich.edu
951049Sbinkertn@umich.edu    for (int i = 0; i < cpu_mode_num; ++i)
961049Sbinkertn@umich.edu        _modeGood.subname(i, modestr[i]);
971049Sbinkertn@umich.edu
981049Sbinkertn@umich.edu    _modeFraction
991049Sbinkertn@umich.edu        .name(name() + ".mode_switch_good")
1001049Sbinkertn@umich.edu        .desc("fraction of useful protection mode switches")
1011929Sbinkertn@umich.edu        .flags(total)
1021929Sbinkertn@umich.edu        ;
1031929Sbinkertn@umich.edu
1041929Sbinkertn@umich.edu    for (int i = 0; i < cpu_mode_num; ++i)
1051929Sbinkertn@umich.edu        _modeFraction.subname(i, modestr[i]);
1061929Sbinkertn@umich.edu
1071929Sbinkertn@umich.edu    _modeFraction = _modeGood / _mode;
1081929Sbinkertn@umich.edu
1091049Sbinkertn@umich.edu    _modeTicks
1101929Sbinkertn@umich.edu        .init(cpu_mode_num)
1111929Sbinkertn@umich.edu        .name(name() + ".mode_ticks")
1121049Sbinkertn@umich.edu        .desc("number of ticks spent at the given mode")
1131049Sbinkertn@umich.edu        .flags(pdf)
1141929Sbinkertn@umich.edu        ;
1151049Sbinkertn@umich.edu    for (int i = 0; i < cpu_mode_num; ++i)
1161049Sbinkertn@umich.edu        _modeTicks.subname(i, modestr[i]);
1171049Sbinkertn@umich.edu
1181929Sbinkertn@umich.edu    _swap_context
1191049Sbinkertn@umich.edu        .name(name() + ".swap_context")
1201049Sbinkertn@umich.edu        .desc("number of times the context was actually changed")
1211049Sbinkertn@umich.edu        ;
1221049Sbinkertn@umich.edu}
1231049Sbinkertn@umich.edu
1241049Sbinkertn@umich.eduvoid
1251049Sbinkertn@umich.eduStatistics::setIdleProcess(Addr idlepcbb, ThreadContext *tc)
1261049Sbinkertn@umich.edu{
1271049Sbinkertn@umich.edu    assert(themode == kernel);
1281049Sbinkertn@umich.edu    idleProcess = idlepcbb;
1291049Sbinkertn@umich.edu    themode = idle;
1301929Sbinkertn@umich.edu    changeMode(themode, tc);
1311049Sbinkertn@umich.edu}
1321049Sbinkertn@umich.edu
1331881Sbinkertn@umich.eduvoid
1341881Sbinkertn@umich.eduStatistics::changeMode(cpu_mode newmode, ThreadContext *tc)
1351929Sbinkertn@umich.edu{
1361881Sbinkertn@umich.edu    _mode[newmode]++;
1371929Sbinkertn@umich.edu
1381881Sbinkertn@umich.edu    if (newmode == themode)
1391881Sbinkertn@umich.edu        return;
1401881Sbinkertn@umich.edu
1411881Sbinkertn@umich.edu    DPRINTF(Context, "old mode=%s new mode=%s pid=%d\n",
1421881Sbinkertn@umich.edu            modestr[themode], modestr[newmode],
1431881Sbinkertn@umich.edu            Linux::ThreadInfo(tc).curTaskPID());
1441881Sbinkertn@umich.edu
1451929Sbinkertn@umich.edu    _modeGood[newmode]++;
1461881Sbinkertn@umich.edu    _modeTicks[themode] += curTick() - lastModeTick;
1471929Sbinkertn@umich.edu
1481881Sbinkertn@umich.edu    lastModeTick = curTick();
1491881Sbinkertn@umich.edu    themode = newmode;
1501881Sbinkertn@umich.edu}
1511881Sbinkertn@umich.edu
1521881Sbinkertn@umich.eduvoid
1531881Sbinkertn@umich.eduStatistics::mode(cpu_mode newmode, ThreadContext *tc)
1541881Sbinkertn@umich.edu{
1551929Sbinkertn@umich.edu    Addr pcbb = tc->readMiscRegNoEffect(IPR_PALtemp23);
1561881Sbinkertn@umich.edu
1571929Sbinkertn@umich.edu    if (newmode == kernel && pcbb == idleProcess)
1581881Sbinkertn@umich.edu        newmode = idle;
1591881Sbinkertn@umich.edu
1601881Sbinkertn@umich.edu    changeMode(newmode, tc);
1611881Sbinkertn@umich.edu}
1621881Sbinkertn@umich.edu
1631881Sbinkertn@umich.eduvoid
1641881Sbinkertn@umich.eduStatistics::context(Addr oldpcbb, Addr newpcbb, ThreadContext *tc)
1651881Sbinkertn@umich.edu{
1661881Sbinkertn@umich.edu    assert(themode != user);
1671929Sbinkertn@umich.edu
1681881Sbinkertn@umich.edu    _swap_context++;
1691881Sbinkertn@umich.edu    changeMode(newpcbb == idleProcess ? idle : kernel, tc);
1701309Ssaidi@eecs.umich.edu
1711331Ssaidi@eecs.umich.edu    DPRINTF(Context, "Context Switch old pid=%d new pid=%d\n",
1721331Ssaidi@eecs.umich.edu            Linux::ThreadInfo(tc, oldpcbb).curTaskPID(),
1731331Ssaidi@eecs.umich.edu            Linux::ThreadInfo(tc, newpcbb).curTaskPID());
1741331Ssaidi@eecs.umich.edu}
1751331Ssaidi@eecs.umich.edu
1761331Ssaidi@eecs.umich.eduvoid
1771331Ssaidi@eecs.umich.eduStatistics::callpal(int code, ThreadContext *tc)
1781929Sbinkertn@umich.edu{
1791929Sbinkertn@umich.edu    if (!PAL::name(code))
1801331Ssaidi@eecs.umich.edu        return;
1811881Sbinkertn@umich.edu
1821957Ssaidi@eecs.umich.edu    _callpal[code]++;
1831881Sbinkertn@umich.edu
1841881Sbinkertn@umich.edu    switch (code) {
1851881Sbinkertn@umich.edu      case PAL::callsys: {
1861309Ssaidi@eecs.umich.edu          int number = tc->readIntReg(0);
1871309Ssaidi@eecs.umich.edu          if (SystemCalls<Tru64>::validSyscallNumber(number)) {
1881309Ssaidi@eecs.umich.edu              int cvtnum = SystemCalls<Tru64>::convert(number);
1891881Sbinkertn@umich.edu              _syscall[cvtnum]++;
1901881Sbinkertn@umich.edu          }
1911881Sbinkertn@umich.edu      } break;
1921957Ssaidi@eecs.umich.edu    }
1931309Ssaidi@eecs.umich.edu}
1941309Ssaidi@eecs.umich.edu
1951309Ssaidi@eecs.umich.eduvoid
1961929Sbinkertn@umich.eduStatistics::serialize(ostream &os)
1971309Ssaidi@eecs.umich.edu{
1981309Ssaidi@eecs.umich.edu    ::Kernel::Statistics::serialize(os);
1991929Sbinkertn@umich.edu    int exemode = themode;
2001331Ssaidi@eecs.umich.edu    SERIALIZE_SCALAR(exemode);
2011317Ssaidi@eecs.umich.edu    SERIALIZE_SCALAR(idleProcess);
2021317Ssaidi@eecs.umich.edu    SERIALIZE_SCALAR(lastModeTick);
2031318Ssaidi@eecs.umich.edu}
2041318Ssaidi@eecs.umich.edu
2051331Ssaidi@eecs.umich.eduvoid
2061929Sbinkertn@umich.eduStatistics::unserialize(Checkpoint *cp, const string &section)
2071331Ssaidi@eecs.umich.edu{
2081331Ssaidi@eecs.umich.edu    ::Kernel::Statistics::unserialize(cp, section);
2091331Ssaidi@eecs.umich.edu    int exemode;
2101331Ssaidi@eecs.umich.edu    UNSERIALIZE_SCALAR(exemode);
2111331Ssaidi@eecs.umich.edu    UNSERIALIZE_SCALAR(idleProcess);
2121331Ssaidi@eecs.umich.edu    UNSERIALIZE_SCALAR(lastModeTick);
2131309Ssaidi@eecs.umich.edu    themode = (cpu_mode)exemode;
2141331Ssaidi@eecs.umich.edu}
2151929Sbinkertn@umich.edu
2161929Sbinkertn@umich.edu} // namespace Kernel
2171331Ssaidi@eecs.umich.edu} // namespace AlphaISA
2181331Ssaidi@eecs.umich.edu