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