thread_state.hh revision 13905
12789Sktlim@umich.edu/* 22789Sktlim@umich.edu * Copyright (c) 2006 The Regents of The University of Michigan 32789Sktlim@umich.edu * All rights reserved. 42789Sktlim@umich.edu * 52789Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 62789Sktlim@umich.edu * modification, are permitted provided that the following conditions are 72789Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 82789Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 92789Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 102789Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 112789Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 122789Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 132789Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 142789Sktlim@umich.edu * this software without specific prior written permission. 152789Sktlim@umich.edu * 162789Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172789Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182789Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192789Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202789Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212789Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222789Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232789Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242789Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252789Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262789Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272789Sktlim@umich.edu * 282789Sktlim@umich.edu * Authors: Kevin Lim 292789Sktlim@umich.edu */ 302789Sktlim@umich.edu 312789Sktlim@umich.edu#ifndef __CPU_THREAD_STATE_HH__ 322789Sktlim@umich.edu#define __CPU_THREAD_STATE_HH__ 332789Sktlim@umich.edu 342789Sktlim@umich.edu#include "arch/types.hh" 352789Sktlim@umich.edu#include "config/the_isa.hh" 362789Sktlim@umich.edu#include "cpu/base.hh" 373348Sbinkertn@umich.edu#include "cpu/profile.hh" 382789Sktlim@umich.edu#include "cpu/thread_context.hh" 392789Sktlim@umich.edu#include "sim/process.hh" 402789Sktlim@umich.edu 413565Sgblack@eecs.umich.educlass EndQuiesceEvent; 422789Sktlim@umich.educlass FunctionProfile; 432789Sktlim@umich.educlass ProfileNode; 442789Sktlim@umich.edunamespace Kernel { 452789Sktlim@umich.edu class Statistics; 462789Sktlim@umich.edu} 472789Sktlim@umich.edu 482789Sktlim@umich.educlass Checkpoint; 492789Sktlim@umich.edu 502789Sktlim@umich.edu/** 512789Sktlim@umich.edu * Struct for holding general thread state that is needed across CPU 522789Sktlim@umich.edu * models. This includes things such as pointers to the process, 532789Sktlim@umich.edu * memory, quiesce events, and certain stats. This can be expanded 542789Sktlim@umich.edu * to hold more thread-specific stats within it. 552789Sktlim@umich.edu */ 562789Sktlim@umich.edustruct ThreadState : public Serializable { 572789Sktlim@umich.edu typedef ThreadContext::Status Status; 582789Sktlim@umich.edu 592789Sktlim@umich.edu ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process); 602789Sktlim@umich.edu 612789Sktlim@umich.edu virtual ~ThreadState(); 622789Sktlim@umich.edu 632789Sktlim@umich.edu void serialize(CheckpointOut &cp) const override; 642789Sktlim@umich.edu 652789Sktlim@umich.edu void unserialize(CheckpointIn &cp) override; 662789Sktlim@umich.edu 672789Sktlim@umich.edu int cpuId() const { return baseCpu->cpuId(); } 682789Sktlim@umich.edu 692789Sktlim@umich.edu uint32_t socketId() const { return baseCpu->socketId(); } 702789Sktlim@umich.edu 712789Sktlim@umich.edu ContextID contextId() const { return _contextId; } 722789Sktlim@umich.edu 732789Sktlim@umich.edu void setContextId(ContextID id) { _contextId = id; } 742789Sktlim@umich.edu 756331Sgblack@eecs.umich.edu void setThreadId(ThreadID id) { _threadId = id; } 763402Sktlim@umich.edu 773402Sktlim@umich.edu ThreadID threadId() const { return _threadId; } 783402Sktlim@umich.edu 792789Sktlim@umich.edu Tick readLastActivate() const { return lastActivate; } 802789Sktlim@umich.edu 812789Sktlim@umich.edu Tick readLastSuspend() const { return lastSuspend; } 822789Sktlim@umich.edu 832789Sktlim@umich.edu /** 842789Sktlim@umich.edu * Initialise the physical and virtual port proxies and tie them to 852789Sktlim@umich.edu * the data port of the CPU. 862789Sktlim@umich.edu * 872789Sktlim@umich.edu * @param tc ThreadContext for the virtual-to-physical translation 882789Sktlim@umich.edu */ 892789Sktlim@umich.edu void initMemProxies(ThreadContext *tc); 902789Sktlim@umich.edu 912789Sktlim@umich.edu void dumpFuncProfile(); 922789Sktlim@umich.edu 932789Sktlim@umich.edu EndQuiesceEvent *getQuiesceEvent() { return quiesceEvent; } 942789Sktlim@umich.edu 952789Sktlim@umich.edu void profileClear(); 962789Sktlim@umich.edu 972789Sktlim@umich.edu void profileSample(); 982789Sktlim@umich.edu 992789Sktlim@umich.edu Kernel::Statistics *getKernelStats() { return kernelStats; } 1002789Sktlim@umich.edu 1012789Sktlim@umich.edu PortProxy &getPhysProxy(); 1022789Sktlim@umich.edu 1032789Sktlim@umich.edu FSTranslatingPortProxy &getVirtProxy(); 1042789Sktlim@umich.edu 1052789Sktlim@umich.edu Process *getProcessPtr() { return process; } 1062789Sktlim@umich.edu 1072789Sktlim@umich.edu void setProcessPtr(Process *p) 1082789Sktlim@umich.edu { 1092789Sktlim@umich.edu process = p; 1102789Sktlim@umich.edu /** 1112789Sktlim@umich.edu * When the process pointer changes while operating in SE Mode, 1122789Sktlim@umich.edu * the se translating port proxy needs to be reinitialized since it 1132789Sktlim@umich.edu * holds a pointer to the process class. 1142789Sktlim@umich.edu */ 1152789Sktlim@umich.edu if (proxy) { 1162789Sktlim@umich.edu delete proxy; 1172789Sktlim@umich.edu proxy = NULL; 1182789Sktlim@umich.edu initMemProxies(NULL); 1192789Sktlim@umich.edu } 1202789Sktlim@umich.edu } 1212789Sktlim@umich.edu 1222789Sktlim@umich.edu SETranslatingPortProxy &getMemProxy(); 1232789Sktlim@umich.edu 1242789Sktlim@umich.edu /** Reads the number of instructions functionally executed and 1252789Sktlim@umich.edu * committed. 1262789Sktlim@umich.edu */ 1272789Sktlim@umich.edu Counter readFuncExeInst() const { return funcExeInst; } 1282789Sktlim@umich.edu 1292789Sktlim@umich.edu /** Sets the total number of instructions functionally executed 1302789Sktlim@umich.edu * and committed. 1312789Sktlim@umich.edu */ 1322789Sktlim@umich.edu void setFuncExeInst(Counter new_val) { funcExeInst = new_val; } 1332789Sktlim@umich.edu 1342789Sktlim@umich.edu /** Returns the status of this thread. */ 1352789Sktlim@umich.edu Status status() const { return _status; } 1362789Sktlim@umich.edu 1372789Sktlim@umich.edu /** Sets the status of this thread. */ 1382789Sktlim@umich.edu void setStatus(Status new_status) { _status = new_status; } 1392789Sktlim@umich.edu 1402789Sktlim@umich.edu public: 1412789Sktlim@umich.edu 1422789Sktlim@umich.edu /** Number of instructions committed. */ 1432789Sktlim@umich.edu Counter numInst; 1442789Sktlim@umich.edu /** Stat for number instructions committed. */ 1452789Sktlim@umich.edu Stats::Scalar numInsts; 1462789Sktlim@umich.edu /** Number of ops (including micro ops) committed. */ 1472789Sktlim@umich.edu Counter numOp; 1482789Sktlim@umich.edu /** Stat for number ops (including micro ops) committed. */ 1492789Sktlim@umich.edu Stats::Scalar numOps; 1502789Sktlim@umich.edu /** Stat for number of memory references. */ 1512789Sktlim@umich.edu Stats::Scalar numMemRefs; 1522789Sktlim@umich.edu 1532789Sktlim@umich.edu /** Number of simulated loads, used for tracking events based on 1542789Sktlim@umich.edu * the number of loads committed. 1552789Sktlim@umich.edu */ 1562789Sktlim@umich.edu Counter numLoad; 1572789Sktlim@umich.edu 1582789Sktlim@umich.edu /** The number of simulated loads committed prior to this run. */ 1595891Sgblack@eecs.umich.edu Counter startNumLoad; 1602789Sktlim@umich.edu 1613349Sbinkertn@umich.edu protected: 1622789Sktlim@umich.edu ThreadContext::Status _status; 1632789Sktlim@umich.edu 1642789Sktlim@umich.edu // Pointer to the base CPU. 1653172Sstever@eecs.umich.edu BaseCPU *baseCpu; 1662789Sktlim@umich.edu 1672789Sktlim@umich.edu // system wide HW context id 1682789Sktlim@umich.edu ContextID _contextId; 1692789Sktlim@umich.edu 1702789Sktlim@umich.edu // Index of hardware thread context on the CPU that this represents. 1712789Sktlim@umich.edu ThreadID _threadId; 1722789Sktlim@umich.edu 1732789Sktlim@umich.edu public: 1742789Sktlim@umich.edu /** Last time activate was called on this thread. */ 1752789Sktlim@umich.edu Tick lastActivate; 1762789Sktlim@umich.edu 1772789Sktlim@umich.edu /** Last time suspend was called on this thread. */ 1782789Sktlim@umich.edu Tick lastSuspend; 1792789Sktlim@umich.edu 1802789Sktlim@umich.edu public: 1812789Sktlim@umich.edu FunctionProfile *profile; 1822789Sktlim@umich.edu ProfileNode *profileNode; 1832789Sktlim@umich.edu Addr profilePC; 1842789Sktlim@umich.edu EndQuiesceEvent *quiesceEvent; 1852789Sktlim@umich.edu 1862789Sktlim@umich.edu Kernel::Statistics *kernelStats; 1872789Sktlim@umich.edu 1882789Sktlim@umich.edu protected: 1892789Sktlim@umich.edu Process *process; 1902789Sktlim@umich.edu 1912789Sktlim@umich.edu /** A port proxy outgoing only for functional accesses to physical 1922789Sktlim@umich.edu * addresses.*/ 1932789Sktlim@umich.edu PortProxy *physProxy; 1942789Sktlim@umich.edu 1952789Sktlim@umich.edu /** A translating port proxy, outgoing only, for functional 1962789Sktlim@umich.edu * accesse to virtual addresses. */ 1972789Sktlim@umich.edu FSTranslatingPortProxy *virtProxy; 1982789Sktlim@umich.edu SETranslatingPortProxy *proxy; 1992789Sktlim@umich.edu 2002789Sktlim@umich.edu public: 2012789Sktlim@umich.edu /* 2022789Sktlim@umich.edu * number of executed instructions, for matching with syscall trace 2032789Sktlim@umich.edu * points in EIO files. 2042789Sktlim@umich.edu */ 2052789Sktlim@umich.edu Counter funcExeInst; 2062789Sktlim@umich.edu 2072789Sktlim@umich.edu // 2082789Sktlim@umich.edu // Count failed store conditionals so we can warn of apparent 2092789Sktlim@umich.edu // application deadlock situations. 2102789Sktlim@umich.edu unsigned storeCondFailures; 2112789Sktlim@umich.edu}; 2122789Sktlim@umich.edu 2132789Sktlim@umich.edu#endif // __CPU_THREAD_STATE_HH__ 2142789Sktlim@umich.edu