thread_state.cc revision 9101:d39368c6f502
113038Sgabeblack@google.com/*
213038Sgabeblack@google.com * Copyright (c) 2006 The Regents of The University of Michigan
313038Sgabeblack@google.com * All rights reserved.
413038Sgabeblack@google.com *
513038Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
613038Sgabeblack@google.com * modification, are permitted provided that the following conditions are
713038Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
813038Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
913038Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
1013038Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1113038Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1213038Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1313038Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1413038Sgabeblack@google.com * this software without specific prior written permission.
1513038Sgabeblack@google.com *
1613038Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713038Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813038Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913038Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013038Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113038Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213038Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313038Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413038Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513038Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613038Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713038Sgabeblack@google.com *
2813038Sgabeblack@google.com * Authors: Kevin Lim
2913038Sgabeblack@google.com */
3013038Sgabeblack@google.com
3113038Sgabeblack@google.com#include "arch/kernel_stats.hh"
3213038Sgabeblack@google.com#include "base/output.hh"
3313038Sgabeblack@google.com#include "cpu/base.hh"
3413038Sgabeblack@google.com#include "cpu/profile.hh"
3513038Sgabeblack@google.com#include "cpu/quiesce_event.hh"
3613038Sgabeblack@google.com#include "cpu/thread_state.hh"
3713038Sgabeblack@google.com#include "mem/fs_translating_port_proxy.hh"
3813038Sgabeblack@google.com#include "mem/port.hh"
3913038Sgabeblack@google.com#include "mem/port_proxy.hh"
4013323Sgabeblack@google.com#include "mem/se_translating_port_proxy.hh"
4113323Sgabeblack@google.com#include "sim/full_system.hh"
4213038Sgabeblack@google.com#include "sim/serialize.hh"
4313038Sgabeblack@google.com#include "sim/system.hh"
4413038Sgabeblack@google.com
4513038Sgabeblack@google.comThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process)
4613038Sgabeblack@google.com    : numInst(0), numOp(0), numLoad(0), _status(ThreadContext::Halted),
4713038Sgabeblack@google.com      baseCpu(cpu), _threadId(_tid), lastActivate(0), lastSuspend(0),
4813038Sgabeblack@google.com      profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
4913323Sgabeblack@google.com      kernelStats(NULL), process(_process), physProxy(NULL), virtProxy(NULL),
5013323Sgabeblack@google.com      proxy(NULL), funcExeInst(0), storeCondFailures(0)
5113038Sgabeblack@google.com{
5213038Sgabeblack@google.com}
5313038Sgabeblack@google.com
5413038Sgabeblack@google.comThreadState::~ThreadState()
5513038Sgabeblack@google.com{
5613038Sgabeblack@google.com    if (physProxy != NULL)
5713038Sgabeblack@google.com        delete physProxy;
5813038Sgabeblack@google.com    if (virtProxy != NULL)
59        delete virtProxy;
60    if (proxy != NULL)
61        delete proxy;
62}
63
64void
65ThreadState::serialize(std::ostream &os)
66{
67    SERIALIZE_ENUM(_status);
68    // thread_num and cpu_id are deterministic from the config
69    SERIALIZE_SCALAR(funcExeInst);
70
71    if (!FullSystem)
72        return;
73
74    Tick quiesceEndTick = 0;
75    if (quiesceEvent->scheduled())
76        quiesceEndTick = quiesceEvent->when();
77    SERIALIZE_SCALAR(quiesceEndTick);
78    if (kernelStats)
79        kernelStats->serialize(os);
80}
81
82void
83ThreadState::unserialize(Checkpoint *cp, const std::string &section)
84{
85
86    UNSERIALIZE_ENUM(_status);
87    // thread_num and cpu_id are deterministic from the config
88    UNSERIALIZE_SCALAR(funcExeInst);
89
90    if (!FullSystem)
91        return;
92
93    Tick quiesceEndTick;
94    UNSERIALIZE_SCALAR(quiesceEndTick);
95    if (quiesceEndTick)
96        baseCpu->schedule(quiesceEvent, quiesceEndTick);
97    if (kernelStats)
98        kernelStats->unserialize(cp, section);
99}
100
101void
102ThreadState::initMemProxies(ThreadContext *tc)
103{
104    // The port proxies only refer to the data port on the CPU side
105    // and can safely be done at init() time even if the CPU is not
106    // connected, i.e. when restoring from a checkpoint and later
107    // switching the CPU in.
108    if (FullSystem) {
109        assert(physProxy == NULL);
110        // This cannot be done in the constructor as the thread state
111        // itself is created in the base cpu constructor and the
112        // getDataPort is a virtual function
113        physProxy = new PortProxy(baseCpu->getDataPort());
114
115        assert(virtProxy == NULL);
116        virtProxy = new FSTranslatingPortProxy(tc);
117    } else {
118        assert(proxy == NULL);
119        proxy = new SETranslatingPortProxy(baseCpu->getDataPort(),
120                                           process,
121                                           SETranslatingPortProxy::NextPage);
122    }
123}
124
125PortProxy &
126ThreadState::getPhysProxy()
127{
128    assert(FullSystem);
129    assert(physProxy != NULL);
130    return *physProxy;
131}
132
133FSTranslatingPortProxy &
134ThreadState::getVirtProxy()
135{
136    assert(FullSystem);
137    assert(virtProxy != NULL);
138    return *virtProxy;
139}
140
141SETranslatingPortProxy &
142ThreadState::getMemProxy()
143{
144    assert(!FullSystem);
145    assert(proxy != NULL);
146    return *proxy;
147}
148
149void
150ThreadState::profileClear()
151{
152    if (profile)
153        profile->clear();
154}
155
156void
157ThreadState::profileSample()
158{
159    if (profile)
160        profile->sample(profileNode, profilePC);
161}
162