inorder-unified-tlb: use unified TLB instead of old TLB model
authorKorey Sewell <ksewell@umich.edu>
Tue, 12 May 2009 19:01:14 +0000 (15:01 -0400)
committerKorey Sewell <ksewell@umich.edu>
Tue, 12 May 2009 19:01:14 +0000 (15:01 -0400)
src/arch/alpha/regfile.hh
src/cpu/inorder/cpu.cc
src/cpu/inorder/cpu.hh
src/cpu/inorder/inorder_dyn_inst.hh
src/cpu/inorder/pipeline_traits.cc
src/cpu/inorder/resources/cache_unit.cc
src/cpu/inorder/resources/tlb_unit.cc
src/cpu/inorder/resources/tlb_unit.hh

index e431e75700c62bb26db589709398407fff3dd8e0..cbd3657f75dc1939bfa83026a8375678c37b824a 100644 (file)
@@ -36,6 +36,7 @@
 #include "arch/alpha/intregfile.hh"
 #include "arch/alpha/miscregfile.hh"
 #include "arch/alpha/types.hh"
+#include "arch/alpha/mt.hh"
 #include "sim/faults.hh"
 
 #include <string>
index 83e94e74dd9f99e5bf57fa1cc265169cc631e246..c5f06c3b2c4e68a6739675061d357e691d9b4aca 100644 (file)
@@ -1264,17 +1264,17 @@ InOrderCPU::write(DynInstPtr inst)
     return mem_res->doDataAccess(inst);
 }
 
-TheISA::ITB*
+TheISA::TLB*
 InOrderCPU::getITBPtr()
 {
     TLBUnit *itb_res = dynamic_cast<TLBUnit*>(resPool->getResource(itbIdx));
-    return dynamic_cast<TheISA::ITB*>(itb_res->tlb());
+    return itb_res->tlb();
 }
 
 
-TheISA::DTB*
+TheISA::TLB*
 InOrderCPU::getDTBPtr()
 {
     TLBUnit *dtb_res = dynamic_cast<TLBUnit*>(resPool->getResource(dtbIdx));
-    return dynamic_cast<TheISA::DTB*>(dtb_res->tlb());
+    return dtb_res->tlb();
 }
index 7c1ad82642123d3ea460508292607df3fd3542ce..fda2e43661abce96ba75478371adbea458095733 100644 (file)
@@ -266,8 +266,8 @@ class InOrderCPU : public BaseCPU
     /** Communication structure that sits in between pipeline stages */
     StageQueue *stageQueue[ThePipeline::NumStages-1];
 
-    TheISA::ITB *getITBPtr();
-    TheISA::DTB *getDTBPtr();
+    TheISA::TLB *getITBPtr();
+    TheISA::TLB *getDTBPtr();
 
   public:
 
index 143d10783f4026ab7dad743f69fbede81889d646..042a6485a055a18202434467e5c9a39028192666 100644 (file)
@@ -419,11 +419,10 @@ class InOrderDynInst : public FastAlloc, public RefCounted
 
 
     /** Print Resource Schedule */
