From 7a39457d7ff5fd80484061a4ff7006921899b229 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 12 Nov 2007 14:38:17 -0800 Subject: [PATCH] X86: Make the micropc available through the thread context objects. This is necssary for fault handlers that branch to non-zero micro PCs. --HG-- extra : convert_revision : c1cb4863d779a9f4a508d0b450e64fb7a985f264 --- src/cpu/o3/thread_context.hh | 10 ++++++++++ src/cpu/o3/thread_context_impl.hh | 30 +++++++++++++++++++++++++++++- src/cpu/thread_context.hh | 16 ++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/cpu/o3/thread_context.hh b/src/cpu/o3/thread_context.hh index 31e08db4c..55b385d11 100755 --- a/src/cpu/o3/thread_context.hh +++ b/src/cpu/o3/thread_context.hh @@ -203,6 +203,16 @@ class O3ThreadContext : public ThreadContext /** 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()); } diff --git a/src/cpu/o3/thread_context_impl.hh b/src/cpu/o3/thread_context_impl.hh index efbbc2329..55584629e 100755 --- a/src/cpu/o3/thread_context_impl.hh +++ b/src/cpu/o3/thread_context_impl.hh @@ -289,9 +289,13 @@ O3ThreadContext::copyArchRegs(ThreadContext *tc) // 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 @@ -448,6 +452,30 @@ O3ThreadContext::setNextPC(uint64_t val) } } +template +void +O3ThreadContext::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 +void +O3ThreadContext::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 void O3ThreadContext::setMiscRegNoEffect(int misc_reg, const MiscReg &val) diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh index 31fdb42c2..0d09492ee 100644 --- a/src/cpu/thread_context.hh +++ b/src/cpu/thread_context.hh @@ -226,6 +226,14 @@ class ThreadContext 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; @@ -419,6 +427,14 @@ class ProxyThreadContext : public ThreadContext 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); } -- 2.30.2