thread_state.hh revision 5529
12735Sktlim@umich.edu/*
22735Sktlim@umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
32735Sktlim@umich.edu * All rights reserved.
42735Sktlim@umich.edu *
52735Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without
62735Sktlim@umich.edu * modification, are permitted provided that the following conditions are
72735Sktlim@umich.edu * met: redistributions of source code must retain the above copyright
82735Sktlim@umich.edu * notice, this list of conditions and the following disclaimer;
92735Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright
102735Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the
112735Sktlim@umich.edu * documentation and/or other materials provided with the distribution;
122735Sktlim@umich.edu * neither the name of the copyright holders nor the names of its
132735Sktlim@umich.edu * contributors may be used to endorse or promote products derived from
142735Sktlim@umich.edu * this software without specific prior written permission.
152735Sktlim@umich.edu *
162735Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172735Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182735Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192735Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202735Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212735Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222735Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232735Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242735Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252735Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262735Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272735Sktlim@umich.edu *
282735Sktlim@umich.edu * Authors: Kevin Lim
292735Sktlim@umich.edu */
302735Sktlim@umich.edu
312735Sktlim@umich.edu#ifndef __CPU_O3_THREAD_STATE_HH__
322735Sktlim@umich.edu#define __CPU_O3_THREAD_STATE_HH__
332735Sktlim@umich.edu
342735Sktlim@umich.edu#include "base/callback.hh"
352735Sktlim@umich.edu#include "base/output.hh"
362735Sktlim@umich.edu#include "cpu/thread_context.hh"
372735Sktlim@umich.edu#include "cpu/thread_state.hh"
382735Sktlim@umich.edu#include "sim/sim_exit.hh"
392735Sktlim@umich.edu
402735Sktlim@umich.educlass Event;
412735Sktlim@umich.educlass Process;
422735Sktlim@umich.edu
432735Sktlim@umich.edu#if FULL_SYSTEM
442735Sktlim@umich.educlass EndQuiesceEvent;
452735Sktlim@umich.educlass FunctionProfile;
462735Sktlim@umich.educlass ProfileNode;
472735Sktlim@umich.edu#else
482735Sktlim@umich.educlass FunctionalMemory;
492735Sktlim@umich.educlass Process;
502735Sktlim@umich.edu#endif
513735Sstever@eecs.umich.edu
522735Sktlim@umich.edu/**
532735Sktlim@umich.edu * Class that has various thread state, such as the status, the
543735Sstever@eecs.umich.edu * current instruction being processed, whether or not the thread has
552735Sktlim@umich.edu * a trap pending or is being externally updated, the ThreadContext
562735Sktlim@umich.edu * pointer, etc.  It also handles anything related to a specific
572735Sktlim@umich.edu * thread's process, such as syscalls and checking valid addresses.
583735Sstever@eecs.umich.edu */
592735Sktlim@umich.edutemplate <class Impl>
602735Sktlim@umich.edustruct O3ThreadState : public ThreadState {
613735Sstever@eecs.umich.edu    typedef ThreadContext::Status Status;
622735Sktlim@umich.edu    typedef typename Impl::O3CPU O3CPU;
632735Sktlim@umich.edu
643735Sstever@eecs.umich.edu  private:
652735Sktlim@umich.edu    /** Pointer to the CPU. */
662735Sktlim@umich.edu    O3CPU *cpu;
672735Sktlim@umich.edu  public:
683735Sstever@eecs.umich.edu    /** Whether or not the thread is currently in syscall mode, and
693735Sstever@eecs.umich.edu     * thus able to be externally updated without squashing.
702735Sktlim@umich.edu     */
712735Sktlim@umich.edu    bool inSyscall;
722735Sktlim@umich.edu
732735Sktlim@umich.edu    /** Whether or not the thread is currently waiting on a trap, and
742735Sktlim@umich.edu     * thus able to be externally updated without squashing.
752735Sktlim@umich.edu     */
762735Sktlim@umich.edu    bool trapPending;
772735Sktlim@umich.edu
782735Sktlim@umich.edu#if FULL_SYSTEM
792735Sktlim@umich.edu    O3ThreadState(O3CPU *_cpu, int _thread_num)
802735Sktlim@umich.edu        : ThreadState(_cpu, -1, _thread_num),
812735Sktlim@umich.edu          cpu(_cpu), inSyscall(0), trapPending(0)
822735Sktlim@umich.edu    {
832735Sktlim@umich.edu        if (cpu->params()->profile) {
842735Sktlim@umich.edu            profile = new FunctionProfile(cpu->params()->system->kernelSymtab);
852735Sktlim@umich.edu            Callback *cb =
864172Ssaidi@eecs.umich.edu                new MakeCallback<O3ThreadState,
872735Sktlim@umich.edu                &O3ThreadState::dumpFuncProfile>(this);
882735Sktlim@umich.edu            registerExitCallback(cb);
892735Sktlim@umich.edu        }
904172Ssaidi@eecs.umich.edu
912735Sktlim@umich.edu        // let's fill with a dummy node for now so we don't get a segfault
922735Sktlim@umich.edu        // on the first cycle when there's no node available.
934172Ssaidi@eecs.umich.edu        static ProfileNode dummyNode;
942735Sktlim@umich.edu        profileNode = &dummyNode;
952735Sktlim@umich.edu        profilePC = 3;
962735Sktlim@umich.edu    }
974172Ssaidi@eecs.umich.edu#else
982735Sktlim@umich.edu    O3ThreadState(O3CPU *_cpu, int _thread_num, Process *_process, int _asid)
992735Sktlim@umich.edu        : ThreadState(_cpu, -1, _thread_num, _process, _asid),
1002735Sktlim@umich.edu          cpu(_cpu), inSyscall(0), trapPending(0)
1012735Sktlim@umich.edu    { }
1022735Sktlim@umich.edu#endif
1032735Sktlim@umich.edu
1042735Sktlim@umich.edu    /** Pointer to the ThreadContext of this thread. */
1052735Sktlim@umich.edu    ThreadContext *tc;
1062735Sktlim@umich.edu
1072735Sktlim@umich.edu    /** Returns a pointer to the TC of this thread. */
1082735Sktlim@umich.edu    ThreadContext *getTC() { return tc; }
1098444Sgblack@eecs.umich.edu
1107520Sgblack@eecs.umich.edu#if !FULL_SYSTEM
1118444Sgblack@eecs.umich.edu    /** Handles the syscall. */
1128444Sgblack@eecs.umich.edu    void syscall(int64_t callnum) { process->syscall(callnum, tc); }
1137520Sgblack@eecs.umich.edu#endif
1145702Ssaidi@eecs.umich.edu
1155702Ssaidi@eecs.umich.edu#if FULL_SYSTEM
1165702Ssaidi@eecs.umich.edu    void dumpFuncProfile()
1175702Ssaidi@eecs.umich.edu    {
1185702Ssaidi@eecs.umich.edu        std::ostream *os = simout.create(csprintf("profile.%s.dat", cpu->name()));
1195702Ssaidi@eecs.umich.edu        profile->dump(tc, *os);
1205702Ssaidi@eecs.umich.edu    }
1215702Ssaidi@eecs.umich.edu#endif
1225702Ssaidi@eecs.umich.edu};
1235702Ssaidi@eecs.umich.edu
1245702Ssaidi@eecs.umich.edu#endif // __CPU_O3_THREAD_STATE_HH__
1252735Sktlim@umich.edu