+    /** @NOTE: DEBUG ONLY */
     void printSched()
     {
-        using namespace ThePipeline;
-
-        ResSchedule tempSched;
+        ThePipeline::ResSchedule tempSched;
         std::cerr << "\tInst. Res. Schedule: ";
         while (!resSched.empty()) {
             std::cerr << '\t' << resSched.top()->stageNum << "-"
@@ -835,7 +834,7 @@ class InOrderDynInst : public FastAlloc, public RefCounted
     IntReg readIntRegOperand(const StaticInst *si, int idx, unsigned tid=0);
     FloatReg readFloatRegOperand(const StaticInst *si, int idx,
                           int width = TheISA::SingleWidth);
-    FloatRegBits readFloatRegOperandBits(const StaticInst *si, int idx,
+    TheISA::FloatRegBits readFloatRegOperandBits(const StaticInst *si, int idx,
                                   int width = TheISA::SingleWidth);
     MiscReg readMiscReg(int misc_reg);
     MiscReg readMiscRegNoEffect(int misc_reg);
@@ -878,7 +877,7 @@ class InOrderDynInst : public FastAlloc, public RefCounted
     void setIntRegOperand(const StaticInst *si, int idx, IntReg val);
     void setFloatRegOperand(const StaticInst *si, int idx, FloatReg val,
                      int width = TheISA::SingleWidth);
-    void setFloatRegOperandBits(const StaticInst *si, int idx, FloatRegBits val,
+    void setFloatRegOperandBits(const StaticInst *si, int idx, TheISA::FloatRegBits val,
                          int width = TheISA::SingleWidth);
     void setMiscReg(int misc_reg, const MiscReg &val);
     void setMiscRegNoEffect(int misc_reg, const MiscReg &val);
index 1c17b0d3f669a66a688848802e0603abbbb65348..1501151387a251679e7fac85358a25656677ed50 100644 (file)
@@ -101,7 +101,7 @@ bool createBackEndSchedule(DynInstPtr &inst)
     } else if ( inst->isMemRef() ) {
         if ( inst->isLoad() ) {
             E->needs(AGEN, AGENUnit::GenerateAddr);
-            E->needs(DTLB, TLBUnit::DataLookup);
+            E->needs(DTLB, TLBUnit::DataReadLookup);
             E->needs(DCache, CacheUnit::InitiateReadData);
         }
     } else if (inst->opClass() == IntMultOp || inst->opClass() == IntDivOp) {
@@ -122,7 +122,7 @@ bool createBackEndSchedule(DynInstPtr &inst)
     } else if ( inst->isStore() ) {
         M->needs(RegManager, UseDefUnit::ReadSrcReg, 1);
         M->needs(AGEN, AGENUnit::GenerateAddr);
-        M->needs(DTLB, TLBUnit::DataLookup);
+        M->needs(DTLB, TLBUnit::DataWriteLookup);
         M->needs(DCache, CacheUnit::InitiateWriteData);
     }
 
index 1b5d07450b7b652c9ba97e25293ee291b5ab47cd..6fe0bcf7661d22972ed2c9178b88cf2d973cf280 100644 (file)
@@ -451,10 +451,12 @@ CacheUnit::processCacheCompletion(PacketPtr pkt)
 
 
     // Get resource request info
-    // @todo: SMT needs to figure out where to get thread # from.
-    unsigned tid = 0;
     unsigned stage_num = cache_req->getStageNum();
     DynInstPtr inst = cache_req->inst;
+    unsigned tid;
+
+
+    tid = cache_req->inst->readTid();
 
     if (!cache_req->isSquashed()) {
         if (inst->resSched.top()->cmd == CompleteFetch) {
index fbc6bc195feb98e9c06f97fbe9c25728a34e5f3e..dbf7996615cc04760a1cf19332a174a0b07805e4 100644 (file)
@@ -118,7 +118,7 @@ TLBUnit::execute(int slot_idx)
         {
             tlb_req->fault =
                 _tlb->translateAtomic(tlb_req->memReq,
-                        cpu->thread[tid]->getTC(), false, true);
+                                      cpu->thread[tid]->getTC(), TheISA::TLB::Execute);
 
             if (tlb_req->fault != NoFault) {
                 DPRINTF(InOrderTLB, "[tid:%i]: %s encountered while translating "
@@ -142,14 +142,19 @@ TLBUnit::execute(int slot_idx)
         }
         break;
 
-      case DataLookup:
+      case DataReadLookup:
+      case DataWriteLookup:
         {
             DPRINTF(InOrderTLB, "[tid:%i]: [sn:%i]: Attempting to translate %08p.\n",
                     tid, seq_num, tlb_req->memReq->getVaddr());
 
+
+            TheISA::TLB::Mode tlb_mode = (tlb_req->cmd == DataReadLookup) ?
+                TheISA::TLB::Read : TheISA::TLB::Write;
+
             tlb_req->fault =
                 _tlb->translateAtomic(tlb_req->memReq,
-                        cpu->thread[tid]->getTC());
+                                      cpu->thread[tid]->getTC(), tlb_mode);
 
             if (tlb_req->fault != NoFault) {
                 DPRINTF(InOrderTLB, "[tid:%i]: %s encountered while translating "
index b53f251fc10b85e669d2571da1231672062c499b..b0cdac2a2f037e4e2988a64470653dfcc1fef8ce 100644 (file)
@@ -47,7 +47,8 @@ class TLBUnit : public InstBuffer {
 
     enum TLBCommand {
         FetchLookup,
-        DataLookup
+        DataReadLookup,
+        DataWriteLookup
     };
 
   public:
@@ -103,7 +104,7 @@ class TLBUnitRequest : public ResourceRequest {
 
         if (_cmd == TLBUnit::FetchLookup) {
             aligned_addr = inst->getMemAddr();
-            req_size = sizeof(MachInst);
+            req_size = sizeof(TheISA::MachInst);
             flags = 0;
         } else {
             aligned_addr = inst->getMemAddr();;