inorder: use trapPending flag to manage traps
authorKorey Sewell <ksewell@umich.edu>
Mon, 20 Jun 2011 01:43:41 +0000 (21:43 -0400)
committerKorey Sewell <ksewell@umich.edu>
Mon, 20 Jun 2011 01:43:41 +0000 (21:43 -0400)
src/cpu/inorder/cpu.cc
src/cpu/inorder/cpu.hh
src/cpu/inorder/resources/graduation_unit.cc

index 365b2f18a190f983149412c349f2d597bcc87898..158489f86833b5ac663a30d6b90815c1b8534657 100644 (file)
@@ -149,6 +149,7 @@ InOrderCPU::CPUEvent::process()
         DPRINTF(InOrderCPU, "Trapping CPU\n");
         cpu->trap(fault, tid, inst);
         cpu->resPool->trap(fault, tid, inst);
+        cpu->trapPending[tid] = false;
         break;
 
 #if !FULL_SYSTEM
@@ -359,6 +360,8 @@ InOrderCPU::InOrderCPU(Params *params)
     dummyTrapInst[tid]->setTid(tid);
 #endif
 
+    trapPending[tid] = false;
+
     }
 
     dummyReqInst = new InOrderDynInst(this, NULL, 0, 0, 0);
@@ -698,8 +701,8 @@ InOrderCPU::tick()
 
     ++numCycles;
 
+    checkForInterrupts();
     bool pipes_idle = true;
-    
     //Tick each of the stages
     for (int stNum=NumStages - 1; stNum >= 0 ; stNum--) {
         pipelineStage[stNum]->tick();
@@ -707,8 +710,6 @@ InOrderCPU::tick()
         pipes_idle = pipes_idle && pipelineStage[stNum]->idle;
     }
 
-    checkForInterrupts();
-
     if (pipes_idle)
         idleCycles++;
     else
@@ -902,6 +903,7 @@ void
 InOrderCPU::trapContext(Fault fault, ThreadID tid, DynInstPtr inst, int delay)
 {
     scheduleCpuEvent(Trap, fault, tid, inst, delay);
+    trapPending[tid] = true;
 }
 
 void
index a1e92f302fe565efe45dec33594af9b4fe755342..a5616f8b18862064da524335011277d483844cb4 100644 (file)
@@ -667,6 +667,8 @@ class InOrderCPU : public BaseCPU
      */
     std::queue<ListIt> removeList;
 
+    bool trapPending[ThePipeline::MaxThreads];
+
     /** List of all the cpu event requests that will be removed at the end of
      *  the current cycle.
      */
index ebcf40c6a0bd914d18dae8a82cf76c254db078d7..c69e5551293a2f684f45ba78419fd301d60d026c 100644 (file)
@@ -66,7 +66,9 @@ GraduationUnit::execute(int slot_num)
         return;
     }
 
-    if (lastFaultTick[tid] == cur_tick) {
+    //@todo: use trap Pending
+    if (cpu->trapPending[tid]) {
+        //if (lastFaultTick[tid] == cur_tick) {
         DPRINTF(InOrderGraduation, "Unable to graduate [sn:%i]. "
                 "Only 1 fault can be handled per tick.\n");
         grad_req->done(false);