changeset 2afc0eae6099 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=2afc0eae6099
description:
        inorder-tlb: squash insts in TLB correctly
        TLB had a bug where if it was stalled and waiting , it would not squash 
all instructions older than squashed instruction correctly
        * * *

diffstat:

6 files changed, 87 insertions(+), 8 deletions(-)
src/cpu/inorder/cpu.cc                |   20 +++++++++-
src/cpu/inorder/cpu.hh                |    2 +
src/cpu/inorder/resource.cc           |    5 ++
src/cpu/inorder/resource_pool.cc      |    2 -
src/cpu/inorder/resources/tlb_unit.cc |   61 +++++++++++++++++++++++++++++++--
src/cpu/inorder/resources/tlb_unit.hh |    5 ++

diffs (189 lines):

diff -r 55e837d741fa -r 2afc0eae6099 src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc    Tue May 12 15:01:16 2009 -0400
+++ b/src/cpu/inorder/cpu.cc    Tue May 12 15:01:16 2009 -0400
@@ -80,6 +80,22 @@
     setEvent(e_type, fault, _tid, _vpe);
 }
 
+
+std::string InOrderCPU::eventNames[NumCPUEvents] =
+{
+    "ActivateThread",
+    "DeallocateThread",
+    "SuspendThread",
+    "DisableThreads",
+    "EnableThreads",
+    "DisableVPEs",
+    "EnableVPEs",
+    "Trap",
+    "InstGraduated",
+    "SquashAll",
+    "UpdatePCs"
+};
+
 void
 InOrderCPU::CPUEvent::process()
 {
@@ -486,8 +502,8 @@
     CPUEvent *cpu_event = new CPUEvent(this, c_event, fault, tid, vpe);
 
     if (delay >= 0) {
-        DPRINTF(InOrderCPU, "Scheduling CPU Event Type #%i for cycle %i.\n",
-                c_event, curTick + delay);
+        DPRINTF(InOrderCPU, "Scheduling CPU Event Type #%s for cycle %i.\n",
+                eventNames[c_event], curTick + delay);
         mainEventQueue.schedule(cpu_event,curTick + delay);
     } else {
         cpu_event->process();
diff -r 55e837d741fa -r 2afc0eae6099 src/cpu/inorder/cpu.hh
--- a/src/cpu/inorder/cpu.hh    Tue May 12 15:01:16 2009 -0400
+++ b/src/cpu/inorder/cpu.hh    Tue May 12 15:01:16 2009 -0400
@@ -175,6 +175,8 @@
         NumCPUEvents
     };
 
+    static std::string eventNames[NumCPUEvents];
+
     /** Define CPU Event */
     class CPUEvent : public Event
     {
diff -r 55e837d741fa -r 2afc0eae6099 src/cpu/inorder/resource.cc
--- a/src/cpu/inorder/resource.cc       Tue May 12 15:01:16 2009 -0400
+++ b/src/cpu/inorder/resource.cc       Tue May 12 15:01:16 2009 -0400
@@ -304,9 +304,12 @@
                     req_ptr->getInst()->readTid(),
                     req_ptr->getInst()->seqNum);
 
+            req_ptr->setSquashed();
+
             int req_slot_num = req_ptr->getSlot();
 
-            unscheduleEvent(req_slot_num);
+            if (resourceEvent[req_slot_num].scheduled())
+                unscheduleEvent(req_slot_num);
 
             // Mark request for later removal
             cpu->reqRemoveList.push(req_ptr);
diff -r 55e837d741fa -r 2afc0eae6099 src/cpu/inorder/resource_pool.cc
--- a/src/cpu/inorder/resource_pool.cc  Tue May 12 15:01:16 2009 -0400
+++ b/src/cpu/inorder/resource_pool.cc  Tue May 12 15:01:16 2009 -0400
@@ -256,7 +256,7 @@
         break;
 
       default:
-        DPRINTF(Resource, "Ignoring Unrecognized CPU Event Type #%i.\n", 
e_type);
+        DPRINTF(Resource, "Ignoring Unrecognized CPU Event Type #%s.\n", 
InOrderCPU::eventNames[e_type]);
         ; // If Resource Pool doesnt recognize event, we ignore it.
     }
 }
