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 §ion) 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