changeset e575781f71b8 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=e575781f71b8
description:
        SE/FS: Make getProcessPtr available in both modes, and get rid of 
FULL_SYSTEMs.

diffstat:

 src/arch/mips/tlb.cc              |  195 +++++--------------------------------
 src/arch/sparc/faults.cc          |   60 +++++-----
 src/arch/sparc/remote_gdb.cc      |   25 ++--
 src/arch/sparc/utility.cc         |   28 ++--
 src/arch/sparc/utility.hh         |    7 +-
 src/arch/x86/tlb.cc               |   52 ++++-----
 src/cpu/checker/thread_context.hh |    3 +-
 src/cpu/inorder/thread_context.cc |    4 -
 src/cpu/inorder/thread_context.hh |    3 +-
 src/cpu/o3/thread_context.hh      |    3 +-
 src/cpu/o3/thread_context_impl.hh |    3 +-
 src/cpu/ozone/cpu.hh              |    3 +-
 src/cpu/ozone/cpu_impl.hh         |    3 +-
 src/cpu/simple_thread.cc          |    5 +-
 src/cpu/thread_context.hh         |    6 +-
 src/cpu/thread_state.hh           |    3 +-
 src/kern/linux/linux.hh           |    9 -
 src/kern/operatingsystem.hh       |    9 -
 18 files changed, 122 insertions(+), 299 deletions(-)

diffs (truncated from 724 to 300 lines):

diff -r b0773af78423 -r e575781f71b8 src/arch/mips/tlb.cc
--- a/src/arch/mips/tlb.cc      Sun Oct 30 00:32:54 2011 -0700
+++ b/src/arch/mips/tlb.cc      Sun Oct 30 00:33:02 2011 -0700
@@ -295,182 +295,45 @@
 Fault
 TLB::translateInst(RequestPtr req, ThreadContext *tc)
 {
-#if !FULL_SYSTEM
-    Process * p = tc->getProcessPtr();
+    if (!FullSystem) {
+        Process * p = tc->getProcessPtr();
 
-    Fault fault = p->pTable->translate(req);
-    if (fault != NoFault)
-        return fault;
+        Fault fault = p->pTable->translate(req);
+        if (fault != NoFault)
+            return fault;
 
-    return NoFault;
-#else
-    Addr vaddr = req->getVaddr();
-
-    bool misaligned = (req->getSize() - 1) & vaddr;
-
-    if (IsKSeg0(vaddr)) {
-        // Address will not be translated through TLB, set response, and go!
-        req->setPaddr(KSeg02Phys(vaddr));
-        if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel ||
-                misaligned) {
-            return new AddressErrorFault(vaddr, false);
-        }
-    } else if(IsKSeg1(vaddr)) {
-        // Address will not be translated through TLB, set response, and go!
-        req->setPaddr(KSeg02Phys(vaddr));
+        return NoFault;
     } else {
-      /* 
-       * This is an optimization - smallPages is updated every time a TLB
-       * operation is performed. That way, we don't need to look at
-       * Config3 _ SP and PageGrain _ ESP every time we do a TLB lookup
-       */
-      Addr VPN;
-      if (smallPages == 1) {
-        VPN = (vaddr >> 11);
-      } else {
-        VPN = ((vaddr >> 11) & 0xFFFFFFFC);
-      }
-      uint8_t Asid = req->getAsid();
-      if (misaligned) {
-          // Unaligned address!
-          return new AddressErrorFault(vaddr, false);
-      }
-      PTE *pte = lookup(VPN,Asid);
-      if (pte != NULL) {
-          // Ok, found something
-          /* Check for valid bits */
-          int EvenOdd;
-          bool Valid;
-          if ((((vaddr) >> pte->AddrShiftAmount) & 1) == 0) {
-              // Check even bits
-              Valid = pte->V0;
-              EvenOdd = 0;
-          } else {
-              // Check odd bits
-              Valid = pte->V1;
-              EvenOdd = 1;
-          }
-
-          if (Valid == false) {
-              return new InvalidFault(Asid, vaddr, vpn, false);
-          } else {
-              // Ok, this is really a match, set paddr
-              Addr PAddr;
-              if (EvenOdd == 0) {
-                PAddr = pte->PFN0;
-              } else {
-                PAddr = pte->PFN1;
-              }
-              PAddr >>= (pte->AddrShiftAmount - 12);
-              PAddr <<= pte->AddrShiftAmount;
-              PAddr |= (vaddr & pte->OffsetMask);
-              req->setPaddr(PAddr);
-            }
-        } else {
-            // Didn't find any match, return a TLB Refill Exception
-            return new RefillFault(Asid, vaddr, vpn, false);
-        }
+        panic("translateInst not implemented in MIPS.\n");
     }
-    return checkCacheability(req);
-#endif
 }
 
 Fault
 TLB::translateData(RequestPtr req, ThreadContext *tc, bool write)
 {
-#if !FULL_SYSTEM
-    //@TODO: This should actually use TLB instead of going directly
-    //       to the page table in syscall mode.
-    /**
-     * Check for alignment faults
-     */
-    if (req->getVaddr() & (req->getSize() - 1)) {
-        DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(),
-                req->getSize());
-        return new AddressErrorFault(req->getVaddr(), write);
+    if (!FullSystem) {
+        //@TODO: This should actually use TLB instead of going directly
+        //       to the page table in syscall mode.
+        /**
+         * Check for alignment faults
+         */
+        if (req->getVaddr() & (req->getSize() - 1)) {
+            DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(),
+                    req->getSize());
+            return new AddressErrorFault(req->getVaddr(), write);
+        }
+
+
+        Process * p = tc->getProcessPtr();
+
+        Fault fault = p->pTable->translate(req);
+        if (fault != NoFault)
+            return fault;
+
+        return NoFault;
+    } else {
+        panic("translateData not implemented in MIPS.\n");
     }
