thread_state.cc revision 3565
12689Sktlim@umich.edu/*
22689Sktlim@umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
32689Sktlim@umich.edu * All rights reserved.
42689Sktlim@umich.edu *
52689Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without
62689Sktlim@umich.edu * modification, are permitted provided that the following conditions are
72689Sktlim@umich.edu * met: redistributions of source code must retain the above copyright
82689Sktlim@umich.edu * notice, this list of conditions and the following disclaimer;
92689Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright
102689Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the
112689Sktlim@umich.edu * documentation and/or other materials provided with the distribution;
122689Sktlim@umich.edu * neither the name of the copyright holders nor the names of its
132689Sktlim@umich.edu * contributors may be used to endorse or promote products derived from
142689Sktlim@umich.edu * this software without specific prior written permission.
152689Sktlim@umich.edu *
162689Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172689Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182689Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192689Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202689Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212689Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222689Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232689Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242689Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252689Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262689Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272689Sktlim@umich.edu *
282689Sktlim@umich.edu * Authors: Kevin Lim
292689Sktlim@umich.edu */
302689Sktlim@umich.edu
312683Sktlim@umich.edu#include "base/output.hh"
323402Sktlim@umich.edu#include "cpu/base.hh"
332683Sktlim@umich.edu#include "cpu/profile.hh"
342683Sktlim@umich.edu#include "cpu/thread_state.hh"
353402Sktlim@umich.edu#include "mem/port.hh"
363402Sktlim@umich.edu#include "mem/translating_port.hh"
372862Sktlim@umich.edu#include "sim/serialize.hh"
382862Sktlim@umich.edu
392862Sktlim@umich.edu#if FULL_SYSTEM
403565Sgblack@eecs.umich.edu#include "arch/kernel_stats.hh"
412862Sktlim@umich.edu#include "cpu/quiesce_event.hh"
422862Sktlim@umich.edu#endif
432683Sktlim@umich.edu
442683Sktlim@umich.edu#if FULL_SYSTEM
453402Sktlim@umich.eduThreadState::ThreadState(BaseCPU *cpu, int _cpuId, int _tid)
463402Sktlim@umich.edu    : baseCpu(cpu), cpuId(_cpuId), tid(_tid), lastActivate(0), lastSuspend(0),
472683Sktlim@umich.edu      profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
483402Sktlim@umich.edu      physPort(NULL), virtPort(NULL),
493280Sgblack@eecs.umich.edu      microPC(0), nextMicroPC(1), funcExeInst(0), storeCondFailures(0)
502683Sktlim@umich.edu#else
513402Sktlim@umich.eduThreadState::ThreadState(BaseCPU *cpu, int _cpuId, int _tid, Process *_process,
523402Sktlim@umich.edu                         short _asid)
533402Sktlim@umich.edu    : baseCpu(cpu), cpuId(_cpuId), tid(_tid), lastActivate(0), lastSuspend(0),
543402Sktlim@umich.edu      port(NULL), process(_process), asid(_asid),
553280Sgblack@eecs.umich.edu      microPC(0), nextMicroPC(1), funcExeInst(0), storeCondFailures(0)
562683Sktlim@umich.edu#endif
572683Sktlim@umich.edu{
582699Sktlim@umich.edu    numInst = 0;
592699Sktlim@umich.edu    numLoad = 0;
602683Sktlim@umich.edu}
612683Sktlim@umich.edu
623486Sktlim@umich.eduThreadState::~ThreadState()
633486Sktlim@umich.edu{
643486Sktlim@umich.edu#if !FULL_SYSTEM
653486Sktlim@umich.edu    if (port) {
663486Sktlim@umich.edu        delete port->getPeer();
673486Sktlim@umich.edu        delete port;
683486Sktlim@umich.edu    }
693486Sktlim@umich.edu#endif
703486Sktlim@umich.edu}
713486Sktlim@umich.edu
722862Sktlim@umich.eduvoid
732862Sktlim@umich.eduThreadState::serialize(std::ostream &os)
742862Sktlim@umich.edu{
752862Sktlim@umich.edu    SERIALIZE_ENUM(_status);
762862Sktlim@umich.edu    // thread_num and cpu_id are deterministic from the config
772862Sktlim@umich.edu    SERIALIZE_SCALAR(funcExeInst);
782862Sktlim@umich.edu    SERIALIZE_SCALAR(inst);
793442Sgblack@eecs.umich.edu    SERIALIZE_SCALAR(microPC);
803442Sgblack@eecs.umich.edu    SERIALIZE_SCALAR(nextMicroPC);
812862Sktlim@umich.edu
822862Sktlim@umich.edu#if FULL_SYSTEM
832862Sktlim@umich.edu    Tick quiesceEndTick = 0;
842862Sktlim@umich.edu    if (quiesceEvent->scheduled())
852862Sktlim@umich.edu        quiesceEndTick = quiesceEvent->when();
862862Sktlim@umich.edu    SERIALIZE_SCALAR(quiesceEndTick);
872862Sktlim@umich.edu    if (kernelStats)
882862Sktlim@umich.edu        kernelStats->serialize(os);
892862Sktlim@umich.edu#endif
902862Sktlim@umich.edu}
912862Sktlim@umich.edu
922862Sktlim@umich.eduvoid
932862Sktlim@umich.eduThreadState::unserialize(Checkpoint *cp, const std::string &section)
942862Sktlim@umich.edu{
952862Sktlim@umich.edu
962862Sktlim@umich.edu    UNSERIALIZE_ENUM(_status);
972862Sktlim@umich.edu    // thread_num and cpu_id are deterministic from the config
982862Sktlim@umich.edu    UNSERIALIZE_SCALAR(funcExeInst);
992862Sktlim@umich.edu    UNSERIALIZE_SCALAR(inst);
1003442Sgblack@eecs.umich.edu    UNSERIALIZE_SCALAR(microPC);
1013442Sgblack@eecs.umich.edu    UNSERIALIZE_SCALAR(nextMicroPC);
1022862Sktlim@umich.edu
1032862Sktlim@umich.edu#if FULL_SYSTEM
1042862Sktlim@umich.edu    Tick quiesceEndTick;
1052862Sktlim@umich.edu    UNSERIALIZE_SCALAR(quiesceEndTick);
1062862Sktlim@umich.edu    if (quiesceEndTick)
1072862Sktlim@umich.edu        quiesceEvent->schedule(quiesceEndTick);
1082862Sktlim@umich.edu    if (kernelStats)
1092862Sktlim@umich.edu        kernelStats->unserialize(cp, section);
1102862Sktlim@umich.edu#endif
1112862Sktlim@umich.edu}
1122862Sktlim@umich.edu
1132683Sktlim@umich.edu#if FULL_SYSTEM
1142683Sktlim@umich.edu
1152683Sktlim@umich.eduvoid
1162683Sktlim@umich.eduThreadState::profileClear()
1172683Sktlim@umich.edu{
1182683Sktlim@umich.edu    if (profile)
1192683Sktlim@umich.edu        profile->clear();
1202683Sktlim@umich.edu}
1212683Sktlim@umich.edu
1222683Sktlim@umich.eduvoid
1232683Sktlim@umich.eduThreadState::profileSample()
1242683Sktlim@umich.edu{
1252683Sktlim@umich.edu    if (profile)
1262683Sktlim@umich.edu        profile->sample(profileNode, profilePC);
1272683Sktlim@umich.edu}
1282683Sktlim@umich.edu
1293402Sktlim@umich.edu#else
1303402Sktlim@umich.eduTranslatingPort *
1313402Sktlim@umich.eduThreadState::getMemPort()
1323402Sktlim@umich.edu{
1333402Sktlim@umich.edu    if (port != NULL)
1343402Sktlim@umich.edu        return port;
1353402Sktlim@umich.edu
1363402Sktlim@umich.edu    /* Use this port to for syscall emulation writes to memory. */
1373402Sktlim@umich.edu    port = new TranslatingPort(csprintf("%s-%d-funcport",
1383402Sktlim@umich.edu                                        baseCpu->name(), tid),
1393402Sktlim@umich.edu                               process->pTable, false);
1403402Sktlim@umich.edu
1413486Sktlim@umich.edu    Port *func_port = getMemFuncPort();
1423486Sktlim@umich.edu
1433486Sktlim@umich.edu    func_port->setPeer(port);
1443486Sktlim@umich.edu    port->setPeer(func_port);
1453486Sktlim@umich.edu
1463486Sktlim@umich.edu    return port;
1473486Sktlim@umich.edu}
1483486Sktlim@umich.edu#endif
1493486Sktlim@umich.edu
1503486Sktlim@umich.eduPort *
1513486Sktlim@umich.eduThreadState::getMemFuncPort()
1523486Sktlim@umich.edu{
1533486Sktlim@umich.edu    Port *dcache_port, *func_mem_port;
1543486Sktlim@umich.edu
1553402Sktlim@umich.edu    dcache_port = baseCpu->getPort("dcache_port");
1563402Sktlim@umich.edu    assert(dcache_port != NULL);
1573402Sktlim@umich.edu
1583402Sktlim@umich.edu    MemObject *mem_object = dcache_port->getPeer()->getOwner();
1593402Sktlim@umich.edu    assert(mem_object != NULL);
1603402Sktlim@umich.edu
1613402Sktlim@umich.edu    func_mem_port = mem_object->getPort("functional");
1623402Sktlim@umich.edu    assert(func_mem_port != NULL);
1633402Sktlim@umich.edu
1643486Sktlim@umich.edu    return func_mem_port;
1653402Sktlim@umich.edu}
166