X86: Make the micropc available through the thread context objects.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 12 Nov 2007 22:38:17 +0000 (14:38 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 12 Nov 2007 22:38:17 +0000 (14:38 -0800)
This is necssary for fault handlers that branch to non-zero micro PCs.

--HG--
extra : convert_revision : c1cb4863d779a9f4a508d0b450e64fb7a985f264

src/cpu/o3/thread_context.hh
src/cpu/o3/thread_context_impl.hh
src/cpu/thread_context.hh

index 31e08db4ce85b9685f973707f98b238b9c81b3e7..55b385d11c86af8d6156708d7e9d242a3dcc4629 100755 (executable)
@@ -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()); }
index efbbc232960119377f0488a10a10935c82c6fe17..55584629e7f6f3778a9eca17d3a6fba60b516d2f 100755 (executable)
@@ -289,9 +289,13 @@ O3ThreadContext<Impl>::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<Impl>::setNextPC(uint64_t val)
     }
 }
 
+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)
index 31fdb42c2b605c3df36428057d83be8b07efd6c3..0d09492eee96ece4746b353501f8850dc5a21e75 100644 (file)
@@ -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); }