-
-
-    Process * p = tc->getProcessPtr();
-
-    Fault fault = p->pTable->translate(req);
-    if (fault != NoFault)
-        return fault;
-
-    return NoFault;
-#else
-    Addr vaddr = req->getVaddr();
-
-    bool misaligned = (req->getSize() - 1) & vaddr;
-
-    if (IsKSeg0(vaddr)) {
-        // Address will not be translated through TLB, set response, and go!
-        req->setPaddr(KSeg02Phys(vaddr));
-        if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel ||
-                misaligned) {
-            return new AddressErrorFault(vaddr, true);
-        }
-    } else if(IsKSeg1(vaddr)) {
-      // Address will not be translated through TLB, set response, and go!
-      req->setPaddr(KSeg02Phys(vaddr));
-    } else {
-        /* 
-         * This is an optimization - smallPages is updated every time a TLB
-         * operation is performed. That way, we don't need to look at
-         * Config3 _ SP and PageGrain _ ESP every time we do a TLB lookup
-         */
-        Addr VPN = (vaddr >> 11) & 0xFFFFFFFC;
-        if (smallPages == 1) {
-            VPN = vaddr >> 11;
-        }
-        uint8_t Asid = req->getAsid();
-        PTE *pte = lookup(VPN, Asid);
-        if (misaligned) {
-            return new AddressErrorFault(vaddr, true);
-        }
-        if (pte != NULL) {
-            // Ok, found something
-            /* Check for valid bits */
-            int EvenOdd;
-            bool Valid;
-            bool Dirty;
-            if ((((vaddr >> pte->AddrShiftAmount) & 1)) == 0) {
-                // Check even bits
-                Valid = pte->V0;
-                Dirty = pte->D0;
-                EvenOdd = 0;
-            } else {
-                // Check odd bits
-                Valid = pte->V1;
-                Dirty = pte->D1;
-                EvenOdd = 1;
-            }
-
-            if (Valid == false) {
-                return new InvalidFault(Asid, vaddr, VPN, true);
-            } else {
-                // Ok, this is really a match, set paddr
-                if (!Dirty) {
-                    return new TlbModifiedFault(Asid, vaddr, VPN);
-                }
-                Addr PAddr;
-                if (EvenOdd == 0) {
-                    PAddr = pte->PFN0;
-                } else {
-                    PAddr = pte->PFN1;
-                }
-                PAddr >>= (pte->AddrShiftAmount - 12);
-                PAddr <<= pte->AddrShiftAmount;
-                PAddr |= (vaddr & pte->OffsetMask);
-                req->setPaddr(PAddr);
-            }
-        } else {
-            // Didn't find any match, return a TLB Refill Exception
-            return new RefillFault(Asid, vaddr, VPN, true);
-        }
-    }
-    return checkCacheability(req);
-#endif
 }
 
 Fault
