/** Sets this thread's next PC. */
virtual void setNextPC(uint64_t val);
+ virtual uint64_t readMicroPC()
+ { return cpu->readMicroPC(thread->readTid()); }
+
+ virtual void setMicroPC(uint64_t val);
+
+ virtual uint64_t readNextMicroPC()
+ { return cpu->readNextMicroPC(thread->readTid()); }
+
+ virtual void setNextMicroPC(uint64_t val);
+
/** Reads a miscellaneous register. */
virtual MiscReg readMiscRegNoEffect(int misc_reg)
{ return cpu->readMiscRegNoEffect(misc_reg, thread->readTid()); }
// Copy the misc regs.
TheISA::copyMiscRegs(tc, this);
- // Then finally set the PC and the next PC.
+ // Then finally set the PC, the next PC, the nextNPC, the micropc, and the
+ // next micropc.
cpu->setPC(tc->readPC(), tid);
cpu->setNextPC(tc->readNextPC(), tid);
+ cpu->setNextNPC(tc->readNextNPC(), tid);
+ cpu->setMicroPC(tc->readMicroPC(), tid);
+ cpu->setNextMicroPC(tc->readNextMicroPC(), tid);
#if !FULL_SYSTEM
this->thread->funcExeInst = tc->readFuncExeInst();
#endif
}
}
+template <class Impl>
+void
+O3ThreadContext<Impl>::setMicroPC(uint64_t val)
+{
+ cpu->setMicroPC(val, thread->readTid());
+
+ // Squash if we're not already in a state update mode.
+ if (!thread->trapPending && !thread->inSyscall) {
+ cpu->squashFromTC(thread->readTid());
+ }
+}
+
+template <class Impl>
+void
+O3ThreadContext<Impl>::setNextMicroPC(uint64_t val)
+{
+ cpu->setNextMicroPC(val, thread->readTid());
+
+ // Squash if we're not already in a state update mode.
+ if (!thread->trapPending && !thread->inSyscall) {
+ cpu->squashFromTC(thread->readTid());
+ }
+}
+
template <class Impl>
void
O3ThreadContext<Impl>::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
virtual void setNextNPC(uint64_t val) = 0;
+ virtual uint64_t readMicroPC() = 0;
+
+ virtual void setMicroPC(uint64_t val) = 0;
+
+ virtual uint64_t readNextMicroPC() = 0;
+
+ virtual void setNextMicroPC(uint64_t val) = 0;
+
virtual MiscReg readMiscRegNoEffect(int misc_reg) = 0;
virtual MiscReg readMiscReg(int misc_reg) = 0;
void setNextNPC(uint64_t val) { actualTC->setNextNPC(val); }
+ uint64_t readMicroPC() { return actualTC->readMicroPC(); }
+
+ void setMicroPC(uint64_t val) { actualTC->setMicroPC(val); }
+
+ uint64_t readNextMicroPC() { return actualTC->readMicroPC(); }
+
+ void setNextMicroPC(uint64_t val) { actualTC->setMicroPC(val); }
+
MiscReg readMiscRegNoEffect(int misc_reg)
{ return actualTC->readMiscRegNoEffect(misc_reg); }