summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2019-10-18 17:49:45 -0700
committerGabe Black <gabeblack@google.com>2019-12-17 23:17:28 +0000
commit1b48cfd7617e3cd54086121d36ad8364a29f1d90 (patch)
tree14a28100cc52dcc58bee74811d8c1f2effa66ef1
parent973842282f74fe801f406e6c8fc2ef03d0aecdba (diff)
downloadgem5-1b48cfd7617e3cd54086121d36ad8364a29f1d90.tar.xz
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>
-rw-r--r--src/arch/arm/fastmodel/iris/cpu.cc8
-rw-r--r--src/arch/arm/fastmodel/iris/cpu.hh2
-rw-r--r--src/arch/arm/fastmodel/iris/thread_context.cc18
-rw-r--r--src/arch/arm/fastmodel/iris/thread_context.hh25
4 files changed, 38 insertions, 15 deletions
diff --git a/src/arch/arm/fastmodel/iris/cpu.cc b/src/arch/arm/fastmodel/iris/cpu.cc
index 8284d1717..d66cf1dbc 100644
--- a/src/arch/arm/fastmodel/iris/cpu.cc
+++ b/src/arch/arm/fastmodel/iris/cpu.cc
@@ -78,4 +78,12 @@ BaseCPU::totalInsts() const
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 ef839784c..0d15fc82a 100644
--- a/src/arch/arm/fastmodel/iris/cpu.hh
+++ b/src/arch/arm/fastmodel/iris/cpu.hh
@@ -116,6 +116,8 @@ class BaseCPU : public ::BaseCPU
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 89748957c..00c41ba9c 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 @@ ThreadContext::getCurrentInstCount()
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 49b3325e7..8d2070a02 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 @@ class ThreadContext : public ::ThreadContext
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 @@ class ThreadContext : public ::ThreadContext
{
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
{