diff -r 55e837d741fa -r 2afc0eae6099 src/cpu/inorder/resources/tlb_unit.cc
--- a/src/cpu/inorder/resources/tlb_unit.cc     Tue May 12 15:01:16 2009 -0400
+++ b/src/cpu/inorder/resources/tlb_unit.cc     Tue May 12 15:01:16 2009 -0400
@@ -43,7 +43,7 @@
 
 TLBUnit::TLBUnit(string res_name, int res_id, int res_width,
                  int res_latency, InOrderCPU *_cpu, ThePipeline::Params 
*params)
-    : InstBuffer(res_name, res_id, res_width, res_latency, _cpu, params)
+: Resource(res_name, res_id, res_width, res_latency, _cpu)
 {
     // Hard-Code Selection For Now
     if (res_name == "I-TLB")
@@ -124,7 +124,9 @@
                 DPRINTF(InOrderTLB, "[tid:%i]: %s encountered while 
translating "
                         "addr:%08p for [sn:%i].\n", tid, 
tlb_req->fault->name(),
                         tlb_req->memReq->getVaddr(), seq_num);
-                //insert(inst);
+
+                DPRINTF(InOrderTLB, "slot:%i sn:%i schedule event.\n", 
slot_idx, seq_num);
+
                 cpu->pipelineStage[stage_num]->setResStall(tlb_req, tid);
                 tlbBlocked[tid] = true;
                 scheduleEvent(slot_idx, 1);
@@ -210,7 +212,7 @@
 
     tlb_res->tlbBlocked[tid] = false;
 
-    
tlb_res->cpu->pipelineStage[stage_num]->unsetResStall(resource->reqMap[slotIdx],
 tid);
+    
tlb_res->cpu->pipelineStage[stage_num]->unsetResStall(tlb_res->reqMap[slotIdx], 
tid);
 
     // Effectively NOP the instruction but still allow it
     // to commit
@@ -219,3 +221,56 @@
     //inst->resSched.pop();
     //}
 }
+
+void
+TLBUnit::squash(DynInstPtr inst, int stage_num,
+                   InstSeqNum squash_seq_num, unsigned tid)
+{
+     //@TODO: Figure out a way to consolidate common parts
+     //       of this squash code
+     std::vector<int> slot_remove_list;
+
+     map<int, ResReqPtr>::iterator map_it = reqMap.begin();
+     map<int, ResReqPtr>::iterator map_end = reqMap.end();
+
+     while (map_it != map_end) {
+         ResReqPtr req_ptr = (*map_it).second;
+
+         if (req_ptr &&
+             req_ptr->getInst()->readTid() == tid &&
+             req_ptr->getInst()->seqNum > squash_seq_num) {
+
+             DPRINTF(Resource, "[tid:%i]: Squashing [sn:%i].\n",
+                     req_ptr->getInst()->readTid(),
+                     req_ptr->getInst()->seqNum);
+
+             req_ptr->setSquashed();
+
+             int req_slot_num = req_ptr->getSlot();
+
+             tlbBlocked[tid] = false;
+
+             int stall_stage = reqMap[req_slot_num]->getStageNum();
+
+             
cpu->pipelineStage[stall_stage]->unsetResStall(reqMap[req_slot_num], tid);
+
+             if (resourceEvent[req_slot_num].scheduled())
+                 unscheduleEvent(req_slot_num);
+
+             // Mark request for later removal
+             cpu->reqRemoveList.push(req_ptr);
+
+             // Mark slot for removal from resource
+             slot_remove_list.push_back(req_ptr->getSlot());
+         }
+
+         map_it++;
+     }
+
+     // Now Delete Slot Entry from Req. Map
+     for (int i = 0; i < slot_remove_list.size(); i++) {
+         freeSlot(slot_remove_list[i]);
+     }
+}
+
+
diff -r 55e837d741fa -r 2afc0eae6099 src/cpu/inorder/resources/tlb_unit.hh
--- a/src/cpu/inorder/resources/tlb_unit.hh     Tue May 12 15:01:16 2009 -0400
+++ b/src/cpu/inorder/resources/tlb_unit.hh     Tue May 12 15:01:16 2009 -0400
@@ -41,7 +41,8 @@
 #include "cpu/inorder/pipeline_traits.hh"
 #include "cpu/inorder/cpu.hh"
 
-class TLBUnit : public InstBuffer {
+class TLBUnit : public Resource
+{
   public:
     typedef ThePipeline::DynInstPtr DynInstPtr;
 
@@ -66,6 +67,8 @@
 
     virtual void execute(int slot_num);
 
+    void squash(DynInstPtr inst, int stage_num, InstSeqNum squash_seq_num, 
unsigned tid);
+
     bool tlbBlocked[ThePipeline::MaxThreads];
 
     TheISA::TLB* tlb();
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to