thread_state.cc revision 6324
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
466221Snate@binkert.orgThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid)
476031Ssteve.reinhardt@amd.com#else
486221Snate@binkert.orgThreadState::ThreadState(BaseCPU *cpu, ThreadID _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
596324Sgblack@eecs.umich.edu      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);
802862Sktlim@umich.edu
812862Sktlim@umich.edu#if FULL_SYSTEM
822862Sktlim@umich.edu    Tick quiesceEndTick = 0;
832862Sktlim@umich.edu    if (quiesceEvent->scheduled())
842862Sktlim@umich.edu        quiesceEndTick = quiesceEvent->when();
852862Sktlim@umich.edu    SERIALIZE_SCALAR(quiesceEndTick);
862862Sktlim@umich.edu    if (kernelStats)
872862Sktlim@umich.edu        kernelStats->serialize(os);
882862Sktlim@umich.edu#endif
892862Sktlim@umich.edu}
902862Sktlim@umich.edu
912862Sktlim@umich.eduvoid
922862Sktlim@umich.eduThreadState::unserialize(Checkpoint *cp, const std::string &section)
932862Sktlim@umich.edu{
942862Sktlim@umich.edu
952862Sktlim@umich.edu    UNSERIALIZE_ENUM(_status);
962862Sktlim@umich.edu    // thread_num and cpu_id are deterministic from the config
972862Sktlim@umich.edu    UNSERIALIZE_SCALAR(funcExeInst);
982862Sktlim@umich.edu    UNSERIALIZE_SCALAR(inst);
992862Sktlim@umich.edu
1002862Sktlim@umich.edu#if FULL_SYSTEM
1012862Sktlim@umich.edu    Tick quiesceEndTick;
1022862Sktlim@umich.edu    UNSERIALIZE_SCALAR(quiesceEndTick);
1032862Sktlim@umich.edu    if (quiesceEndTick)
1045606Snate@binkert.org        baseCpu->schedule(quiesceEvent, quiesceEndTick);
1052862Sktlim@umich.edu    if (kernelStats)
1062862Sktlim@umich.edu        kernelStats->unserialize(cp, section);
1072862Sktlim@umich.edu#endif
1082862Sktlim@umich.edu}
1092862Sktlim@umich.edu
1102683Sktlim@umich.edu#if FULL_SYSTEM
1113675Sktlim@umich.eduvoid
1125497Ssaidi@eecs.umich.eduThreadState::connectMemPorts(ThreadContext *tc)
1133675Sktlim@umich.edu{
1143686Sktlim@umich.edu    connectPhysPort();
1155497Ssaidi@eecs.umich.edu    connectVirtPort(tc);
1163675Sktlim@umich.edu}
1173675Sktlim@umich.edu
1183675Sktlim@umich.eduvoid
1193686Sktlim@umich.eduThreadState::connectPhysPort()
1203675Sktlim@umich.edu{
1213686Sktlim@umich.edu    // @todo: For now this disregards any older port that may have
1223686Sktlim@umich.edu    // already existed.  Fix this memory leak once the bus port IDs
1233686Sktlim@umich.edu    // for functional ports is resolved.
1244190Ssaidi@eecs.umich.edu    if (physPort)
1255494Sstever@gmail.com        physPort->removeConn();
1264190Ssaidi@eecs.umich.edu    else
1274190Ssaidi@eecs.umich.edu        physPort = new FunctionalPort(csprintf("%s-%d-funcport",
1285715Shsul@eecs.umich.edu                                           baseCpu->name(), _threadId));
1293675Sktlim@umich.edu    connectToMemFunc(physPort);
1303675Sktlim@umich.edu}
1313675Sktlim@umich.edu
1323675Sktlim@umich.eduvoid
1335497Ssaidi@eecs.umich.eduThreadState::connectVirtPort(ThreadContext *tc)
1343675Sktlim@umich.edu{
1353686Sktlim@umich.edu    // @todo: For now this disregards any older port that may have
1363686Sktlim@umich.edu    // already existed.  Fix this memory leak once the bus port IDs
1373686Sktlim@umich.edu    // for functional ports is resolved.
1384190Ssaidi@eecs.umich.edu    if (virtPort)
1395494Sstever@gmail.com        virtPort->removeConn();
1404190Ssaidi@eecs.umich.edu    else
1414190Ssaidi@eecs.umich.edu        virtPort = new VirtualPort(csprintf("%s-%d-vport",
1425715Shsul@eecs.umich.edu                                        baseCpu->name(), _threadId), tc);
1433675Sktlim@umich.edu    connectToMemFunc(virtPort);
1443675Sktlim@umich.edu}
1452683Sktlim@umich.edu
1462683Sktlim@umich.eduvoid
1472683Sktlim@umich.eduThreadState::profileClear()
1482683Sktlim@umich.edu{
1492683Sktlim@umich.edu    if (profile)
1502683Sktlim@umich.edu        profile->clear();
1512683Sktlim@umich.edu}
1522683Sktlim@umich.edu
1532683Sktlim@umich.eduvoid
1542683Sktlim@umich.eduThreadState::profileSample()
1552683Sktlim@umich.edu{
1562683Sktlim@umich.edu    if (profile)
1572683Sktlim@umich.edu        profile->sample(profileNode, profilePC);
1582683Sktlim@umich.edu}
1592683Sktlim@umich.edu
1603402Sktlim@umich.edu#else
1613402Sktlim@umich.eduTranslatingPort *
1623402Sktlim@umich.eduThreadState::getMemPort()
1633402Sktlim@umich.edu{
1643402Sktlim@umich.edu    if (port != NULL)
1653402Sktlim@umich.edu        return port;
1663402Sktlim@umich.edu
1673402Sktlim@umich.edu    /* Use this port to for syscall emulation writes to memory. */
1685715Shsul@eecs.umich.edu    port = new TranslatingPort(csprintf("%s-%d-funcport", baseCpu->name(), _threadId),
1694434Ssaidi@eecs.umich.edu                               process, TranslatingPort::NextPage);
1703402Sktlim@umich.edu
1713675Sktlim@umich.edu    connectToMemFunc(port);
1723486Sktlim@umich.edu
1733486Sktlim@umich.edu    return port;
1743486Sktlim@umich.edu}
1753486Sktlim@umich.edu#endif
1763486Sktlim@umich.edu
1773675Sktlim@umich.eduvoid
1783675Sktlim@umich.eduThreadState::connectToMemFunc(Port *port)
1793486Sktlim@umich.edu{
1803486Sktlim@umich.edu    Port *dcache_port, *func_mem_port;
1813486Sktlim@umich.edu
1823402Sktlim@umich.edu    dcache_port = baseCpu->getPort("dcache_port");
1833402Sktlim@umich.edu    assert(dcache_port != NULL);
1843402Sktlim@umich.edu
1853402Sktlim@umich.edu    MemObject *mem_object = dcache_port->getPeer()->getOwner();
1863402Sktlim@umich.edu    assert(mem_object != NULL);
1873402Sktlim@umich.edu
1883402Sktlim@umich.edu    func_mem_port = mem_object->getPort("functional");
1893402Sktlim@umich.edu    assert(func_mem_port != NULL);
1903402Sktlim@umich.edu
1913675Sktlim@umich.edu    func_mem_port->setPeer(port);
1923675Sktlim@umich.edu    port->setPeer(func_mem_port);
1933402Sktlim@umich.edu}
194