thread_state.cc revision 7679
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
486331Sgblack@eecs.umich.eduThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process)
496031Ssteve.reinhardt@amd.com#endif
506031Ssteve.reinhardt@amd.com    : numInst(0), numLoad(0), _status(ThreadContext::Halted),
516031Ssteve.reinhardt@amd.com      baseCpu(cpu), _threadId(_tid), lastActivate(0), lastSuspend(0),
526031Ssteve.reinhardt@amd.com#if FULL_SYSTEM
532683Sktlim@umich.edu      profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
545482Snate@binkert.org      kernelStats(NULL), physPort(NULL), virtPort(NULL),
556031Ssteve.reinhardt@amd.com#else
566331Sgblack@eecs.umich.edu      port(NULL), process(_process),
576031Ssteve.reinhardt@amd.com#endif
586324Sgblack@eecs.umich.edu      funcExeInst(0), storeCondFailures(0)
592683Sktlim@umich.edu{
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
792862Sktlim@umich.edu#if FULL_SYSTEM
802862Sktlim@umich.edu    Tick quiesceEndTick = 0;
812862Sktlim@umich.edu    if (quiesceEvent->scheduled())
822862Sktlim@umich.edu        quiesceEndTick = quiesceEvent->when();
832862Sktlim@umich.edu    SERIALIZE_SCALAR(quiesceEndTick);
842862Sktlim@umich.edu    if (kernelStats)
852862Sktlim@umich.edu        kernelStats->serialize(os);
862862Sktlim@umich.edu#endif
872862Sktlim@umich.edu}
882862Sktlim@umich.edu
892862Sktlim@umich.eduvoid
902862Sktlim@umich.eduThreadState::unserialize(Checkpoint *cp, const std::string &section)
912862Sktlim@umich.edu{
922862Sktlim@umich.edu
932862Sktlim@umich.edu    UNSERIALIZE_ENUM(_status);
942862Sktlim@umich.edu    // thread_num and cpu_id are deterministic from the config
952862Sktlim@umich.edu    UNSERIALIZE_SCALAR(funcExeInst);
962862Sktlim@umich.edu
972862Sktlim@umich.edu#if FULL_SYSTEM
982862Sktlim@umich.edu    Tick quiesceEndTick;
992862Sktlim@umich.edu    UNSERIALIZE_SCALAR(quiesceEndTick);
1002862Sktlim@umich.edu    if (quiesceEndTick)
1015606Snate@binkert.org        baseCpu->schedule(quiesceEvent, quiesceEndTick);
1022862Sktlim@umich.edu    if (kernelStats)
1032862Sktlim@umich.edu        kernelStats->unserialize(cp, section);
1042862Sktlim@umich.edu#endif
1052862Sktlim@umich.edu}
1062862Sktlim@umich.edu
1072683Sktlim@umich.edu#if FULL_SYSTEM
1083675Sktlim@umich.eduvoid
1095497Ssaidi@eecs.umich.eduThreadState::connectMemPorts(ThreadContext *tc)
1103675Sktlim@umich.edu{
1113686Sktlim@umich.edu    connectPhysPort();
1125497Ssaidi@eecs.umich.edu    connectVirtPort(tc);
1133675Sktlim@umich.edu}
1143675Sktlim@umich.edu
1153675Sktlim@umich.eduvoid
1163686Sktlim@umich.eduThreadState::connectPhysPort()
1173675Sktlim@umich.edu{
1183686Sktlim@umich.edu    // @todo: For now this disregards any older port that may have
1193686Sktlim@umich.edu    // already existed.  Fix this memory leak once the bus port IDs
1203686Sktlim@umich.edu    // for functional ports is resolved.
1214190Ssaidi@eecs.umich.edu    if (physPort)
1225494Sstever@gmail.com        physPort->removeConn();
1234190Ssaidi@eecs.umich.edu    else
1244190Ssaidi@eecs.umich.edu        physPort = new FunctionalPort(csprintf("%s-%d-funcport",
1255715Shsul@eecs.umich.edu                                           baseCpu->name(), _threadId));
1263675Sktlim@umich.edu    connectToMemFunc(physPort);
1273675Sktlim@umich.edu}
1283675Sktlim@umich.edu
1293675Sktlim@umich.eduvoid
1305497Ssaidi@eecs.umich.eduThreadState::connectVirtPort(ThreadContext *tc)
1313675Sktlim@umich.edu{
1323686Sktlim@umich.edu    // @todo: For now this disregards any older port that may have
1333686Sktlim@umich.edu    // already existed.  Fix this memory leak once the bus port IDs
1343686Sktlim@umich.edu    // for functional ports is resolved.
1354190Ssaidi@eecs.umich.edu    if (virtPort)
1365494Sstever@gmail.com        virtPort->removeConn();
1374190Ssaidi@eecs.umich.edu    else
1384190Ssaidi@eecs.umich.edu        virtPort = new VirtualPort(csprintf("%s-%d-vport",
1395715Shsul@eecs.umich.edu                                        baseCpu->name(), _threadId), tc);
1403675Sktlim@umich.edu    connectToMemFunc(virtPort);
1413675Sktlim@umich.edu}
1422683Sktlim@umich.edu
1432683Sktlim@umich.eduvoid
1442683Sktlim@umich.eduThreadState::profileClear()
1452683Sktlim@umich.edu{
1462683Sktlim@umich.edu    if (profile)
1472683Sktlim@umich.edu        profile->clear();
1482683Sktlim@umich.edu}
1492683Sktlim@umich.edu
1502683Sktlim@umich.eduvoid
1512683Sktlim@umich.eduThreadState::profileSample()
1522683Sktlim@umich.edu{
1532683Sktlim@umich.edu    if (profile)
1542683Sktlim@umich.edu        profile->sample(profileNode, profilePC);
1552683Sktlim@umich.edu}
1562683Sktlim@umich.edu
1573402Sktlim@umich.edu#else
1583402Sktlim@umich.eduTranslatingPort *
1593402Sktlim@umich.eduThreadState::getMemPort()
1603402Sktlim@umich.edu{
1613402Sktlim@umich.edu    if (port != NULL)
1623402Sktlim@umich.edu        return port;
1633402Sktlim@umich.edu
1643402Sktlim@umich.edu    /* Use this port to for syscall emulation writes to memory. */
1655715Shsul@eecs.umich.edu    port = new TranslatingPort(csprintf("%s-%d-funcport", baseCpu->name(), _threadId),
1664434Ssaidi@eecs.umich.edu                               process, TranslatingPort::NextPage);
1673402Sktlim@umich.edu
1683675Sktlim@umich.edu    connectToMemFunc(port);
1693486Sktlim@umich.edu
1703486Sktlim@umich.edu    return port;
1713486Sktlim@umich.edu}
1723486Sktlim@umich.edu#endif
1733486Sktlim@umich.edu
1743675Sktlim@umich.eduvoid
1753675Sktlim@umich.eduThreadState::connectToMemFunc(Port *port)
1763486Sktlim@umich.edu{
1773486Sktlim@umich.edu    Port *dcache_port, *func_mem_port;
1783486Sktlim@umich.edu
1793402Sktlim@umich.edu    dcache_port = baseCpu->getPort("dcache_port");
1803402Sktlim@umich.edu    assert(dcache_port != NULL);
1813402Sktlim@umich.edu
1823402Sktlim@umich.edu    MemObject *mem_object = dcache_port->getPeer()->getOwner();
1833402Sktlim@umich.edu    assert(mem_object != NULL);
1843402Sktlim@umich.edu
1853402Sktlim@umich.edu    func_mem_port = mem_object->getPort("functional");
1863402Sktlim@umich.edu    assert(func_mem_port != NULL);
1873402Sktlim@umich.edu
1883675Sktlim@umich.edu    func_mem_port->setPeer(port);
1893675Sktlim@umich.edu    port->setPeer(func_mem_port);
1903402Sktlim@umich.edu}
191