CPU: Fix O3 and possible InOrder segfaults in FS.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 20 Sep 2010 09:46:42 +0000 (02:46 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 20 Sep 2010 09:46:42 +0000 (02:46 -0700)
src/cpu/inorder/cpu.cc
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.cc
src/cpu/o3/cpu.hh
src/cpu/o3/dyn_inst_impl.hh

index 5d4d3c5800be805a490d9d60f1763372017502ab..5d42ba5594479237e80aeff5d33beafb6cf16edf 100644 (file)
@@ -633,7 +633,9 @@ InOrderCPU::processInterrupts(Fault interrupt)
     this->interrupts->updateIntrInfo(this->threadContexts[0]);
 
     DPRINTF(InOrderCPU, "Interrupt %s being handled\n", interrupt->name());
-    this->trap(interrupt, 0);
+    static StaticInstPtr dummyStatic(TheISA::NoopMachInst, 0);
+    static DynInstPtr dummyDyn = new Impl::DynInst(dummyStatic);
+    this->trap(interrupt, dummyDyn);
 }
 
 
index 87f18d4e4cff72e106a62d4054809a6d41295431..98c7b49c891faccc8b2d69f4af3e476d2e64163e 100644 (file)
@@ -1062,7 +1062,7 @@ DefaultCommit<Impl>::commitHead(DynInstPtr &head_inst, unsigned inst_num)
         // needed to update the state as soon as possible.  This
         // prevents external agents from changing any specific state
         // that the trap need.
-        cpu->trap(inst_fault, tid, head_inst);
+        cpu->trap(inst_fault, tid, head_inst->staticInst);
 
         // Exit state update mode to avoid accidental updating.
         thread[tid]->inSyscall = false;
index 7eea04ce6469096a7334c96ce27288fe519e3336..8e9f3ef5d077a5880aea52c9d23d438f89d0c1d9 100644 (file)
@@ -926,8 +926,7 @@ FullO3CPU<Impl>::processInterrupts(Fault interrupt)
     this->interrupts->updateIntrInfo(this->threadContexts[0]);
 
     DPRINTF(O3CPU, "Interrupt %s being handled\n", interrupt->name());
-    DynInstPtr dummyInst;
-    this->trap(interrupt, 0, dummyInst);
+    this->trap(interrupt, 0, NULL);
 }
 
 template <class Impl>
@@ -944,10 +943,10 @@ FullO3CPU<Impl>::updateMemPorts()
 
 template <class Impl>
 void
-FullO3CPU<Impl>::trap(Fault fault, ThreadID tid, DynInstPtr inst)
+FullO3CPU<Impl>::trap(Fault fault, ThreadID tid, StaticInstPtr inst)
 {
     // Pass the thread's TC into the invoke method.
-    fault->invoke(this->threadContexts[tid], inst->staticInst);
+    fault->invoke(this->threadContexts[tid], inst);
 }
 
 #if !FULL_SYSTEM
index e7368993be70799be6679b6f8ccde5b0ddfbf7a2..57c07a9ecafd4ce7820cf570dc56dfae50ae55f1 100644 (file)
@@ -367,7 +367,7 @@ class FullO3CPU : public BaseO3CPU
     { return globalSeqNum++; }
 
     /** Traps to handle given fault. */
-    void trap(Fault fault, ThreadID tid, DynInstPtr inst);
+    void trap(Fault fault, ThreadID tid, StaticInstPtr inst);
 
 #if FULL_SYSTEM
     /** HW return from error interrupt. */
index 9406e2be0b3a153aa58c9ff562e3cf5b0541404d..3e015d9626763f32eabbf3796c8b459e06064016 100644 (file)
@@ -155,7 +155,7 @@ template <class Impl>
 void
 BaseO3DynInst<Impl>::trap(Fault fault)
 {
-    this->cpu->trap(fault, this->threadNumber, this);
+    this->cpu->trap(fault, this->threadNumber, this->staticInst);
 }
 
 template <class Impl>