kernel_stats.cc revision 1108
113759Sgiacomo.gabrielli@arm.com/* 213759Sgiacomo.gabrielli@arm.com * Copyright (c) 2003 The Regents of The University of Michigan 313759Sgiacomo.gabrielli@arm.com * All rights reserved. 413759Sgiacomo.gabrielli@arm.com * 513759Sgiacomo.gabrielli@arm.com * Redistribution and use in source and binary forms, with or without 613759Sgiacomo.gabrielli@arm.com * modification, are permitted provided that the following conditions are 713759Sgiacomo.gabrielli@arm.com * met: redistributions of source code must retain the above copyright 813759Sgiacomo.gabrielli@arm.com * notice, this list of conditions and the following disclaimer; 913759Sgiacomo.gabrielli@arm.com * redistributions in binary form must reproduce the above copyright 1013759Sgiacomo.gabrielli@arm.com * notice, this list of conditions and the following disclaimer in the 1113759Sgiacomo.gabrielli@arm.com * documentation and/or other materials provided with the distribution; 1213759Sgiacomo.gabrielli@arm.com * neither the name of the copyright holders nor the names of its 1313759Sgiacomo.gabrielli@arm.com * contributors may be used to endorse or promote products derived from 1413759Sgiacomo.gabrielli@arm.com * this software without specific prior written permission. 1513759Sgiacomo.gabrielli@arm.com * 1613759Sgiacomo.gabrielli@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713759Sgiacomo.gabrielli@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813759Sgiacomo.gabrielli@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913759Sgiacomo.gabrielli@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013759Sgiacomo.gabrielli@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113759Sgiacomo.gabrielli@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213759Sgiacomo.gabrielli@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313759Sgiacomo.gabrielli@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413759Sgiacomo.gabrielli@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513759Sgiacomo.gabrielli@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613759Sgiacomo.gabrielli@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713759Sgiacomo.gabrielli@arm.com */ 2813759Sgiacomo.gabrielli@arm.com 2913759Sgiacomo.gabrielli@arm.com#include <map> 3013759Sgiacomo.gabrielli@arm.com#include <stack> 3113759Sgiacomo.gabrielli@arm.com#include <string> 3213759Sgiacomo.gabrielli@arm.com 3313759Sgiacomo.gabrielli@arm.com#include "arch/alpha/osfpal.hh" 3413759Sgiacomo.gabrielli@arm.com#include "base/trace.hh" 3513759Sgiacomo.gabrielli@arm.com#include "base/statistics.hh" 3613759Sgiacomo.gabrielli@arm.com#include "base/stats/bin.hh" 3713759Sgiacomo.gabrielli@arm.com#include "cpu/exec_context.hh" 3813759Sgiacomo.gabrielli@arm.com#include "cpu/pc_event.hh" 3913759Sgiacomo.gabrielli@arm.com#include "cpu/static_inst.hh" 4013759Sgiacomo.gabrielli@arm.com#include "kern/kernel_stats.hh" 4113759Sgiacomo.gabrielli@arm.com#include "kern/linux/linux_syscalls.hh" 4213759Sgiacomo.gabrielli@arm.com#include "kern/tru64/tru64_syscalls.hh" 4313759Sgiacomo.gabrielli@arm.com 4413759Sgiacomo.gabrielli@arm.comusing namespace std; 4513759Sgiacomo.gabrielli@arm.comusing namespace Stats; 4613759Sgiacomo.gabrielli@arm.com 4713759Sgiacomo.gabrielli@arm.comnamespace Kernel { 4813759Sgiacomo.gabrielli@arm.com 4913759Sgiacomo.gabrielli@arm.comconst char *modestr[] = { "kernel", "user", "idle", "interrupt" }; 5013759Sgiacomo.gabrielli@arm.com 5113759Sgiacomo.gabrielli@arm.comStatistics::Statistics(ExecContext *context) 5213759Sgiacomo.gabrielli@arm.com : xc(context), idleProcess((Addr)-1), themode(kernel), lastModeTick(0), 5313759Sgiacomo.gabrielli@arm.com iplLast(0), iplLastTick(0) 5413759Sgiacomo.gabrielli@arm.com{ 5513759Sgiacomo.gabrielli@arm.com bin_int = xc->system->params->bin_int; 5613759Sgiacomo.gabrielli@arm.com} 5713759Sgiacomo.gabrielli@arm.com 5813759Sgiacomo.gabrielli@arm.comvoid 5913759Sgiacomo.gabrielli@arm.comStatistics::regStats(const string &_name) 6013759Sgiacomo.gabrielli@arm.com{ 6113759Sgiacomo.gabrielli@arm.com myname = _name; 6213759Sgiacomo.gabrielli@arm.com 6313759Sgiacomo.gabrielli@arm.com _arm 6413759Sgiacomo.gabrielli@arm.com .name(name() + ".inst.arm") 6513759Sgiacomo.gabrielli@arm.com .desc("number of arm instructions executed") 6613759Sgiacomo.gabrielli@arm.com ; 6713759Sgiacomo.gabrielli@arm.com 6813759Sgiacomo.gabrielli@arm.com _quiesce 6913759Sgiacomo.gabrielli@arm.com .name(name() + ".inst.quiesce") 7013759Sgiacomo.gabrielli@arm.com .desc("number of quiesce instructions executed") 7113759Sgiacomo.gabrielli@arm.com ; 7213759Sgiacomo.gabrielli@arm.com 7313759Sgiacomo.gabrielli@arm.com _ivlb 7413759Sgiacomo.gabrielli@arm.com .name(name() + ".inst.ivlb") 7513759Sgiacomo.gabrielli@arm.com .desc("number of ivlb instructions executed") 7613759Sgiacomo.gabrielli@arm.com ; 7713759Sgiacomo.gabrielli@arm.com 7813759Sgiacomo.gabrielli@arm.com _ivle 7913759Sgiacomo.gabrielli@arm.com .name(name() + ".inst.ivle") 8013759Sgiacomo.gabrielli@arm.com .desc("number of ivle instructions executed") 8113759Sgiacomo.gabrielli@arm.com ; 8213759Sgiacomo.gabrielli@arm.com 8313759Sgiacomo.gabrielli@arm.com _hwrei 8413759Sgiacomo.gabrielli@arm.com .name(name() + ".inst.hwrei") 8513759Sgiacomo.gabrielli@arm.com .desc("number of hwrei instructions executed") 8613759Sgiacomo.gabrielli@arm.com ; 8713759Sgiacomo.gabrielli@arm.com 8813759Sgiacomo.gabrielli@arm.com _iplCount 8913759Sgiacomo.gabrielli@arm.com .init(32) 9013759Sgiacomo.gabrielli@arm.com .name(name() + ".ipl_count") 9113759Sgiacomo.gabrielli@arm.com .desc("number of times we switched to this ipl") 9213759Sgiacomo.gabrielli@arm.com .flags(total | pdf | nozero | nonan) 9313759Sgiacomo.gabrielli@arm.com ; 9413759Sgiacomo.gabrielli@arm.com 9513759Sgiacomo.gabrielli@arm.com _iplGood 9613759Sgiacomo.gabrielli@arm.com .init(32) 9713759Sgiacomo.gabrielli@arm.com .name(name() + ".ipl_good") 9813759Sgiacomo.gabrielli@arm.com .desc("number of times we switched to this ipl from a different ipl") 9913759Sgiacomo.gabrielli@arm.com .flags(total | pdf | nozero | nonan) 10013759Sgiacomo.gabrielli@arm.com ; 10113759Sgiacomo.gabrielli@arm.com 10213759Sgiacomo.gabrielli@arm.com _iplTicks 10313759Sgiacomo.gabrielli@arm.com .init(32) 10413759Sgiacomo.gabrielli@arm.com .name(name() + ".ipl_ticks") 10513759Sgiacomo.gabrielli@arm.com .desc("number of cycles we spent at this ipl") 10613759Sgiacomo.gabrielli@arm.com .flags(total | pdf | nozero | nonan) 10713759Sgiacomo.gabrielli@arm.com ; 10813759Sgiacomo.gabrielli@arm.com 10913759Sgiacomo.gabrielli@arm.com _iplUsed 11013759Sgiacomo.gabrielli@arm.com .name(name() + ".ipl_used") 11113759Sgiacomo.gabrielli@arm.com .desc("fraction of swpipl calls that actually changed the ipl") 11213759Sgiacomo.gabrielli@arm.com .flags(total | nozero | nonan) 11313759Sgiacomo.gabrielli@arm.com ; 11413759Sgiacomo.gabrielli@arm.com 11513759Sgiacomo.gabrielli@arm.com _iplUsed = _iplGood / _iplCount; 11613759Sgiacomo.gabrielli@arm.com 11713759Sgiacomo.gabrielli@arm.com _callpal 11813759Sgiacomo.gabrielli@arm.com .init(256) 11913759Sgiacomo.gabrielli@arm.com .name(name() + ".callpal") 12013759Sgiacomo.gabrielli@arm.com .desc("number of callpals executed") 12113759Sgiacomo.gabrielli@arm.com .flags(total | pdf | nozero | nonan) 12213759Sgiacomo.gabrielli@arm.com ; 12313759Sgiacomo.gabrielli@arm.com 12413759Sgiacomo.gabrielli@arm.com for (int i = 0; i < PAL::NumCodes; ++i) { 12513759Sgiacomo.gabrielli@arm.com const char *str = PAL::name(i); 12613759Sgiacomo.gabrielli@arm.com if (str) 12713759Sgiacomo.gabrielli@arm.com _callpal.subname(i, str); 12813759Sgiacomo.gabrielli@arm.com } 12913759Sgiacomo.gabrielli@arm.com 13013759Sgiacomo.gabrielli@arm.com _syscall 13113759Sgiacomo.gabrielli@arm.com .init(SystemCalls<Tru64>::Number) 13213759Sgiacomo.gabrielli@arm.com .name(name() + ".syscall") 13313759Sgiacomo.gabrielli@arm.com .desc("number of syscalls executed") 13413759Sgiacomo.gabrielli@arm.com .flags(total | pdf | nozero | nonan) 13513759Sgiacomo.gabrielli@arm.com ; 13613759Sgiacomo.gabrielli@arm.com 13713759Sgiacomo.gabrielli@arm.com for (int i = 0; i < SystemCalls<Tru64>::Number; ++i) { 13813759Sgiacomo.gabrielli@arm.com const char *str = SystemCalls<Tru64>::name(i); 13913759Sgiacomo.gabrielli@arm.com if (str) { 14013759Sgiacomo.gabrielli@arm.com _syscall.subname(i, str); 14113759Sgiacomo.gabrielli@arm.com } 14213759Sgiacomo.gabrielli@arm.com } 14313759Sgiacomo.gabrielli@arm.com 14413759Sgiacomo.gabrielli@arm.com _faults 14513759Sgiacomo.gabrielli@arm.com .init(Num_Faults) 14613759Sgiacomo.gabrielli@arm.com .name(name() + ".faults") 14713759Sgiacomo.gabrielli@arm.com .desc("number of faults") 14813759Sgiacomo.gabrielli@arm.com .flags(total | pdf | nozero | nonan) 14913759Sgiacomo.gabrielli@arm.com ; 15013759Sgiacomo.gabrielli@arm.com 15113759Sgiacomo.gabrielli@arm.com for (int i = 1; i < Num_Faults; ++i) { 15213759Sgiacomo.gabrielli@arm.com const char *str = FaultName(i); 15313759Sgiacomo.gabrielli@arm.com if (str) 15413759Sgiacomo.gabrielli@arm.com _faults.subname(i, str); 15513759Sgiacomo.gabrielli@arm.com } 15613759Sgiacomo.gabrielli@arm.com 15713759Sgiacomo.gabrielli@arm.com _mode 15813759Sgiacomo.gabrielli@arm.com .init(cpu_mode_num) 15913759Sgiacomo.gabrielli@arm.com .name(name() + ".mode_switch") 16013759Sgiacomo.gabrielli@arm.com .desc("number of protection mode switches") 16113759Sgiacomo.gabrielli@arm.com ; 16213759Sgiacomo.gabrielli@arm.com 16313759Sgiacomo.gabrielli@arm.com for (int i = 0; i < cpu_mode_num; ++i) 16413759Sgiacomo.gabrielli@arm.com _mode.subname(i, modestr[i]); 16513759Sgiacomo.gabrielli@arm.com 16613759Sgiacomo.gabrielli@arm.com _modeGood 16713759Sgiacomo.gabrielli@arm.com .init(cpu_mode_num) 16813759Sgiacomo.gabrielli@arm.com .name(name() + ".mode_good") 16913759Sgiacomo.gabrielli@arm.com ; 17013759Sgiacomo.gabrielli@arm.com 17113759Sgiacomo.gabrielli@arm.com for (int i = 0; i < cpu_mode_num; ++i) 17213759Sgiacomo.gabrielli@arm.com _modeGood.subname(i, modestr[i]); 17313759Sgiacomo.gabrielli@arm.com 17413759Sgiacomo.gabrielli@arm.com _modeFraction 17513759Sgiacomo.gabrielli@arm.com .name(name() + ".mode_switch_good") 17613759Sgiacomo.gabrielli@arm.com .desc("fraction of useful protection mode switches") 17713759Sgiacomo.gabrielli@arm.com .flags(total) 17813759Sgiacomo.gabrielli@arm.com ; 17913759Sgiacomo.gabrielli@arm.com 18013759Sgiacomo.gabrielli@arm.com for (int i = 0; i < cpu_mode_num; ++i) 18113759Sgiacomo.gabrielli@arm.com _modeFraction.subname(i, modestr[i]); 18213759Sgiacomo.gabrielli@arm.com 18313759Sgiacomo.gabrielli@arm.com _modeFraction = _modeGood / _mode; 18413759Sgiacomo.gabrielli@arm.com 18513759Sgiacomo.gabrielli@arm.com _modeTicks 18613759Sgiacomo.gabrielli@arm.com .init(cpu_mode_num) 18713759Sgiacomo.gabrielli@arm.com .name(name() + ".mode_ticks") 18813759Sgiacomo.gabrielli@arm.com .desc("number of ticks spent at the given mode") 18913759Sgiacomo.gabrielli@arm.com .flags(pdf) 19013759Sgiacomo.gabrielli@arm.com ; 19113759Sgiacomo.gabrielli@arm.com for (int i = 0; i < cpu_mode_num; ++i) 19213759Sgiacomo.gabrielli@arm.com _modeTicks.subname(i, modestr[i]); 19313759Sgiacomo.gabrielli@arm.com 19413759Sgiacomo.gabrielli@arm.com _swap_context 19513759Sgiacomo.gabrielli@arm.com .name(name() + ".swap_context") 19613759Sgiacomo.gabrielli@arm.com .desc("number of times the context was actually changed") 19713759Sgiacomo.gabrielli@arm.com ; 19813759Sgiacomo.gabrielli@arm.com} 19913759Sgiacomo.gabrielli@arm.com 20013759Sgiacomo.gabrielli@arm.comvoid 20113759Sgiacomo.gabrielli@arm.comStatistics::setIdleProcess(Addr idlepcbb) 20213759Sgiacomo.gabrielli@arm.com{ 20313759Sgiacomo.gabrielli@arm.com assert(themode == kernel || themode == interrupt); 20413759Sgiacomo.gabrielli@arm.com idleProcess = idlepcbb; 20513759Sgiacomo.gabrielli@arm.com themode = idle; 20613759Sgiacomo.gabrielli@arm.com changeMode(themode); 20713759Sgiacomo.gabrielli@arm.com} 20813759Sgiacomo.gabrielli@arm.com 20913759Sgiacomo.gabrielli@arm.comvoid 21013759Sgiacomo.gabrielli@arm.comStatistics::changeMode(cpu_mode newmode) 21113759Sgiacomo.gabrielli@arm.com{ 21213759Sgiacomo.gabrielli@arm.com _mode[newmode]++; 21313759Sgiacomo.gabrielli@arm.com 21413759Sgiacomo.gabrielli@arm.com if (newmode == themode) 21513759Sgiacomo.gabrielli@arm.com return; 21613759Sgiacomo.gabrielli@arm.com 21713759Sgiacomo.gabrielli@arm.com DPRINTF(Context, "old mode=%-8s new mode=%-8s\n", 21813759Sgiacomo.gabrielli@arm.com modestr[themode], modestr[newmode]); 21913759Sgiacomo.gabrielli@arm.com 22013759Sgiacomo.gabrielli@arm.com _modeGood[newmode]++; 22113759Sgiacomo.gabrielli@arm.com _modeTicks[themode] += curTick - lastModeTick; 22213759Sgiacomo.gabrielli@arm.com 22313759Sgiacomo.gabrielli@arm.com xc->system->kernelBinning->changeMode(newmode); 22413759Sgiacomo.gabrielli@arm.com 22513759Sgiacomo.gabrielli@arm.com lastModeTick = curTick; 22613759Sgiacomo.gabrielli@arm.com themode = newmode; 22713759Sgiacomo.gabrielli@arm.com} 22813759Sgiacomo.gabrielli@arm.com 22913759Sgiacomo.gabrielli@arm.comvoid 23013759Sgiacomo.gabrielli@arm.comStatistics::swpipl(int ipl) 23113759Sgiacomo.gabrielli@arm.com{ 23213759Sgiacomo.gabrielli@arm.com assert(ipl >= 0 && ipl <= 0x1f && "invalid IPL\n"); 23313759Sgiacomo.gabrielli@arm.com 23413759Sgiacomo.gabrielli@arm.com _iplCount[ipl]++; 23513759Sgiacomo.gabrielli@arm.com 23613759Sgiacomo.gabrielli@arm.com if (ipl == iplLast) 23713759Sgiacomo.gabrielli@arm.com return; 23813759Sgiacomo.gabrielli@arm.com 23913759Sgiacomo.gabrielli@arm.com _iplGood[ipl]++; 24013759Sgiacomo.gabrielli@arm.com _iplTicks[iplLast] += curTick - iplLastTick; 24113759Sgiacomo.gabrielli@arm.com iplLastTick = curTick; 24213759Sgiacomo.gabrielli@arm.com iplLast = ipl; 24313759Sgiacomo.gabrielli@arm.com} 24413759Sgiacomo.gabrielli@arm.com 24513759Sgiacomo.gabrielli@arm.comvoid 24613759Sgiacomo.gabrielli@arm.comStatistics::mode(cpu_mode newmode) 24713759Sgiacomo.gabrielli@arm.com{ 24813759Sgiacomo.gabrielli@arm.com Addr pcbb = xc->regs.ipr[AlphaISA::IPR_PALtemp23]; 24913759Sgiacomo.gabrielli@arm.com 25013759Sgiacomo.gabrielli@arm.com if ((newmode == kernel || newmode == interrupt) && 25113759Sgiacomo.gabrielli@arm.com pcbb == idleProcess) 25213759Sgiacomo.gabrielli@arm.com newmode = idle; 25313759Sgiacomo.gabrielli@arm.com 25413759Sgiacomo.gabrielli@arm.com if (bin_int == false && newmode == interrupt) 25513759Sgiacomo.gabrielli@arm.com newmode = kernel; 25613759Sgiacomo.gabrielli@arm.com 25713759Sgiacomo.gabrielli@arm.com changeMode(newmode); 25813759Sgiacomo.gabrielli@arm.com} 25913759Sgiacomo.gabrielli@arm.com 26013759Sgiacomo.gabrielli@arm.comvoid 26113759Sgiacomo.gabrielli@arm.comStatistics::context(Addr oldpcbb, Addr newpcbb) 26213759Sgiacomo.gabrielli@arm.com{ 26313759Sgiacomo.gabrielli@arm.com assert(themode != user); 26413759Sgiacomo.gabrielli@arm.com 26513759Sgiacomo.gabrielli@arm.com _swap_context++; 26613759Sgiacomo.gabrielli@arm.com changeMode(newpcbb == idleProcess ? idle : kernel); 26713759Sgiacomo.gabrielli@arm.com} 26813759Sgiacomo.gabrielli@arm.com 26913759Sgiacomo.gabrielli@arm.comvoid 27013759Sgiacomo.gabrielli@arm.comStatistics::callpal(int code) 27113759Sgiacomo.gabrielli@arm.com{ 27213759Sgiacomo.gabrielli@arm.com if (!PAL::name(code)) 27313759Sgiacomo.gabrielli@arm.com return; 27413759Sgiacomo.gabrielli@arm.com 27513759Sgiacomo.gabrielli@arm.com _callpal[code]++; 27613759Sgiacomo.gabrielli@arm.com 27713759Sgiacomo.gabrielli@arm.com switch (code) { 27813759Sgiacomo.gabrielli@arm.com case PAL::callsys: { 27913759Sgiacomo.gabrielli@arm.com int number = xc->regs.intRegFile[0]; 28013759Sgiacomo.gabrielli@arm.com if (SystemCalls<Tru64>::validSyscallNumber(number)) { 28113759Sgiacomo.gabrielli@arm.com int cvtnum = SystemCalls<Tru64>::convert(number); 28213759Sgiacomo.gabrielli@arm.com _syscall[cvtnum]++; 28313759Sgiacomo.gabrielli@arm.com } 28413759Sgiacomo.gabrielli@arm.com } break; 28513759Sgiacomo.gabrielli@arm.com 28613759Sgiacomo.gabrielli@arm.com case PAL::swpctx: 28713759Sgiacomo.gabrielli@arm.com if (xc->system->kernelBinning) 28813759Sgiacomo.gabrielli@arm.com xc->system->kernelBinning->palSwapContext(xc); 28913759Sgiacomo.gabrielli@arm.com break; 29013759Sgiacomo.gabrielli@arm.com } 29113759Sgiacomo.gabrielli@arm.com} 29213759Sgiacomo.gabrielli@arm.com 29313759Sgiacomo.gabrielli@arm.comvoid 29413759Sgiacomo.gabrielli@arm.comStatistics::serialize(ostream &os) 29513759Sgiacomo.gabrielli@arm.com{ 29613759Sgiacomo.gabrielli@arm.com int exemode = themode; 29713759Sgiacomo.gabrielli@arm.com SERIALIZE_SCALAR(exemode); 29813759Sgiacomo.gabrielli@arm.com SERIALIZE_SCALAR(idleProcess); 29913759Sgiacomo.gabrielli@arm.com SERIALIZE_SCALAR(iplLast); 30013759Sgiacomo.gabrielli@arm.com SERIALIZE_SCALAR(iplLastTick); 30113759Sgiacomo.gabrielli@arm.com SERIALIZE_SCALAR(lastModeTick); 30213759Sgiacomo.gabrielli@arm.com} 30313759Sgiacomo.gabrielli@arm.com 30413759Sgiacomo.gabrielli@arm.comvoid 30513759Sgiacomo.gabrielli@arm.comStatistics::unserialize(Checkpoint *cp, const string §ion) 30613759Sgiacomo.gabrielli@arm.com{ 30713759Sgiacomo.gabrielli@arm.com int exemode; 30813759Sgiacomo.gabrielli@arm.com UNSERIALIZE_SCALAR(exemode); 30913759Sgiacomo.gabrielli@arm.com UNSERIALIZE_SCALAR(idleProcess); 31013759Sgiacomo.gabrielli@arm.com UNSERIALIZE_SCALAR(iplLast); 31113759Sgiacomo.gabrielli@arm.com UNSERIALIZE_SCALAR(iplLastTick); 31213759Sgiacomo.gabrielli@arm.com UNSERIALIZE_SCALAR(lastModeTick); 31313759Sgiacomo.gabrielli@arm.com themode = (cpu_mode)exemode; 31413759Sgiacomo.gabrielli@arm.com} 31513759Sgiacomo.gabrielli@arm.com 31613759Sgiacomo.gabrielli@arm.com/* end namespace Kernel */ } 31713759Sgiacomo.gabrielli@arm.com