thread_state.hh revision 9428
112605Sgiacomo.travaglini@arm.com/* 212605Sgiacomo.travaglini@arm.com * Copyright (c) 2012 ARM Limited 312605Sgiacomo.travaglini@arm.com * All rights reserved 412605Sgiacomo.travaglini@arm.com * 512605Sgiacomo.travaglini@arm.com * The license below extends only to copyright in the software and shall 612605Sgiacomo.travaglini@arm.com * not be construed as granting a license to any other intellectual 712605Sgiacomo.travaglini@arm.com * property including but not limited to intellectual property relating 812605Sgiacomo.travaglini@arm.com * to a hardware implementation of the functionality of the software 912605Sgiacomo.travaglini@arm.com * licensed hereunder. You may use the software subject to the license 1012605Sgiacomo.travaglini@arm.com * terms below provided that you ensure that this notice is replicated 1112605Sgiacomo.travaglini@arm.com * unmodified and in its entirety in all distributions of the software, 1212605Sgiacomo.travaglini@arm.com * modified or unmodified, in source code or in binary form. 1312605Sgiacomo.travaglini@arm.com * 1412605Sgiacomo.travaglini@arm.com * Copyright (c) 2006 The Regents of The University of Michigan 1512605Sgiacomo.travaglini@arm.com * All rights reserved. 1612605Sgiacomo.travaglini@arm.com * 1712605Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without 1812605Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are 1912605Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright 2012605Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer; 2112605Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright 2212605Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the 2312605Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution; 2412605Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its 2512605Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from 2612605Sgiacomo.travaglini@arm.com * this software without specific prior written permission. 2712605Sgiacomo.travaglini@arm.com * 2812605Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2912605Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3012605Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3112605Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3212605Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3312605Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3412605Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3512605Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3612605Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3712605Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3812605Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3912605Sgiacomo.travaglini@arm.com * 4012605Sgiacomo.travaglini@arm.com * Authors: Kevin Lim 4112605Sgiacomo.travaglini@arm.com */ 4212605Sgiacomo.travaglini@arm.com 4312605Sgiacomo.travaglini@arm.com#ifndef __CPU_O3_THREAD_STATE_HH__ 4412605Sgiacomo.travaglini@arm.com#define __CPU_O3_THREAD_STATE_HH__ 4512605Sgiacomo.travaglini@arm.com 4612605Sgiacomo.travaglini@arm.com#include "base/callback.hh" 4712605Sgiacomo.travaglini@arm.com#include "base/output.hh" 4812605Sgiacomo.travaglini@arm.com#include "cpu/thread_context.hh" 4912605Sgiacomo.travaglini@arm.com#include "cpu/thread_state.hh" 5012605Sgiacomo.travaglini@arm.com#include "sim/full_system.hh" 5112605Sgiacomo.travaglini@arm.com#include "sim/sim_exit.hh" 5212605Sgiacomo.travaglini@arm.com 5312605Sgiacomo.travaglini@arm.comclass EndQuiesceEvent; 5412605Sgiacomo.travaglini@arm.comclass Event; 5512605Sgiacomo.travaglini@arm.comclass FunctionalMemory; 5612605Sgiacomo.travaglini@arm.comclass FunctionProfile; 5712605Sgiacomo.travaglini@arm.comclass Process; 5812605Sgiacomo.travaglini@arm.comclass ProfileNode; 5912605Sgiacomo.travaglini@arm.com 6012605Sgiacomo.travaglini@arm.com/** 6112605Sgiacomo.travaglini@arm.com * Class that has various thread state, such as the status, the 6212605Sgiacomo.travaglini@arm.com * current instruction being processed, whether or not the thread has 6312605Sgiacomo.travaglini@arm.com * a trap pending or is being externally updated, the ThreadContext 6412605Sgiacomo.travaglini@arm.com * pointer, etc. It also handles anything related to a specific 6512605Sgiacomo.travaglini@arm.com * thread's process, such as syscalls and checking valid addresses. 6612605Sgiacomo.travaglini@arm.com */ 6712605Sgiacomo.travaglini@arm.comtemplate <class Impl> 6812605Sgiacomo.travaglini@arm.comstruct O3ThreadState : public ThreadState { 6912605Sgiacomo.travaglini@arm.com typedef ThreadContext::Status Status; 7012605Sgiacomo.travaglini@arm.com typedef typename Impl::O3CPU O3CPU; 7112605Sgiacomo.travaglini@arm.com 7212605Sgiacomo.travaglini@arm.com private: 7312605Sgiacomo.travaglini@arm.com /** Pointer to the CPU. */ 7412605Sgiacomo.travaglini@arm.com O3CPU *cpu; 7512605Sgiacomo.travaglini@arm.com public: 7612605Sgiacomo.travaglini@arm.com /* This variable controls if writes to a thread context should cause a all 7712605Sgiacomo.travaglini@arm.com * dynamic/speculative state to be thrown away. Nominally this is the 7812605Sgiacomo.travaglini@arm.com * desired behavior because the external thread context write has updated 7912605Sgiacomo.travaglini@arm.com * some state that could be used by an inflight instruction, however there 8012605Sgiacomo.travaglini@arm.com * are some cases like in a fault/trap handler where this behavior would 8112605Sgiacomo.travaglini@arm.com * lead to successive restarts and forward progress couldn't be made. This 8212605Sgiacomo.travaglini@arm.com * variable controls if the squashing will occur. 8312605Sgiacomo.travaglini@arm.com */ 8412605Sgiacomo.travaglini@arm.com bool noSquashFromTC; 8512605Sgiacomo.travaglini@arm.com 8612605Sgiacomo.travaglini@arm.com /** Whether or not the thread is currently waiting on a trap, and 8712605Sgiacomo.travaglini@arm.com * thus able to be externally updated without squashing. 8812605Sgiacomo.travaglini@arm.com */ 8912605Sgiacomo.travaglini@arm.com bool trapPending; 9012605Sgiacomo.travaglini@arm.com 9112605Sgiacomo.travaglini@arm.com O3ThreadState(O3CPU *_cpu, int _thread_num, Process *_process) 9212605Sgiacomo.travaglini@arm.com : ThreadState(_cpu, _thread_num, _process), 9312605Sgiacomo.travaglini@arm.com cpu(_cpu), noSquashFromTC(false), trapPending(false) 9412605Sgiacomo.travaglini@arm.com { 9512605Sgiacomo.travaglini@arm.com if (!FullSystem) 9612605Sgiacomo.travaglini@arm.com return; 9712605Sgiacomo.travaglini@arm.com 9812605Sgiacomo.travaglini@arm.com if (cpu->params()->profile) { 9912605Sgiacomo.travaglini@arm.com profile = new FunctionProfile( 10012605Sgiacomo.travaglini@arm.com cpu->params()->system->kernelSymtab); 10112605Sgiacomo.travaglini@arm.com Callback *cb = 10212605Sgiacomo.travaglini@arm.com new MakeCallback<O3ThreadState, 10312605Sgiacomo.travaglini@arm.com &O3ThreadState::dumpFuncProfile>(this); 10412605Sgiacomo.travaglini@arm.com registerExitCallback(cb); 10512605Sgiacomo.travaglini@arm.com } 10612605Sgiacomo.travaglini@arm.com 10712605Sgiacomo.travaglini@arm.com // let's fill with a dummy node for now so we don't get a segfault 10812605Sgiacomo.travaglini@arm.com // on the first cycle when there's no node available. 10912605Sgiacomo.travaglini@arm.com static ProfileNode dummyNode; 11012605Sgiacomo.travaglini@arm.com profileNode = &dummyNode; 11112605Sgiacomo.travaglini@arm.com profilePC = 3; 11212605Sgiacomo.travaglini@arm.com } 11312605Sgiacomo.travaglini@arm.com 11412605Sgiacomo.travaglini@arm.com void serialize(std::ostream &os) 11512605Sgiacomo.travaglini@arm.com { 11612605Sgiacomo.travaglini@arm.com ThreadState::serialize(os); 11712605Sgiacomo.travaglini@arm.com // Use the ThreadContext serialization helper to serialize the 11812605Sgiacomo.travaglini@arm.com // TC. 11912605Sgiacomo.travaglini@arm.com ::serialize(*tc, os); 12012605Sgiacomo.travaglini@arm.com } 12112605Sgiacomo.travaglini@arm.com 12212605Sgiacomo.travaglini@arm.com void unserialize(Checkpoint *cp, const std::string §ion) 12312605Sgiacomo.travaglini@arm.com { 12412605Sgiacomo.travaglini@arm.com // Prevent squashing - we don't have any instructions in 12512605Sgiacomo.travaglini@arm.com // flight that we need to squash since we just instantiated a 12612605Sgiacomo.travaglini@arm.com // clean system. 12712605Sgiacomo.travaglini@arm.com noSquashFromTC = true; 12812605Sgiacomo.travaglini@arm.com ThreadState::unserialize(cp, section); 12912605Sgiacomo.travaglini@arm.com // Use the ThreadContext serialization helper to unserialize 13012605Sgiacomo.travaglini@arm.com // the TC. 13112605Sgiacomo.travaglini@arm.com ::unserialize(*tc, cp, section); 13212605Sgiacomo.travaglini@arm.com noSquashFromTC = false; 13312605Sgiacomo.travaglini@arm.com } 13412605Sgiacomo.travaglini@arm.com 13512605Sgiacomo.travaglini@arm.com /** Pointer to the ThreadContext of this thread. */ 13612605Sgiacomo.travaglini@arm.com ThreadContext *tc; 13712605Sgiacomo.travaglini@arm.com 13812605Sgiacomo.travaglini@arm.com /** Returns a pointer to the TC of this thread. */ 13912605Sgiacomo.travaglini@arm.com ThreadContext *getTC() { return tc; } 14012605Sgiacomo.travaglini@arm.com 14112605Sgiacomo.travaglini@arm.com /** Handles the syscall. */ 14212605Sgiacomo.travaglini@arm.com void syscall(int64_t callnum) { process->syscall(callnum, tc); } 14312605Sgiacomo.travaglini@arm.com 14412605Sgiacomo.travaglini@arm.com void dumpFuncProfile() 14512605Sgiacomo.travaglini@arm.com { 14612605Sgiacomo.travaglini@arm.com std::ostream *os = simout.create(csprintf("profile.%s.dat", cpu->name())); 14712605Sgiacomo.travaglini@arm.com profile->dump(tc, *os); 14812605Sgiacomo.travaglini@arm.com } 14912605Sgiacomo.travaglini@arm.com}; 15012605Sgiacomo.travaglini@arm.com 15112605Sgiacomo.travaglini@arm.com#endif // __CPU_O3_THREAD_STATE_HH__ 15212605Sgiacomo.travaglini@arm.com