thread_state.cc revision 6031
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"
423675Sktlim@umich.edu#include "mem/vport.hh"
432862Sktlim@umich.edu#endif
442683Sktlim@umich.edu
452683Sktlim@umich.edu#if FULL_SYSTEM
465712Shsul@eecs.umich.eduThreadState::ThreadState(BaseCPU *cpu, int _tid)
476031Ssteve.reinhardt@amd.com#else
486031Ssteve.reinhardt@amd.comThreadState::ThreadState(BaseCPU *cpu, int _tid,
496031Ssteve.reinhardt@amd.com                         Process *_process, short _asid)
506031Ssteve.reinhardt@amd.com#endif
516031Ssteve.reinhardt@amd.com    : numInst(0), numLoad(0), _status(ThreadContext::Halted),
526031Ssteve.reinhardt@amd.com      baseCpu(cpu), _threadId(_tid), lastActivate(0), lastSuspend(0),
536031Ssteve.reinhardt@amd.com#if FULL_SYSTEM
542683Sktlim@umich.edu      profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
555482Snate@binkert.org      kernelStats(NULL), physPort(NULL), virtPort(NULL),
566031Ssteve.reinhardt@amd.com#else
576031Ssteve.reinhardt@amd.com      port(NULL), process(_process), asid(_asid),
586031Ssteve.reinhardt@amd.com#endif
593280Sgblack@eecs.umich.edu      microPC(0), nextMicroPC(1), funcExeInst(0), storeCondFailures(0)
602683Sktlim@umich.edu{
612683Sktlim@umich.edu}
622683Sktlim@umich.edu
633486Sktlim@umich.eduThreadState::~ThreadState()
643486Sktlim@umich.edu{
653486Sktlim@umich.edu#if !FULL_SYSTEM
663486Sktlim@umich.edu    if (port) {
673486Sktlim@umich.edu        delete port->getPeer();
683486Sktlim@umich.edu        delete port;
693486Sktlim@umich.edu    }
703486Sktlim@umich.edu#endif
713486Sktlim@umich.edu}
723486Sktlim@umich.edu
732862Sktlim@umich.eduvoid
742862Sktlim@umich.eduThreadState::serialize(std::ostream &os)
752862Sktlim@umich.edu{
762862Sktlim@umich.edu    SERIALIZE_ENUM(_status);
772862Sktlim@umich.edu    // thread_num and cpu_id are deterministic from the config
782862Sktlim@umich.edu    SERIALIZE_SCALAR(funcExeInst);
792862Sktlim@umich.edu    SERIALIZE_SCALAR(inst);
803442Sgblack@eecs.umich.edu    SERIALIZE_SCALAR(microPC);
813442Sgblack@eecs.umich.edu    SERIALIZE_SCALAR(nextMicroPC);
822862Sktlim@umich.edu
832862Sktlim@umich.edu#if FULL_SYSTEM
842862Sktlim@umich.edu    Tick quiesceEndTick = 0;
852862Sktlim@umich.edu    if (quiesceEvent->scheduled())
862862Sktlim@umich.edu        quiesceEndTick = quiesceEvent->when();
872862Sktlim@umich.edu    SERIALIZE_SCALAR(quiesceEndTick);
882862Sktlim@umich.edu    if (kernelStats)
892862Sktlim@umich.edu        kernelStats->serialize(os);
902862Sktlim@umich.edu#endif
912862Sktlim@umich.edu}
922862Sktlim@umich.edu
932862Sktlim@umich.eduvoid
942862Sktlim@umich.eduThreadState::unserialize(Checkpoint *cp, const std::string &section)
952862Sktlim@umich.edu{
962862Sktlim@umich.edu
972862Sktlim@umich.edu    UNSERIALIZE_ENUM(_status);
982862Sktlim@umich.edu    // thread_num and cpu_id are deterministic from the config
992862Sktlim@umich.edu    UNSERIALIZE_SCALAR(funcExeInst);
1002862Sktlim@umich.edu    UNSERIALIZE_SCALAR(inst);
1013442Sgblack@eecs.umich.edu    UNSERIALIZE_SCALAR(microPC);
1023442Sgblack@eecs.umich.edu    UNSERIALIZE_SCALAR(nextMicroPC);
1032862Sktlim@umich.edu
1042862Sktlim@umich.edu#if FULL_SYSTEM
1052862Sktlim@umich.edu    Tick quiesceEndTick;
1062862Sktlim@umich.edu    UNSERIALIZE_SCALAR(quiesceEndTick);
1072862Sktlim@umich.edu    if (quiesceEndTick)
1085606Snate@binkert.org        baseCpu->schedule(quiesceEvent, quiesceEndTick);
1092862Sktlim@umich.edu    if (kernelStats)
1102862Sktlim@umich.edu        kernelStats->unserialize(cp, section);
1112862Sktlim@umich.edu#endif
1122862Sktlim@umich.edu}
1132862Sktlim@umich.edu
1142683Sktlim@umich.edu#if FULL_SYSTEM
1153675Sktlim@umich.eduvoid
1165497Ssaidi@eecs.umich.eduThreadState::connectMemPorts(ThreadContext *tc)
1173675Sktlim@umich.edu{
1183686Sktlim@umich.edu    connectPhysPort();
1195497Ssaidi@eecs.umich.edu    connectVirtPort(tc);
1203675Sktlim@umich.edu}
1213675Sktlim@umich.edu
1223675Sktlim@umich.eduvoid
1233686Sktlim@umich.eduThreadState::connectPhysPort()
1243675Sktlim@umich.edu{
1253686Sktlim@umich.edu    // @todo: For now this disregards any older port that may have
1263686Sktlim@umich.edu    // already existed.  Fix this memory leak once the bus port IDs
1273686Sktlim@umich.edu    // for functional ports is resolved.
1284190Ssaidi@eecs.umich.edu    if (physPort)
1295494Sstever@gmail.com        physPort->removeConn();
1304190Ssaidi@eecs.umich.edu    else
1314190Ssaidi@eecs.umich.edu        physPort = new FunctionalPort(csprintf("%s-%d-funcport",
1325715Shsul@eecs.umich.edu                                           baseCpu->name(), _threadId));
1333675Sktlim@umich.edu    connectToMemFunc(physPort);
1343675Sktlim@umich.edu}
1353675Sktlim@umich.edu
1363675Sktlim@umich.eduvoid
1375497Ssaidi@eecs.umich.eduThreadState::connectVirtPort(ThreadContext *tc)
1383675Sktlim@umich.edu{
1393686Sktlim@umich.edu    // @todo: For now this disregards any older port that may have
1403686Sktlim@umich.edu    // already existed.  Fix this memory leak once the bus port IDs
1413686Sktlim@umich.edu    // for functional ports is resolved.
1424190Ssaidi@eecs.umich.edu    if (virtPort)
1435494Sstever@gmail.com        virtPort->removeConn();
1444190Ssaidi@eecs.umich.edu    else
1454190Ssaidi@eecs.umich.edu        virtPort = new VirtualPort(csprintf("%s-%d-vport",
1465715Shsul@eecs.umich.edu                                        baseCpu->name(), _threadId), tc);
1473675Sktlim@umich.edu    connectToMemFunc(virtPort);
1483675Sktlim@umich.edu}
1492683Sktlim@umich.edu
1502683Sktlim@umich.eduvoid
1512683Sktlim@umich.eduThreadState::profileClear()
1522683Sktlim@umich.edu{
1532683Sktlim@umich.edu    if (profile)
1542683Sktlim@umich.edu        profile->clear();
1552683Sktlim@umich.edu}
1562683Sktlim@umich.edu
1572683Sktlim@umich.eduvoid
1582683Sktlim@umich.eduThreadState::profileSample()
1592683Sktlim@umich.edu{
1602683Sktlim@umich.edu    if (profile)
1612683Sktlim@umich.edu        profile->sample(profileNode, profilePC);
1622683Sktlim@umich.edu}
1632683Sktlim@umich.edu
1643402Sktlim@umich.edu#else
1653402Sktlim@umich.eduTranslatingPort *
1663402Sktlim@umich.eduThreadState::getMemPort()
1673402Sktlim@umich.edu{
1683402Sktlim@umich.edu    if (port != NULL)
1693402Sktlim@umich.edu        return port;
1703402Sktlim@umich.edu
1713402Sktlim@umich.edu    /* Use this port to for syscall emulation writes to memory. */
1725715Shsul@eecs.umich.edu    port = new TranslatingPort(csprintf("%s-%d-funcport", baseCpu->name(), _threadId),
1734434Ssaidi@eecs.umich.edu                               process, TranslatingPort::NextPage);
1743402Sktlim@umich.edu
1753675Sktlim@umich.edu    connectToMemFunc(port);
1763486Sktlim@umich.edu
1773486Sktlim@umich.edu    return port;
1783486Sktlim@umich.edu}
1793486Sktlim@umich.edu#endif
1803486Sktlim@umich.edu
1813675Sktlim@umich.eduvoid
1823675Sktlim@umich.eduThreadState::connectToMemFunc(Port *port)
1833486Sktlim@umich.edu{
1843486Sktlim@umich.edu    Port *dcache_port, *func_mem_port;
1853486Sktlim@umich.edu
1863402Sktlim@umich.edu    dcache_port = baseCpu->getPort("dcache_port");
1873402Sktlim@umich.edu    assert(dcache_port != NULL);
1883402Sktlim@umich.edu
1893402Sktlim@umich.edu    MemObject *mem_object = dcache_port->getPeer()->getOwner();
1903402Sktlim@umich.edu    assert(mem_object != NULL);
1913402Sktlim@umich.edu
1923402Sktlim@umich.edu    func_mem_port = mem_object->getPort("functional");
1933402Sktlim@umich.edu    assert(func_mem_port != NULL);
1943402Sktlim@umich.edu
1953675Sktlim@umich.edu    func_mem_port->setPeer(port);
1963675Sktlim@umich.edu    port->setPeer(func_mem_port);
1973402Sktlim@umich.edu}
198