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 §ion) 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