kernel_stats.cc revision 3560
16892SBrad.Beckmann@amd.com/* 26892SBrad.Beckmann@amd.com * Copyright (c) 2004-2005 The Regents of The University of Michigan 36892SBrad.Beckmann@amd.com * All rights reserved. 46892SBrad.Beckmann@amd.com * 56892SBrad.Beckmann@amd.com * Redistribution and use in source and binary forms, with or without 66892SBrad.Beckmann@amd.com * modification, are permitted provided that the following conditions are 76892SBrad.Beckmann@amd.com * met: redistributions of source code must retain the above copyright 86892SBrad.Beckmann@amd.com * notice, this list of conditions and the following disclaimer; 96892SBrad.Beckmann@amd.com * redistributions in binary form must reproduce the above copyright 106892SBrad.Beckmann@amd.com * notice, this list of conditions and the following disclaimer in the 116892SBrad.Beckmann@amd.com * documentation and/or other materials provided with the distribution; 126892SBrad.Beckmann@amd.com * neither the name of the copyright holders nor the names of its 136892SBrad.Beckmann@amd.com * contributors may be used to endorse or promote products derived from 146892SBrad.Beckmann@amd.com * this software without specific prior written permission. 156892SBrad.Beckmann@amd.com * 166892SBrad.Beckmann@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176892SBrad.Beckmann@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186892SBrad.Beckmann@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196892SBrad.Beckmann@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206892SBrad.Beckmann@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216892SBrad.Beckmann@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226892SBrad.Beckmann@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236892SBrad.Beckmann@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246892SBrad.Beckmann@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256892SBrad.Beckmann@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266892SBrad.Beckmann@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276892SBrad.Beckmann@amd.com * 286892SBrad.Beckmann@amd.com * Authors: Lisa Hsu 296892SBrad.Beckmann@amd.com * Nathan Binkert 306892SBrad.Beckmann@amd.com */ 316892SBrad.Beckmann@amd.com 326892SBrad.Beckmann@amd.com#include <map> 336892SBrad.Beckmann@amd.com#include <stack> 346892SBrad.Beckmann@amd.com#include <string> 356892SBrad.Beckmann@amd.com 366892SBrad.Beckmann@amd.com#include "kern/alpha/kernel_stats.hh" 376893SBrad.Beckmann@amd.com#include "arch/alpha/osfpal.hh" 386892SBrad.Beckmann@amd.com#include "base/trace.hh" 396892SBrad.Beckmann@amd.com#include "cpu/thread_context.hh" 406892SBrad.Beckmann@amd.com#include "kern/tru64/tru64_syscalls.hh" 416892SBrad.Beckmann@amd.com#include "sim/system.hh" 426893SBrad.Beckmann@amd.com 436893SBrad.Beckmann@amd.comusing namespace std; 446893SBrad.Beckmann@amd.comusing namespace Stats; 456893SBrad.Beckmann@amd.com 466893SBrad.Beckmann@amd.comnamespace AlphaISA { 476892SBrad.Beckmann@amd.comnamespace Kernel { 486892SBrad.Beckmann@amd.com 496892SBrad.Beckmann@amd.comconst char *modestr[] = { "kernel", "user", "idle" }; 506892SBrad.Beckmann@amd.com 516892SBrad.Beckmann@amd.comStatistics::Statistics(System *system) 526892SBrad.Beckmann@amd.com : ::Kernel::Statistics(system), 536892SBrad.Beckmann@amd.com idleProcess((Addr)-1), themode(kernel), lastModeTick(0) 546892SBrad.Beckmann@amd.com{ 556892SBrad.Beckmann@amd.com} 566892SBrad.Beckmann@amd.com 576903SBrad.Beckmann@amd.comvoid 586903SBrad.Beckmann@amd.comStatistics::regStats(const string &_name) 596903SBrad.Beckmann@amd.com{ 606903SBrad.Beckmann@amd.com ::Kernel::Statistics::regStats(_name); 616903SBrad.Beckmann@amd.com 626903SBrad.Beckmann@amd.com _callpal 636892SBrad.Beckmann@amd.com .init(256) 646897SBrad.Beckmann@amd.com .name(name() + ".callpal") 656892SBrad.Beckmann@amd.com .desc("number of callpals executed") 666893SBrad.Beckmann@amd.com .flags(total | pdf | nozero | nonan) 676892SBrad.Beckmann@amd.com ; 686892SBrad.Beckmann@amd.com 696892SBrad.Beckmann@amd.com for (int i = 0; i < PAL::NumCodes; ++i) { 706892SBrad.Beckmann@amd.com const char *str = PAL::name(i); 716892SBrad.Beckmann@amd.com if (str) 726892SBrad.Beckmann@amd.com _callpal.subname(i, str); 736903SBrad.Beckmann@amd.com } 746892SBrad.Beckmann@amd.com 756893SBrad.Beckmann@amd.com _hwrei 766892SBrad.Beckmann@amd.com .name(name() + ".inst.hwrei") 776892SBrad.Beckmann@amd.com .desc("number of hwrei instructions executed") 78 ; 79 80 _mode 81 .init(cpu_mode_num) 82 .name(name() + ".mode_switch") 83 .desc("number of protection mode switches") 84 ; 85 86 for (int i = 0; i < cpu_mode_num; ++i) 87 _mode.subname(i, modestr[i]); 88 89 _modeGood 90 .init(cpu_mode_num) 91 .name(name() + ".mode_good") 92 ; 93 94 for (int i = 0; i < cpu_mode_num; ++i) 95 _modeGood.subname(i, modestr[i]); 96 97 _modeFraction 98 .name(name() + ".mode_switch_good") 99 .desc("fraction of useful protection mode switches") 100 .flags(total) 101 ; 102 103 for (int i = 0; i < cpu_mode_num; ++i) 104 _modeFraction.subname(i, modestr[i]); 105 106 _modeFraction = _modeGood / _mode; 107 108 _modeTicks 109 .init(cpu_mode_num) 110 .name(name() + ".mode_ticks") 111 .desc("number of ticks spent at the given mode") 112 .flags(pdf) 113 ; 114 for (int i = 0; i < cpu_mode_num; ++i) 115 _modeTicks.subname(i, modestr[i]); 116 117 _swap_context 118 .name(name() + ".swap_context") 119 .desc("number of times the context was actually changed") 120 ; 121} 122 123void 124Statistics::setIdleProcess(Addr idlepcbb, ThreadContext *tc) 125{ 126 assert(themode == kernel); 127 idleProcess = idlepcbb; 128 themode = idle; 129 changeMode(themode, tc); 130} 131 132void 133Statistics::changeMode(cpu_mode newmode, ThreadContext *tc) 134{ 135 _mode[newmode]++; 136 137 if (newmode == themode) 138 return; 139 140 DPRINTF(Context, "old mode=%-8s new mode=%-8s\n", 141 modestr[themode], modestr[newmode]); 142 143 _modeGood[newmode]++; 144 _modeTicks[themode] += curTick - lastModeTick; 145 146 lastModeTick = curTick; 147 themode = newmode; 148} 149 150void 151Statistics::mode(cpu_mode newmode, ThreadContext *tc) 152{ 153 Addr pcbb = tc->readMiscReg(AlphaISA::IPR_PALtemp23); 154 155 if (newmode == kernel && pcbb == idleProcess) 156 newmode = idle; 157 158 changeMode(newmode, tc); 159} 160 161void 162Statistics::context(Addr oldpcbb, Addr newpcbb, ThreadContext *tc) 163{ 164 assert(themode != user); 165 166 _swap_context++; 167 changeMode(newpcbb == idleProcess ? idle : kernel, tc); 168} 169 170void 171Statistics::callpal(int code, ThreadContext *tc) 172{ 173 if (!PAL::name(code)) 174 return; 175 176 _callpal[code]++; 177 178 switch (code) { 179 case PAL::callsys: { 180 int number = tc->readIntReg(0); 181 if (SystemCalls<Tru64>::validSyscallNumber(number)) { 182 int cvtnum = SystemCalls<Tru64>::convert(number); 183 _syscall[cvtnum]++; 184 } 185 } break; 186 } 187} 188 189void 190Statistics::serialize(ostream &os) 191{ 192 ::Kernel::Statistics::serialize(os); 193 int exemode = themode; 194 SERIALIZE_SCALAR(exemode); 195 SERIALIZE_SCALAR(idleProcess); 196 SERIALIZE_SCALAR(lastModeTick); 197} 198 199void 200Statistics::unserialize(Checkpoint *cp, const string §ion) 201{ 202 ::Kernel::Statistics::unserialize(cp, section); 203 int exemode; 204 UNSERIALIZE_SCALAR(exemode); 205 UNSERIALIZE_SCALAR(idleProcess); 206 UNSERIALIZE_SCALAR(lastModeTick); 207 themode = (cpu_mode)exemode; 208} 209 210} /* end namespace AlphaISA::Kernel */ 211} /* end namespace AlphaISA */ 212