thread_context_impl.hh revision 6314:781969fbeca9
16019SN/A/*
26019SN/A * Copyright (c) 2004-2006 The Regents of The University of Michigan
37134Sgblack@eecs.umich.edu * All rights reserved.
47134Sgblack@eecs.umich.edu *
57134Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67134Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77134Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87134Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97134Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107134Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117134Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127134Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137134Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
147134Sgblack@eecs.umich.edu * this software without specific prior written permission.
156019SN/A *
166019SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176019SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186019SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196019SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206019SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216019SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226019SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236019SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246019SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256019SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266019SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276019SN/A *
286019SN/A * Authors: Kevin Lim
296019SN/A *          Korey Sewell
306019SN/A */
316019SN/A
326019SN/A#include "arch/regfile.hh"
336019SN/A#include "cpu/o3/thread_context.hh"
346019SN/A#include "cpu/quiesce_event.hh"
356019SN/A
366019SN/A#if FULL_SYSTEM
376019SN/Atemplate <class Impl>
386019SN/AVirtualPort *
396019SN/AO3ThreadContext<Impl>::getVirtPort()
406019SN/A{
416019SN/A    return thread->getVirtPort();
426308SN/A}
436308SN/A
446309SN/Atemplate <class Impl>
456309SN/Avoid
466309SN/AO3ThreadContext<Impl>::dumpFuncProfile()
476309SN/A{
486309SN/A    thread->dumpFuncProfile();
497134Sgblack@eecs.umich.edu}
507296Sgblack@eecs.umich.edu#endif
516309SN/A
526309SN/Atemplate <class Impl>
537296Sgblack@eecs.umich.eduvoid
547134Sgblack@eecs.umich.eduO3ThreadContext<Impl>::takeOverFrom(ThreadContext *old_context)
556309SN/A{
566309SN/A    // some things should already be set up
576309SN/A    assert(getSystemPtr() == old_context->getSystemPtr());
587342Sgblack@eecs.umich.edu#if !FULL_SYSTEM
597174Sgblack@eecs.umich.edu    assert(getProcessPtr() == old_context->getProcessPtr());
607639Sgblack@eecs.umich.edu#endif
617639Sgblack@eecs.umich.edu
627644Sali.saidi@arm.com    // copy over functional state
637639Sgblack@eecs.umich.edu    setStatus(old_context->status());
647639Sgblack@eecs.umich.edu    copyArchRegs(old_context);
657639Sgblack@eecs.umich.edu    setContextId(old_context->contextId());
667639Sgblack@eecs.umich.edu    setThreadId(old_context->threadId());
677639Sgblack@eecs.umich.edu
687639Sgblack@eecs.umich.edu#if !FULL_SYSTEM
697639Sgblack@eecs.umich.edu    thread->funcExeInst = old_context->readFuncExeInst();
707639Sgblack@eecs.umich.edu#else
717644Sali.saidi@arm.com    EndQuiesceEvent *other_quiesce = old_context->getQuiesceEvent();
727639Sgblack@eecs.umich.edu    if (other_quiesce) {
737639Sgblack@eecs.umich.edu        // Point the quiesce event's TC at this TC so that it wakes up
747639Sgblack@eecs.umich.edu        // the proper CPU.
757639Sgblack@eecs.umich.edu        other_quiesce->tc = this;
767639Sgblack@eecs.umich.edu    }
777639Sgblack@eecs.umich.edu    if (thread->quiesceEvent) {
787639Sgblack@eecs.umich.edu        thread->quiesceEvent->tc = this;
797639Sgblack@eecs.umich.edu    }
807639Sgblack@eecs.umich.edu
817639Sgblack@eecs.umich.edu    // Transfer kernel stats from one CPU to the other.
827644Sali.saidi@arm.com    thread->kernelStats = old_context->getKernelStats();
837639Sgblack@eecs.umich.edu//    storeCondFailures = 0;
847639Sgblack@eecs.umich.edu    cpu->lockFlag = false;
857639Sgblack@eecs.umich.edu#endif
867639Sgblack@eecs.umich.edu
877639Sgblack@eecs.umich.edu    old_context->setStatus(ThreadContext::Halted);
887174Sgblack@eecs.umich.edu
896754SN/A    thread->inSyscall = false;
907296Sgblack@eecs.umich.edu    thread->trapPending = false;
917400SAli.Saidi@ARM.com}
927134Sgblack@eecs.umich.edu
937400SAli.Saidi@ARM.comtemplate <class Impl>
947134Sgblack@eecs.umich.eduvoid
957134Sgblack@eecs.umich.eduO3ThreadContext<Impl>::activate(int delay)
967296Sgblack@eecs.umich.edu{
976754SN/A    DPRINTF(O3CPU, "Calling activate on Thread Context %d\n",
986754SN/A            threadId());
996754SN/A
1006754SN/A    if (thread->status() == ThreadContext::Active)
1016754SN/A        return;
1027134Sgblack@eecs.umich.edu
1037422Sgblack@eecs.umich.edu#if FULL_SYSTEM
1046754SN/A    thread->lastActivate = curTick;
1056754SN/A#endif
1067296Sgblack@eecs.umich.edu
1076309SN/A    thread->setStatus(ThreadContext::Active);
1086309SN/A
1097296Sgblack@eecs.umich.edu    // status() == Suspended
1107303Sgblack@eecs.umich.edu    cpu->activateContext(thread->threadId(), delay);
1117134Sgblack@eecs.umich.edu}
1126309SN/A
1136309SN/Atemplate <class Impl>
1146309SN/Avoid
1157296Sgblack@eecs.umich.eduO3ThreadContext<Impl>::suspend(int delay)
1167174Sgblack@eecs.umich.edu{
1177174Sgblack@eecs.umich.edu    DPRINTF(O3CPU, "Calling suspend on Thread Context %d\n",
1187296Sgblack@eecs.umich.edu            threadId());
1197303Sgblack@eecs.umich.edu
1207644Sali.saidi@arm.com    if (thread->status() == ThreadContext::Suspended)
1217644Sali.saidi@arm.com        return;
1227174Sgblack@eecs.umich.edu
1237174Sgblack@eecs.umich.edu#if FULL_SYSTEM
1247174Sgblack@eecs.umich.edu    thread->lastActivate = curTick;
1257639Sgblack@eecs.umich.edu    thread->lastSuspend = curTick;
1267639Sgblack@eecs.umich.edu#endif
1277639Sgblack@eecs.umich.edu/*
1287639Sgblack@eecs.umich.edu#if FULL_SYSTEM
1297639Sgblack@eecs.umich.edu    // Don't change the status from active if there are pending interrupts
1307644Sali.saidi@arm.com    if (cpu->checkInterrupts()) {
1317639Sgblack@eecs.umich.edu        assert(status() == ThreadContext::Active);
1327639Sgblack@eecs.umich.edu        return;
1337639Sgblack@eecs.umich.edu    }
1347639Sgblack@eecs.umich.edu#endif
1357639Sgblack@eecs.umich.edu*/
1367639Sgblack@eecs.umich.edu    thread->setStatus(ThreadContext::Suspended);
1377639Sgblack@eecs.umich.edu    cpu->suspendContext(thread->threadId());
1387639Sgblack@eecs.umich.edu}
1397639Sgblack@eecs.umich.edu
1407639Sgblack@eecs.umich.edutemplate <class Impl>
1417639Sgblack@eecs.umich.eduvoid
1427644Sali.saidi@arm.comO3ThreadContext<Impl>::halt(int delay)
1437639Sgblack@eecs.umich.edu{
1447639Sgblack@eecs.umich.edu    DPRINTF(O3CPU, "Calling halt on Thread Context %d\n",
1457639Sgblack@eecs.umich.edu            threadId());
1467639Sgblack@eecs.umich.edu
1477639Sgblack@eecs.umich.edu    if (thread->status() == ThreadContext::Halted)
1487639Sgblack@eecs.umich.edu        return;
1497174Sgblack@eecs.umich.edu
1507174Sgblack@eecs.umich.edu    thread->setStatus(ThreadContext::Halted);
1517639Sgblack@eecs.umich.edu    cpu->haltContext(thread->threadId());
1527639Sgblack@eecs.umich.edu}
1537639Sgblack@eecs.umich.edu
1547639Sgblack@eecs.umich.edutemplate <class Impl>
1557174Sgblack@eecs.umich.eduvoid
1567174Sgblack@eecs.umich.eduO3ThreadContext<Impl>::regStats(const std::string &name)
1577174Sgblack@eecs.umich.edu{
1587174Sgblack@eecs.umich.edu#if FULL_SYSTEM
1597174Sgblack@eecs.umich.edu    thread->kernelStats = new TheISA::Kernel::Statistics(cpu->system);
1607174Sgblack@eecs.umich.edu    thread->kernelStats->regStats(name + ".kern");
1617174Sgblack@eecs.umich.edu#endif
1627174Sgblack@eecs.umich.edu}
1637174Sgblack@eecs.umich.edu
1647174Sgblack@eecs.umich.edutemplate <class Impl>
1657174Sgblack@eecs.umich.eduvoid
1666309SN/AO3ThreadContext<Impl>::serialize(std::ostream &os)
1676308SN/A{
1687639Sgblack@eecs.umich.edu#if FULL_SYSTEM
1697639Sgblack@eecs.umich.edu    if (thread->kernelStats)
1707639Sgblack@eecs.umich.edu        thread->kernelStats->serialize(os);
1717639Sgblack@eecs.umich.edu#endif
1727639Sgblack@eecs.umich.edu
1737639Sgblack@eecs.umich.edu}
1747639Sgblack@eecs.umich.edu
1757639Sgblack@eecs.umich.edutemplate <class Impl>
1767639Sgblack@eecs.umich.eduvoid
1777639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::unserialize(Checkpoint *cp, const std::string &section)
1787639Sgblack@eecs.umich.edu{
1797639Sgblack@eecs.umich.edu#if FULL_SYSTEM
1807639Sgblack@eecs.umich.edu    if (thread->kernelStats)
1817639Sgblack@eecs.umich.edu        thread->kernelStats->unserialize(cp, section);
1827639Sgblack@eecs.umich.edu#endif
1837639Sgblack@eecs.umich.edu
1847639Sgblack@eecs.umich.edu}
1857639Sgblack@eecs.umich.edu
1867639Sgblack@eecs.umich.edu#if FULL_SYSTEM
1877639Sgblack@eecs.umich.edutemplate <class Impl>
1887639Sgblack@eecs.umich.eduTick
1897639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::readLastActivate()
1907639Sgblack@eecs.umich.edu{
1917639Sgblack@eecs.umich.edu    return thread->lastActivate;
1927639Sgblack@eecs.umich.edu}
1937639Sgblack@eecs.umich.edu
1947639Sgblack@eecs.umich.edutemplate <class Impl>
1957639Sgblack@eecs.umich.eduTick
1967639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::readLastSuspend()
1977639Sgblack@eecs.umich.edu{
1987639Sgblack@eecs.umich.edu    return thread->lastSuspend;
1997639Sgblack@eecs.umich.edu}
2007639Sgblack@eecs.umich.edu
2017639Sgblack@eecs.umich.edutemplate <class Impl>
2027639Sgblack@eecs.umich.eduvoid
2037639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::profileClear()
2047639Sgblack@eecs.umich.edu{
2057639Sgblack@eecs.umich.edu    thread->profileClear();
2067639Sgblack@eecs.umich.edu}
2077639Sgblack@eecs.umich.edu
2087639Sgblack@eecs.umich.edutemplate <class Impl>
2097639Sgblack@eecs.umich.eduvoid
2107639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::profileSample()
2117639Sgblack@eecs.umich.edu{
2127639Sgblack@eecs.umich.edu    thread->profileSample();
2137639Sgblack@eecs.umich.edu}
2147639Sgblack@eecs.umich.edu#endif
2157639Sgblack@eecs.umich.edu
2167639Sgblack@eecs.umich.edutemplate <class Impl>
2177639Sgblack@eecs.umich.eduTheISA::MachInst
2187639Sgblack@eecs.umich.eduO3ThreadContext<Impl>:: getInst()
2197639Sgblack@eecs.umich.edu{
2207639Sgblack@eecs.umich.edu    return thread->getInst();
2217639Sgblack@eecs.umich.edu}
2227639Sgblack@eecs.umich.edu
2237639Sgblack@eecs.umich.edutemplate <class Impl>
2247639Sgblack@eecs.umich.eduvoid
2257639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::copyArchRegs(ThreadContext *tc)
2267644Sali.saidi@arm.com{
2277639Sgblack@eecs.umich.edu    // This function will mess things up unless the ROB is empty and
2287639Sgblack@eecs.umich.edu    // there are no instructions in the pipeline.
2297639Sgblack@eecs.umich.edu    ThreadID tid = thread->threadId();
2307639Sgblack@eecs.umich.edu    PhysRegIndex renamed_reg;
2317639Sgblack@eecs.umich.edu
2327639Sgblack@eecs.umich.edu    // First loop through the integer registers.
2337639Sgblack@eecs.umich.edu    for (int i = 0; i < TheISA::NumIntRegs; ++i) {
2347639Sgblack@eecs.umich.edu        renamed_reg = cpu->renameMap[tid].lookup(i);
2357644Sali.saidi@arm.com
2367639Sgblack@eecs.umich.edu        DPRINTF(O3CPU, "Copying over register %i, had data %lli, "
2377639Sgblack@eecs.umich.edu                "now has data %lli.\n",
2387639Sgblack@eecs.umich.edu                renamed_reg, cpu->readIntReg(renamed_reg),
2397639Sgblack@eecs.umich.edu                tc->readIntReg(i));
2407639Sgblack@eecs.umich.edu
2417639Sgblack@eecs.umich.edu        cpu->setIntReg(renamed_reg, tc->readIntReg(i));
2427639Sgblack@eecs.umich.edu    }
2437639Sgblack@eecs.umich.edu
2447639Sgblack@eecs.umich.edu    // Then loop through the floating point registers.
2457639Sgblack@eecs.umich.edu    for (int i = 0; i < TheISA::NumFloatRegs; ++i) {
2467639Sgblack@eecs.umich.edu        renamed_reg = cpu->renameMap[tid].lookup(i + TheISA::FP_Base_DepTag);
2477639Sgblack@eecs.umich.edu        cpu->setFloatRegBits(renamed_reg,
2487639Sgblack@eecs.umich.edu                             tc->readFloatRegBits(i));
2497639Sgblack@eecs.umich.edu    }
2507639Sgblack@eecs.umich.edu
2517639Sgblack@eecs.umich.edu    // Copy the misc regs.
2527639Sgblack@eecs.umich.edu    TheISA::copyMiscRegs(tc, this);
2537639Sgblack@eecs.umich.edu
2547639Sgblack@eecs.umich.edu    // Then finally set the PC, the next PC, the nextNPC, the micropc, and the
2557639Sgblack@eecs.umich.edu    // next micropc.
2567639Sgblack@eecs.umich.edu    cpu->setPC(tc->readPC(), tid);
2577639Sgblack@eecs.umich.edu    cpu->setNextPC(tc->readNextPC(), tid);
2587639Sgblack@eecs.umich.edu    cpu->setNextNPC(tc->readNextNPC(), tid);
2597639Sgblack@eecs.umich.edu    cpu->setMicroPC(tc->readMicroPC(), tid);
2607639Sgblack@eecs.umich.edu    cpu->setNextMicroPC(tc->readNextMicroPC(), tid);
2617639Sgblack@eecs.umich.edu#if !FULL_SYSTEM
2627639Sgblack@eecs.umich.edu    this->thread->funcExeInst = tc->readFuncExeInst();
2637639Sgblack@eecs.umich.edu#endif
2647639Sgblack@eecs.umich.edu}
2657639Sgblack@eecs.umich.edu
2667639Sgblack@eecs.umich.edutemplate <class Impl>
2677639Sgblack@eecs.umich.eduvoid
2687639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::clearArchRegs()
2697639Sgblack@eecs.umich.edu{}
2707639Sgblack@eecs.umich.edu
2717639Sgblack@eecs.umich.edutemplate <class Impl>
2727639Sgblack@eecs.umich.eduuint64_t
2737639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::readIntReg(int reg_idx)
2747639Sgblack@eecs.umich.edu{
2757639Sgblack@eecs.umich.edu    reg_idx = cpu->isa[thread->threadId()].flattenIntIndex(reg_idx);
2767639Sgblack@eecs.umich.edu    return cpu->readArchIntReg(reg_idx, thread->threadId());
2777639Sgblack@eecs.umich.edu}
2787639Sgblack@eecs.umich.edu
2797639Sgblack@eecs.umich.edutemplate <class Impl>
2807639Sgblack@eecs.umich.eduTheISA::FloatReg
2817639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::readFloatReg(int reg_idx)
2827639Sgblack@eecs.umich.edu{
2837639Sgblack@eecs.umich.edu    reg_idx = cpu->isa[thread->threadId()].flattenFloatIndex(reg_idx);
2847639Sgblack@eecs.umich.edu    return cpu->readArchFloatReg(reg_idx, thread->threadId());
2857639Sgblack@eecs.umich.edu}
2867639Sgblack@eecs.umich.edu
2877639Sgblack@eecs.umich.edutemplate <class Impl>
2887639Sgblack@eecs.umich.eduTheISA::FloatRegBits
2897639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::readFloatRegBits(int reg_idx)
2907639Sgblack@eecs.umich.edu{
2917639Sgblack@eecs.umich.edu    reg_idx = cpu->isa[thread->threadId()].flattenFloatIndex(reg_idx);
2927639Sgblack@eecs.umich.edu    return cpu->readArchFloatRegInt(reg_idx, thread->threadId());
2937639Sgblack@eecs.umich.edu}
2947639Sgblack@eecs.umich.edu
2957639Sgblack@eecs.umich.edutemplate <class Impl>
2967639Sgblack@eecs.umich.eduvoid
2977639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setIntReg(int reg_idx, uint64_t val)
2987639Sgblack@eecs.umich.edu{
2997639Sgblack@eecs.umich.edu    reg_idx = cpu->isa[thread->threadId()].flattenIntIndex(reg_idx);
3007639Sgblack@eecs.umich.edu    cpu->setArchIntReg(reg_idx, val, thread->threadId());
3017639Sgblack@eecs.umich.edu
3027639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
3037639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3047639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3057639Sgblack@eecs.umich.edu    }
3067639Sgblack@eecs.umich.edu}
3077639Sgblack@eecs.umich.edu
3087639Sgblack@eecs.umich.edutemplate <class Impl>
3097639Sgblack@eecs.umich.eduvoid
3107639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setFloatReg(int reg_idx, FloatReg val)
3117639Sgblack@eecs.umich.edu{
3127639Sgblack@eecs.umich.edu    reg_idx = cpu->isa[thread->threadId()].flattenFloatIndex(reg_idx);
3137639Sgblack@eecs.umich.edu    cpu->setArchFloatReg(reg_idx, val, thread->threadId());
3147639Sgblack@eecs.umich.edu
3157639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3167639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3177639Sgblack@eecs.umich.edu    }
3187639Sgblack@eecs.umich.edu}
3197639Sgblack@eecs.umich.edu
3207639Sgblack@eecs.umich.edutemplate <class Impl>
3217639Sgblack@eecs.umich.eduvoid
3227639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setFloatRegBits(int reg_idx, FloatRegBits val)
3237639Sgblack@eecs.umich.edu{
3247639Sgblack@eecs.umich.edu    reg_idx = cpu->isa[thread->threadId()].flattenFloatIndex(reg_idx);
3257639Sgblack@eecs.umich.edu    cpu->setArchFloatRegInt(reg_idx, val, thread->threadId());
3267639Sgblack@eecs.umich.edu
3277639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
3287639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3297639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3307639Sgblack@eecs.umich.edu    }
3317639Sgblack@eecs.umich.edu}
3327639Sgblack@eecs.umich.edu
3337639Sgblack@eecs.umich.edutemplate <class Impl>
3347639Sgblack@eecs.umich.eduvoid
3357639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setPC(uint64_t val)
3367639Sgblack@eecs.umich.edu{
3377639Sgblack@eecs.umich.edu    cpu->setPC(val, thread->threadId());
3387639Sgblack@eecs.umich.edu
3397639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
3407639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3417639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3427639Sgblack@eecs.umich.edu    }
3437639Sgblack@eecs.umich.edu}
3447639Sgblack@eecs.umich.edu
3457639Sgblack@eecs.umich.edutemplate <class Impl>
3467639Sgblack@eecs.umich.eduvoid
3477639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setNextPC(uint64_t val)
3487639Sgblack@eecs.umich.edu{
3497639Sgblack@eecs.umich.edu    cpu->setNextPC(val, thread->threadId());
3507639Sgblack@eecs.umich.edu
3517639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
3527639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3537639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3547639Sgblack@eecs.umich.edu    }
3557639Sgblack@eecs.umich.edu}
3567639Sgblack@eecs.umich.edu
3577639Sgblack@eecs.umich.edutemplate <class Impl>
3587639Sgblack@eecs.umich.eduvoid
3597639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setMicroPC(uint64_t val)
3607639Sgblack@eecs.umich.edu{
3617639Sgblack@eecs.umich.edu    cpu->setMicroPC(val, thread->threadId());
3627639Sgblack@eecs.umich.edu
3637639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
3647639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3657639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3667639Sgblack@eecs.umich.edu    }
3677639Sgblack@eecs.umich.edu}
3687639Sgblack@eecs.umich.edu
3697639Sgblack@eecs.umich.edutemplate <class Impl>
3707639Sgblack@eecs.umich.eduvoid
3717639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setNextMicroPC(uint64_t val)
3727639Sgblack@eecs.umich.edu{
3737639Sgblack@eecs.umich.edu    cpu->setNextMicroPC(val, thread->threadId());
3747639Sgblack@eecs.umich.edu
3757639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
3767639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
3777639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
3787639Sgblack@eecs.umich.edu    }
3797639Sgblack@eecs.umich.edu}
3807639Sgblack@eecs.umich.edu
3817639Sgblack@eecs.umich.edutemplate <class Impl>
3827639Sgblack@eecs.umich.eduint
3837639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::flattenIntIndex(int reg)
3847639Sgblack@eecs.umich.edu{
3857639Sgblack@eecs.umich.edu    return cpu->isa[thread->threadId()].flattenIntIndex(reg);
3867639Sgblack@eecs.umich.edu}
3877639Sgblack@eecs.umich.edu
3887639Sgblack@eecs.umich.edutemplate <class Impl>
3897639Sgblack@eecs.umich.eduint
3907639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::flattenFloatIndex(int reg)
3917639Sgblack@eecs.umich.edu{
3927639Sgblack@eecs.umich.edu    return cpu->isa[thread->threadId()].flattenFloatIndex(reg);
3937639Sgblack@eecs.umich.edu}
3947639Sgblack@eecs.umich.edu
3957639Sgblack@eecs.umich.edutemplate <class Impl>
3967639Sgblack@eecs.umich.eduvoid
3977639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
3987639Sgblack@eecs.umich.edu{
3997639Sgblack@eecs.umich.edu    cpu->setMiscRegNoEffect(misc_reg, val, thread->threadId());
4007639Sgblack@eecs.umich.edu
4017639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
4027639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
4037639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
4047639Sgblack@eecs.umich.edu    }
4057639Sgblack@eecs.umich.edu}
4067639Sgblack@eecs.umich.edu
4077639Sgblack@eecs.umich.edutemplate <class Impl>
4087639Sgblack@eecs.umich.eduvoid
4097639Sgblack@eecs.umich.eduO3ThreadContext<Impl>::setMiscReg(int misc_reg,
4107639Sgblack@eecs.umich.edu                                                const MiscReg &val)
4117639Sgblack@eecs.umich.edu{
4127639Sgblack@eecs.umich.edu    cpu->setMiscReg(misc_reg, val, thread->threadId());
4137639Sgblack@eecs.umich.edu
4147639Sgblack@eecs.umich.edu    // Squash if we're not already in a state update mode.
4157639Sgblack@eecs.umich.edu    if (!thread->trapPending && !thread->inSyscall) {
4167639Sgblack@eecs.umich.edu        cpu->squashFromTC(thread->threadId());
4177639Sgblack@eecs.umich.edu    }
4187639Sgblack@eecs.umich.edu}
4197639Sgblack@eecs.umich.edu
4207639Sgblack@eecs.umich.edu