fastmodel: Implement port proxies.

This plumbing is simple and largely copied from other implementations
within gem5. This mechanism should be refactored so that the
duplication is unnecessary.

Change-Id: Ibcdf759b7fba1d574e8e2ba04249afdd92c6560c
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22120
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Chun-Chen TK Hsu <chunchenhsu@google.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
diff --git a/src/arch/arm/fastmodel/iris/cpu.cc b/src/arch/arm/fastmodel/iris/cpu.cc
index 8284d17..d66cf1d 100644
--- a/src/arch/arm/fastmodel/iris/cpu.cc
+++ b/src/arch/arm/fastmodel/iris/cpu.cc
@@ -78,4 +78,12 @@
     return count;
 }
 
+void
+BaseCPU::init()
+{
+    ::BaseCPU::init();
+    for (auto *tc: threadContexts)
+        tc->initMemProxies(tc);
+}
+
 } // namespace Iris
diff --git a/src/arch/arm/fastmodel/iris/cpu.hh b/src/arch/arm/fastmodel/iris/cpu.hh
index ef83978..0d15fc8 100644
--- a/src/arch/arm/fastmodel/iris/cpu.hh
+++ b/src/arch/arm/fastmodel/iris/cpu.hh
@@ -116,6 +116,8 @@
         periodAttribute->value = clockPeriod();
         clockEvent->notify();
     }
+
+    void init() override;
 };
 
 // This class specializes the one above and sets up ThreadContexts based on
diff --git a/src/arch/arm/fastmodel/iris/thread_context.cc b/src/arch/arm/fastmodel/iris/thread_context.cc
index 8974895..00c41ba 100644
--- a/src/arch/arm/fastmodel/iris/thread_context.cc
+++ b/src/arch/arm/fastmodel/iris/thread_context.cc
@@ -31,6 +31,8 @@
 
 #include "iris/detail/IrisCppAdapter.h"
 #include "iris/detail/IrisObjects.h"
+#include "mem/fs_translating_port_proxy.hh"
+#include "mem/se_translating_port_proxy.hh"
 
 namespace Iris
 {
@@ -291,6 +293,22 @@
     return count;
 }
 
+void
+ThreadContext::initMemProxies(::ThreadContext *tc)
+{
+    if (FullSystem) {
+        assert(!physProxy && !virtProxy);
+        physProxy.reset(new PortProxy(_cpu->getSendFunctional(),
+                                      _cpu->cacheLineSize()));
+        virtProxy.reset(new FSTranslatingPortProxy(tc));
+    } else {
+        assert(!virtProxy);
+        virtProxy.reset(new SETranslatingPortProxy(
+                        _cpu->getSendFunctional(), getProcessPtr(),
+                        SETranslatingPortProxy::NextPage));
+    }
+}
+
 ThreadContext::Status
 ThreadContext::status() const
 {
diff --git a/src/arch/arm/fastmodel/iris/thread_context.hh b/src/arch/arm/fastmodel/iris/thread_context.hh
index 49b3325..8d2070a 100644
--- a/src/arch/arm/fastmodel/iris/thread_context.hh
+++ b/src/arch/arm/fastmodel/iris/thread_context.hh
@@ -30,6 +30,8 @@
 #ifndef __ARCH_ARM_FASTMODEL_IRIS_THREAD_CONTEXT_HH__
 #define __ARCH_ARM_FASTMODEL_IRIS_THREAD_CONTEXT_HH__
 
+#include <memory>
+
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
 #include "iris/IrisInstance.h"
@@ -77,6 +79,9 @@
     std::vector<iris::MemorySpaceInfo> memorySpaces;
     std::vector<iris::MemorySupportedAddressTranslationResult> translations;
 
+    std::unique_ptr<PortProxy> virtProxy = nullptr;
+    std::unique_ptr<PortProxy> physProxy = nullptr;
+
 
     // A queue to keep track of instruction count based events.
     EventQueue comInstEventQueue;
@@ -161,21 +166,11 @@
     {
         panic("%s not implemented.", __FUNCTION__);
     }
-    PortProxy &
-    getPhysProxy() override
-    {
-        panic("%s not implemented.", __FUNCTION__);
-    }
-    PortProxy &
-    getVirtProxy() override
-    {
-        panic("%s not implemented.", __FUNCTION__);
-    }
-    void
-    initMemProxies(::ThreadContext *tc) override
-    {
-        panic("%s not implemented.", __FUNCTION__);
-    }
+
+    PortProxy &getPhysProxy() override { return *physProxy; }
+    PortProxy &getVirtProxy() override { return *virtProxy; }
+    void initMemProxies(::ThreadContext *tc) override;
+
     Process *
     getProcessPtr() override
     {