changeset a9f9eed35b18 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=a9f9eed35b18
description:
        ARM: Support switchover with hardware table walkers

diffstat:

 src/arch/arm/table_walker.cc |   3 +--
 src/arch/arm/tlb.cc          |  12 ++++++++++++
 src/arch/arm/tlb.hh          |   3 +++
 src/cpu/base.cc              |  21 +++++++++++++++++++++
 src/sim/tlb.hh               |   6 ++++++
 5 files changed, 43 insertions(+), 2 deletions(-)

diffs (109 lines):

diff -r 42da07116e12 -r a9f9eed35b18 src/arch/arm/table_walker.cc
--- a/src/arch/arm/table_walker.cc      Wed Dec 01 11:30:04 2010 -0800
+++ b/src/arch/arm/table_walker.cc      Tue Dec 07 16:19:57 2010 -0800
@@ -92,8 +92,7 @@
 {
     if (if_name == "port") {
         if (port != NULL)
-            fatal("%s: port already connected to %s",
-                  name(), port->getPeer()->name());
+            return port;
         System *sys = params()->sys;
         Tick minb = params()->min_backoff;
         Tick maxb = params()->max_backoff;
diff -r 42da07116e12 -r a9f9eed35b18 src/arch/arm/tlb.cc
--- a/src/arch/arm/tlb.cc       Wed Dec 01 11:30:04 2010 -0800
+++ b/src/arch/arm/tlb.cc       Tue Dec 07 16:19:57 2010 -0800
@@ -693,6 +693,18 @@
     return fault;
 }
 
+Port*
+TLB::getPort()
+{
+#if FULL_SYSTEM
+    return tableWalker->getPort("port");
+#else
+    return NULL;
+#endif
+}
+
+
+
 ArmISA::TLB *
 ArmTLBParams::create()
 {
diff -r 42da07116e12 -r a9f9eed35b18 src/arch/arm/tlb.hh
--- a/src/arch/arm/tlb.hh       Wed Dec 01 11:30:04 2010 -0800
+++ b/src/arch/arm/tlb.hh       Tue Dec 07 16:19:57 2010 -0800
@@ -209,6 +209,9 @@
 
     void regStats();
 
+    // Get the port from the table walker and return it
+    virtual Port *getPort();
+
     // Caching misc register values here.
     // Writing to misc registers needs to invalidate them.
     // translateFunctional/translateSe/translateFs checks if they are
diff -r 42da07116e12 -r a9f9eed35b18 src/cpu/base.cc
--- a/src/cpu/base.cc   Wed Dec 01 11:30:04 2010 -0800
+++ b/src/cpu/base.cc   Tue Dec 07 16:19:57 2010 -0800
@@ -33,6 +33,7 @@
 #include <string>
 #include <sstream>
 
+#include "arch/tlb.hh"
 #include "base/cprintf.hh"
 #include "base/loader/symtab.hh"
 #include "base/misc.hh"
@@ -359,6 +360,26 @@
            if (DTRACE(Context))
             ThreadContext::compare(oldTC, newTC);
         */
+
+        Port  *old_itb_port, *old_dtb_port, *new_itb_port, *new_dtb_port;
+        old_itb_port = oldTC->getITBPtr()->getPort();
+        old_dtb_port = oldTC->getDTBPtr()->getPort();
+        new_itb_port = newTC->getITBPtr()->getPort();
+        new_dtb_port = newTC->getDTBPtr()->getPort();
+
+        // Move over any table walker ports if they exist
+        if (new_itb_port && !new_itb_port->isConnected()) {
+            assert(old_itb_port);
+            Port *peer = old_itb_port->getPeer();;
+            new_itb_port->setPeer(peer);
+            peer->setPeer(new_itb_port);
+        }
+        if (new_dtb_port && !new_dtb_port->isConnected()) {
+            assert(old_dtb_port);
+            Port *peer = old_dtb_port->getPeer();;
+            new_dtb_port->setPeer(peer);
+            peer->setPeer(new_dtb_port);
+        }
     }
 
 #if FULL_SYSTEM
diff -r 42da07116e12 -r a9f9eed35b18 src/sim/tlb.hh
--- a/src/sim/tlb.hh    Wed Dec 01 11:30:04 2010 -0800
+++ b/src/sim/tlb.hh    Tue Dec 07 16:19:57 2010 -0800
@@ -38,6 +38,7 @@
 
 class ThreadContext;
 class Packet;
+class Port;
 
 class BaseTLB : public SimObject
 {
@@ -52,6 +53,11 @@
   public:
     virtual void demapPage(Addr vaddr, uint64_t asn) = 0;
 
+    /** Get any port that the TLB or hardware table walker needs.
+     * This is used for migrating port connections during a takeOverFrom()
+     * call. */
+    virtual Port*  getPort() { return NULL; }
+
     class Translation
     {
       public:
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to