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 &section)
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