simple_thread.cc revision 11793
12SN/A/* 22188SN/A * Copyright (c) 2001-2006 The Regents of The University of Michigan 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665SN/A * 282665SN/A * Authors: Steve Reinhardt 292665SN/A * Nathan Binkert 302665SN/A * Lisa Hsu 312665SN/A * Kevin Lim 322SN/A */ 332SN/A 3411793Sbrandon.potter@amd.com#include "cpu/simple_thread.hh" 3511793Sbrandon.potter@amd.com 362SN/A#include <string> 372SN/A 382465SN/A#include "arch/isa_traits.hh" 393565Sgblack@eecs.umich.edu#include "arch/kernel_stats.hh" 405529Snate@binkert.org#include "arch/stacktrace.hh" 418777Sgblack@eecs.umich.edu#include "arch/utility.hh" 421917SN/A#include "base/callback.hh" 431070SN/A#include "base/cprintf.hh" 441917SN/A#include "base/output.hh" 452188SN/A#include "base/trace.hh" 468777Sgblack@eecs.umich.edu#include "config/the_isa.hh" 478777Sgblack@eecs.umich.edu#include "cpu/base.hh" 481917SN/A#include "cpu/profile.hh" 492290SN/A#include "cpu/quiesce_event.hh" 508777Sgblack@eecs.umich.edu#include "cpu/thread_context.hh" 518706Sandreas.hansson@arm.com#include "mem/fs_translating_port_proxy.hh" 528799Sgblack@eecs.umich.edu#include "mem/se_translating_port_proxy.hh" 538809Sgblack@eecs.umich.edu#include "params/BaseCPU.hh" 5410319SAndreas.Sandberg@ARM.com#include "sim/faults.hh" 558793Sgblack@eecs.umich.edu#include "sim/full_system.hh" 568777Sgblack@eecs.umich.edu#include "sim/process.hh" 571070SN/A#include "sim/serialize.hh" 581917SN/A#include "sim/sim_exit.hh" 592519SN/A#include "sim/system.hh" 602SN/A 612SN/Ausing namespace std; 622SN/A 632SN/A// constructor 648820Sgblack@eecs.umich.eduSimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys, 658820Sgblack@eecs.umich.edu Process *_process, TheISA::TLB *_itb, 669384SAndreas.Sandberg@arm.com TheISA::TLB *_dtb, TheISA::ISA *_isa) 6710537Sandreas.hansson@arm.com : ThreadState(_cpu, _thread_num, _process), isa(_isa), 6810537Sandreas.hansson@arm.com predicate(false), system(_sys), 699384SAndreas.Sandberg@arm.com itb(_itb), dtb(_dtb) 708766Sgblack@eecs.umich.edu{ 718766Sgblack@eecs.umich.edu clearArchRegs(); 728766Sgblack@eecs.umich.edu tc = new ProxyThreadContext<SimpleThread>(this); 7311627Smichael.lebeane@amd.com quiesceEvent = new EndQuiesceEvent(tc); 748766Sgblack@eecs.umich.edu} 759377Sgblack@eecs.umich.edu 762683Sktlim@umich.eduSimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys, 776022Sgblack@eecs.umich.edu TheISA::TLB *_itb, TheISA::TLB *_dtb, 789384SAndreas.Sandberg@arm.com TheISA::ISA *_isa, bool use_kernel_stats) 799384SAndreas.Sandberg@arm.com : ThreadState(_cpu, _thread_num, NULL), isa(_isa), system(_sys), itb(_itb), 809384SAndreas.Sandberg@arm.com dtb(_dtb) 812SN/A{ 822683Sktlim@umich.edu tc = new ProxyThreadContext<SimpleThread>(this); 832190SN/A 842680SN/A quiesceEvent = new EndQuiesceEvent(tc); 852290SN/A 866316Sgblack@eecs.umich.edu clearArchRegs(); 871917SN/A 888735Sandreas.hanson@arm.com if (baseCpu->params()->profile) { 891982SN/A profile = new FunctionProfile(system->kernelSymtab); 901917SN/A Callback *cb = 912683Sktlim@umich.edu new MakeCallback<SimpleThread, 922683Sktlim@umich.edu &SimpleThread::dumpFuncProfile>(this); 931917SN/A registerExitCallback(cb); 941917SN/A } 951917SN/A 961917SN/A // let's fill with a dummy node for now so we don't get a segfault 971917SN/A // on the first cycle when there's no node available. 981917SN/A static ProfileNode dummyNode; 991917SN/A profileNode = &dummyNode; 1001917SN/A profilePC = 3; 1012521SN/A 1025482Snate@binkert.org if (use_kernel_stats) 1033548Sgblack@eecs.umich.edu kernelStats = new TheISA::Kernel::Statistics(system); 1042SN/A} 1052862Sktlim@umich.edu 1062683Sktlim@umich.eduSimpleThread::~SimpleThread() 1071070SN/A{ 1082680SN/A delete tc; 1091070SN/A} 1101070SN/A 1111917SN/Avoid 1122683Sktlim@umich.eduSimpleThread::takeOverFrom(ThreadContext *oldContext) 113180SN/A{ 1149441SAndreas.Sandberg@ARM.com ::takeOverFrom(*tc, *oldContext); 1159478Snilay@cs.wisc.edu decoder.takeOverFrom(oldContext->getDecoderPtr()); 116180SN/A 1179441SAndreas.Sandberg@ARM.com kernelStats = oldContext->getKernelStats(); 1189441SAndreas.Sandberg@ARM.com funcExeInst = oldContext->readFuncExeInst(); 119180SN/A storeCondFailures = 0; 1202864Sktlim@umich.edu} 1212864Sktlim@umich.edu 1222864Sktlim@umich.eduvoid 1232862Sktlim@umich.eduSimpleThread::copyState(ThreadContext *oldContext) 1242862Sktlim@umich.edu{ 1252862Sktlim@umich.edu // copy over functional state 1262862Sktlim@umich.edu _status = oldContext->status(); 1272862Sktlim@umich.edu copyArchRegs(oldContext); 1288793Sgblack@eecs.umich.edu if (FullSystem) 1298793Sgblack@eecs.umich.edu funcExeInst = oldContext->readFuncExeInst(); 1305714Shsul@eecs.umich.edu 1315715Shsul@eecs.umich.edu _threadId = oldContext->threadId(); 1325714Shsul@eecs.umich.edu _contextId = oldContext->contextId(); 1332862Sktlim@umich.edu} 1342862Sktlim@umich.edu 1352862Sktlim@umich.eduvoid 13610905Sandreas.sandberg@arm.comSimpleThread::serialize(CheckpointOut &cp) const 137217SN/A{ 13810905Sandreas.sandberg@arm.com ThreadState::serialize(cp); 13910905Sandreas.sandberg@arm.com ::serialize(*tc, cp); 140217SN/A} 141217SN/A 142217SN/A 143217SN/Avoid 14410905Sandreas.sandberg@arm.comSimpleThread::unserialize(CheckpointIn &cp) 145217SN/A{ 14610905Sandreas.sandberg@arm.com ThreadState::unserialize(cp); 14710905Sandreas.sandberg@arm.com ::unserialize(*tc, cp); 148217SN/A} 149217SN/A 1502683Sktlim@umich.eduvoid 1519461Snilay@cs.wisc.eduSimpleThread::startup() 1529461Snilay@cs.wisc.edu{ 1539461Snilay@cs.wisc.edu isa->startup(tc); 1549461Snilay@cs.wisc.edu} 1559461Snilay@cs.wisc.edu 1569461Snilay@cs.wisc.eduvoid 1572683Sktlim@umich.eduSimpleThread::dumpFuncProfile() 1582683Sktlim@umich.edu{ 15911359Sandreas@sandberg.pp.se OutputStream *os(simout.create(csprintf("profile.%s.dat", baseCpu->name()))); 16011359Sandreas@sandberg.pp.se profile->dump(tc, *os->stream()); 16111359Sandreas@sandberg.pp.se simout.close(os); 1622683Sktlim@umich.edu} 163217SN/A 164217SN/Avoid 16510407Smitch.hayenga@arm.comSimpleThread::activate() 1662SN/A{ 1672680SN/A if (status() == ThreadContext::Active) 1682SN/A return; 1692SN/A 1707823Ssteve.reinhardt@amd.com lastActivate = curTick(); 1712680SN/A _status = ThreadContext::Active; 17210407Smitch.hayenga@arm.com baseCpu->activateContext(_threadId); 173393SN/A} 174393SN/A 175393SN/Avoid 1762683Sktlim@umich.eduSimpleThread::suspend() 177393SN/A{ 1782680SN/A if (status() == ThreadContext::Suspended) 179393SN/A return; 180393SN/A 1817823Ssteve.reinhardt@amd.com lastActivate = curTick(); 1827823Ssteve.reinhardt@amd.com lastSuspend = curTick(); 1832680SN/A _status = ThreadContext::Suspended; 1848735Sandreas.hanson@arm.com baseCpu->suspendContext(_threadId); 1852SN/A} 1862SN/A 187393SN/A 188393SN/Avoid 1892683Sktlim@umich.eduSimpleThread::halt() 190393SN/A{ 1912680SN/A if (status() == ThreadContext::Halted) 192393SN/A return; 193393SN/A 1942680SN/A _status = ThreadContext::Halted; 1958735Sandreas.hanson@arm.com baseCpu->haltContext(_threadId); 196393SN/A} 197393SN/A 198393SN/A 199393SN/Avoid 2002683Sktlim@umich.eduSimpleThread::regStats(const string &name) 2012SN/A{ 2028793Sgblack@eecs.umich.edu if (FullSystem && kernelStats) 2032341SN/A kernelStats->regStats(name + ".kern"); 2042SN/A} 205716SN/A 206716SN/Avoid 2072683Sktlim@umich.eduSimpleThread::copyArchRegs(ThreadContext *src_tc) 2082190SN/A{ 2092680SN/A TheISA::copyRegs(src_tc, tc); 2102190SN/A} 2112190SN/A 21210319SAndreas.Sandberg@ARM.com// The following methods are defined in src/arch/alpha/ev5.cc for 21310319SAndreas.Sandberg@ARM.com// Alpha. 21410319SAndreas.Sandberg@ARM.com#if THE_ISA != ALPHA_ISA 21510319SAndreas.Sandberg@ARM.comFault 21610319SAndreas.Sandberg@ARM.comSimpleThread::hwrei() 21710319SAndreas.Sandberg@ARM.com{ 21810319SAndreas.Sandberg@ARM.com return NoFault; 21910319SAndreas.Sandberg@ARM.com} 22010319SAndreas.Sandberg@ARM.com 22110319SAndreas.Sandberg@ARM.combool 22210319SAndreas.Sandberg@ARM.comSimpleThread::simPalCheck(int palFunc) 22310319SAndreas.Sandberg@ARM.com{ 22410319SAndreas.Sandberg@ARM.com return true; 22510319SAndreas.Sandberg@ARM.com} 22610319SAndreas.Sandberg@ARM.com#endif 227