diff -r b0773af78423 -r e575781f71b8 src/arch/sparc/faults.cc
--- a/src/arch/sparc/faults.cc  Sun Oct 30 00:32:54 2011 -0700
+++ b/src/arch/sparc/faults.cc  Sun Oct 30 00:33:02 2011 -0700
@@ -41,9 +41,9 @@
 #include "cpu/thread_context.hh"
 #if !FULL_SYSTEM
 #include "arch/sparc/process.hh"
+#endif
 #include "mem/page_table.hh"
 #include "sim/process.hh"
-#endif
 #include "sim/full_system.hh"
 
 using namespace std;
@@ -624,43 +624,43 @@
 void
 FastInstructionAccessMMUMiss::invoke(ThreadContext *tc, StaticInstPtr inst)
 {
-#if !FULL_SYSTEM
-    Process *p = tc->getProcessPtr();
-    TlbEntry entry;
-    bool success = p->pTable->lookup(vaddr, entry);
-    if (!success) {
-        panic("Tried to execute unmapped address %#x.\n", vaddr);
+    if (FullSystem) {
+        SparcFaultBase::invoke(tc, inst);
     } else {
-        Addr alignedVaddr = p->pTable->pageAlign(vaddr);
-        tc->getITBPtr()->insert(alignedVaddr, 0 /*partition id*/,
-                p->M5_pid /*context id*/, false, entry.pte);
+        Process *p = tc->getProcessPtr();
+        TlbEntry entry;
+        bool success = p->pTable->lookup(vaddr, entry);
+        if (!success) {
+            panic("Tried to execute unmapped address %#x.\n", vaddr);
+        } else {
+            Addr alignedVaddr = p->pTable->pageAlign(vaddr);
+            tc->getITBPtr()->insert(alignedVaddr, 0 /*partition id*/,
+                    p->M5_pid /*context id*/, false, entry.pte);
+        }
     }
-#else
-    SparcFaultBase::invoke(tc, inst);
-#endif
 }
 
 void
 FastDataAccessMMUMiss::invoke(ThreadContext *tc, StaticInstPtr inst)
 {
-#if !FULL_SYSTEM
-    Process *p = tc->getProcessPtr();
-    TlbEntry entry;
-    bool success = p->pTable->lookup(vaddr, entry);
-    if (!success) {
-        if (p->fixupStackFault(vaddr))
-            success = p->pTable->lookup(vaddr, entry);
+    if (FullSystem) {
+        SparcFaultBase::invoke(tc, inst);
+    } else {
+        Process *p = tc->getProcessPtr();
+        TlbEntry entry;
+        bool success = p->pTable->lookup(vaddr, entry);
+        if (!success) {
+            if (p->fixupStackFault(vaddr))
+                success = p->pTable->lookup(vaddr, entry);
+        }
+        if (!success) {
+            panic("Tried to access unmapped address %#x.\n", vaddr);
+        } else {
+            Addr alignedVaddr = p->pTable->pageAlign(vaddr);
+            tc->getDTBPtr()->insert(alignedVaddr, 0 /*partition id*/,
+                    p->M5_pid /*context id*/, false, entry.pte);
+        }
     }
-    if (!success) {
-        panic("Tried to access unmapped address %#x.\n", vaddr);
-    } else {
-        Addr alignedVaddr = p->pTable->pageAlign(vaddr);
-        tc->getDTBPtr()->insert(alignedVaddr, 0 /*partition id*/,
-                p->M5_pid /*context id*/, false, entry.pte);
-    }
-#else
-    SparcFaultBase::invoke(tc, inst);
-#endif
 }
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to