thread_state.hh revision 3126:756092c6383c
12330SN/A/* 22330SN/A * Copyright (c) 2006 The Regents of The University of Michigan 32330SN/A * All rights reserved. 42330SN/A * 52330SN/A * Redistribution and use in source and binary forms, with or without 62330SN/A * modification, are permitted provided that the following conditions are 72330SN/A * met: redistributions of source code must retain the above copyright 82330SN/A * notice, this list of conditions and the following disclaimer; 92330SN/A * redistributions in binary form must reproduce the above copyright 102330SN/A * notice, this list of conditions and the following disclaimer in the 112330SN/A * documentation and/or other materials provided with the distribution; 122330SN/A * neither the name of the copyright holders nor the names of its 132330SN/A * contributors may be used to endorse or promote products derived from 142330SN/A * this software without specific prior written permission. 152330SN/A * 162330SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172330SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182330SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192330SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202330SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212330SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222330SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232330SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242330SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252330SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262330SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272689Sktlim@umich.edu * 282689Sktlim@umich.edu * Authors: Kevin Lim 292330SN/A */ 302292SN/A 312292SN/A#ifndef __CPU_O3_THREAD_STATE_HH__ 322292SN/A#define __CPU_O3_THREAD_STATE_HH__ 332292SN/A 342980Sgblack@eecs.umich.edu#include "base/callback.hh" 352362SN/A#include "base/output.hh" 362680Sktlim@umich.edu#include "cpu/thread_context.hh" 375712Shsul@eecs.umich.edu#include "cpu/thread_state.hh" 382292SN/A#include "sim/sim_exit.hh" 392678Sktlim@umich.edu 402683Sktlim@umich.educlass Event; 412683Sktlim@umich.educlass Process; 422678Sktlim@umich.edu 432678Sktlim@umich.edu#if FULL_SYSTEM 442292SN/Aclass EndQuiesceEvent; 452292SN/Aclass FunctionProfile; 462292SN/Aclass ProfileNode; 472292SN/A#else 483548Sgblack@eecs.umich.educlass FunctionalMemory; 493548Sgblack@eecs.umich.educlass Process; 503548Sgblack@eecs.umich.edu#endif 513548Sgblack@eecs.umich.edu 522330SN/A/** 532292SN/A * Class that has various thread state, such as the status, the 542292SN/A * current instruction being processed, whether or not the thread has 552862Sktlim@umich.edu * a trap pending or is being externally updated, the ThreadContext 563486Sktlim@umich.edu * pointer, etc. It also handles anything related to a specific 573402Sktlim@umich.edu * thread's process, such as syscalls and checking valid addresses. 582862Sktlim@umich.edu */ 592330SN/Atemplate <class Impl> 602330SN/Astruct O3ThreadState : public ThreadState { 612330SN/A typedef ThreadContext::Status Status; 622330SN/A typedef typename Impl::O3CPU O3CPU; 632330SN/A 642330SN/A private: 652292SN/A /** Pointer to the CPU. */ 662683Sktlim@umich.edu O3CPU *cpu; 672683Sktlim@umich.edu public: 682292SN/A /** Whether or not the thread is currently in syscall mode, and 695712Shsul@eecs.umich.edu * thus able to be externally updated without squashing. 702292SN/A */ 715712Shsul@eecs.umich.edu bool inSyscall; 723402Sktlim@umich.edu 732292SN/A /** Whether or not the thread is currently waiting on a trap, and 742683Sktlim@umich.edu * thus able to be externally updated without squashing. 753486Sktlim@umich.edu */ 763486Sktlim@umich.edu bool trapPending; 772862Sktlim@umich.edu 782862Sktlim@umich.edu#if FULL_SYSTEM 792862Sktlim@umich.edu O3ThreadState(O3CPU *_cpu, int _thread_num) 802862Sktlim@umich.edu : ThreadState(-1, _thread_num), 815712Shsul@eecs.umich.edu cpu(_cpu), inSyscall(0), trapPending(0) 822683Sktlim@umich.edu { 835714Shsul@eecs.umich.edu if (cpu->params->profile) { 845714Shsul@eecs.umich.edu profile = new FunctionProfile(cpu->params->system->kernelSymtab); 855714Shsul@eecs.umich.edu Callback *cb = 865714Shsul@eecs.umich.edu new MakeCallback<O3ThreadState, 872683Sktlim@umich.edu &O3ThreadState::dumpFuncProfile>(this); 882683Sktlim@umich.edu registerExitCallback(cb); 892683Sktlim@umich.edu } 902683Sktlim@umich.edu 912683Sktlim@umich.edu // let's fill with a dummy node for now so we don't get a segfault 922683Sktlim@umich.edu // on the first cycle when there's no node available. 932683Sktlim@umich.edu static ProfileNode dummyNode; 942683Sktlim@umich.edu profileNode = &dummyNode; 952683Sktlim@umich.edu profilePC = 3; 965497Ssaidi@eecs.umich.edu } 973675Sktlim@umich.edu#else 983686Sktlim@umich.edu O3ThreadState(O3CPU *_cpu, int _thread_num, Process *_process, int _asid, 993675Sktlim@umich.edu MemObject *mem) 1005497Ssaidi@eecs.umich.edu : ThreadState(-1, _thread_num, _process, _asid, mem), 1013675Sktlim@umich.edu cpu(_cpu), inSyscall(0), trapPending(0) 1022683Sktlim@umich.edu { } 1032683Sktlim@umich.edu#endif 1042683Sktlim@umich.edu 1052683Sktlim@umich.edu /** Pointer to the ThreadContext of this thread. */ 1062683Sktlim@umich.edu ThreadContext *tc; 1072683Sktlim@umich.edu 1082683Sktlim@umich.edu /** Returns a pointer to the TC of this thread. */ 1092683Sktlim@umich.edu ThreadContext *getTC() { return tc; } 1103548Sgblack@eecs.umich.edu 1112683Sktlim@umich.edu#if !FULL_SYSTEM 1122690Sktlim@umich.edu /** Handles the syscall. */ 1132690Sktlim@umich.edu void syscall(int64_t callnum) { process->syscall(callnum, tc); } 1142683Sktlim@umich.edu#endif 1152683Sktlim@umich.edu 1165499Ssaidi@eecs.umich.edu#if FULL_SYSTEM 1172683Sktlim@umich.edu void dumpFuncProfile() 1182683Sktlim@umich.edu { 1192683Sktlim@umich.edu std::ostream *os = simout.create(csprintf("profile.%s.dat", cpu->name())); 1203402Sktlim@umich.edu profile->dump(tc, *os); 1212683Sktlim@umich.edu } 1222683Sktlim@umich.edu#endif 1232683Sktlim@umich.edu}; 1242683Sktlim@umich.edu 1252683Sktlim@umich.edu#endif // __CPU_O3_THREAD_STATE_HH__ 1262678Sktlim@umich.edu