arch,base,cpu,dev,kern,mem,sim: Drop FS from FSTranslatingPortProxy.
authorGabe Black <gabeblack@google.com>
Tue, 10 Mar 2020 00:11:22 +0000 (17:11 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 19 Mar 2020 07:21:13 +0000 (07:21 +0000)
This translating proxy can be used in FS, or in SE with a failure
handing case in place.

Change-Id: I2e6421f52529fa833e42f8d3e64d4341c282634f
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/26551
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Matthew Poremba <matthew.poremba@amd.com>
Maintainer: Gabe Black <gabeblack@google.com>

26 files changed:
src/arch/arm/fastmodel/iris/thread_context.cc
src/arch/arm/freebsd/fs_workload.cc
src/arch/arm/linux/fs_workload.cc
src/arch/arm/stacktrace.cc
src/arch/arm/system.cc
src/arch/arm/tracers/tarmac_parser.cc
src/arch/arm/utility.cc
src/arch/mips/stacktrace.cc
src/arch/mips/utility.cc
src/arch/sparc/utility.cc
src/arch/x86/stacktrace.cc
src/base/remote_gdb.cc
src/cpu/simple_thread.cc
src/cpu/thread_state.cc
src/cpu/thread_state.hh
src/dev/arm/gic_v3_redistributor.cc
src/kern/linux/helpers.cc
src/mem/SConscript
src/mem/fs_translating_port_proxy.cc [deleted file]
src/mem/fs_translating_port_proxy.hh [deleted file]
src/mem/se_translating_port_proxy.cc
src/mem/se_translating_port_proxy.hh
src/mem/translating_port_proxy.cc [new file with mode: 0644]
src/mem/translating_port_proxy.hh [new file with mode: 0644]
src/sim/arguments.hh
src/sim/vptr.hh

index 516565eb5052a532d6df6564e650b4d062417ac1..9aed27b7c99cc2a85ea8ffcecced4c8605950d1f 100644 (file)
@@ -32,8 +32,8 @@
 #include "arch/arm/utility.hh"
 #include "iris/detail/IrisCppAdapter.h"
 #include "iris/detail/IrisObjects.h"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/se_translating_port_proxy.hh"
+#include "mem/translating_port_proxy.hh"
 
 namespace Iris
 {
@@ -407,7 +407,7 @@ ThreadContext::initMemProxies(::ThreadContext *tc)
         assert(!physProxy && !virtProxy);
         physProxy.reset(new PortProxy(_cpu->getSendFunctional(),
                                       _cpu->cacheLineSize()));
-        virtProxy.reset(new FSTranslatingPortProxy(tc));
+        virtProxy.reset(new TranslatingPortProxy(tc));
     } else {
         assert(!virtProxy);
         virtProxy.reset(new SETranslatingPortProxy(this,
index 33e012642a3ee4e0e565cb0c469c2bc03d79f37d..dbadb4b2a8fb9cb63069411636eca120f12f70d8 100644 (file)
@@ -43,7 +43,6 @@
 #include "cpu/thread_context.hh"
 #include "debug/Loader.hh"
 #include "kern/freebsd/events.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/physical.hh"
 #include "sim/stat_control.hh"
 
index 9390a464d972c2ea306c1bdf6eccecc13b70a57a..c21ce09f7b636233d056c76b285f8b327e283ba7 100644 (file)
@@ -55,7 +55,6 @@
 #include "kern/linux/events.hh"
 #include "kern/linux/helpers.hh"
 #include "kern/system_events.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/physical.hh"
 #include "sim/stat_control.hh"
 
index 4604524277d1ac4df507cfe0baab2e8d2cbf8ab2..b5a9976cf8c32a4b7fdb68561a9274acddc0fc23 100644 (file)
@@ -35,7 +35,7 @@
 #include "base/trace.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 #include "sim/system.hh"
 
 namespace ArmISA
index 9053a5c7d06fae8814ce656126ea92ffb93be214..97c3c5f3cc24615e4edd9be4b5cfcb6f1ce5879b 100644 (file)
@@ -49,7 +49,6 @@
 #include "cpu/thread_context.hh"
 #include "dev/arm/fvp_base_pwr_ctrl.hh"
 #include "dev/arm/gic_v2.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/physical.hh"
 
 using namespace std;
index a5fc32dbbfbfd54a7d2b802207c8cd10bb33347a..96678b07b416579e1442e1489f5acb903e5fb763 100644 (file)
@@ -48,8 +48,8 @@
 #include "config/the_isa.hh"
 #include "cpu/static_inst.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/packet.hh"
+#include "mem/port_proxy.hh"
 #include "sim/core.hh"
 #include "sim/faults.hh"
 #include "sim/sim_exit.hh"
index 393f141b035faea61d26c2bf4f859e072b782284..7c70def08d43c3c1e7914c4c53f6760d979e6e52 100644 (file)
@@ -46,7 +46,7 @@
 #include "cpu/base.hh"
 #include "cpu/checker/cpu.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 #include "sim/full_system.hh"
 
 namespace ArmISA
index 651719a02b8f3779b39b59166c9583bbb054b839..ec5597c5597aa0ebf37e00efd414f710215d6a64 100644 (file)
@@ -35,7 +35,7 @@
 #include "base/trace.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 #include "sim/system.hh"
 
 using namespace MipsISA;
index b42635fc44d56318b2b14d503743df6665a49e11..7e797b57fda66720ca90b6931739fa48e4b25254 100644 (file)
@@ -36,7 +36,6 @@
 #include "base/logging.hh"
 #include "cpu/static_inst.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "sim/serialize.hh"
 
 using namespace MipsISA;
index ac442cad5e1ec5e5edef5b3b054eb1db1866bc79..21fbf939d55441c8615886abaa49de9329a45a1d 100644 (file)
@@ -29,7 +29,7 @@
 #include "arch/sparc/utility.hh"
 
 #include "arch/sparc/faults.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 
 namespace SparcISA {
 
index 3fe9ce4f1dfb405215b43690af6d690128237f8d..64f2d4b1dede4c334f1662b834e82e7c9ee9c9b3 100644 (file)
@@ -35,7 +35,7 @@
 #include "base/trace.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 #include "sim/system.hh"
 
 namespace X86ISA
index ada5e27d612e71816b8c960bee02da0e02b1f2c3..0660827e904da806920b5720c7187ad67d3f3a01 100644 (file)
 #include "cpu/static_inst.hh"
 #include "cpu/thread_context.hh"
 #include "debug/GDBAll.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/port.hh"
-#include "mem/se_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 #include "sim/full_system.hh"
 #include "sim/system.hh"
 
index 30806a7c761601e9190f448234a297f6df6c95e7..7574c4d7e6d43353894e71d7e4b94758fa761831 100644 (file)
@@ -55,8 +55,8 @@
 #include "cpu/profile.hh"
 #include "cpu/quiesce_event.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/se_translating_port_proxy.hh"
+#include "mem/translating_port_proxy.hh"
 #include "params/BaseCPU.hh"
 #include "sim/faults.hh"
 #include "sim/full_system.hh"
index 2210a7628a0d6d16dbdd67d76a4a42d59f1cf9bd..07176b72ec4f47f81b432fd7bf0e746d848c045f 100644 (file)
 #include "cpu/profile.hh"
 #include "cpu/quiesce_event.hh"
 #include "kern/kernel_stats.hh"
-#include "mem/fs_translating_port_proxy.hh"
 #include "mem/port.hh"
 #include "mem/port_proxy.hh"
 #include "mem/se_translating_port_proxy.hh"
+#include "mem/translating_port_proxy.hh"
 #include "sim/full_system.hh"
 #include "sim/serialize.hh"
 #include "sim/system.hh"
@@ -112,7 +112,7 @@ ThreadState::initMemProxies(ThreadContext *tc)
                                   baseCpu->cacheLineSize());
 
         assert(virtProxy == NULL);
-        virtProxy = new FSTranslatingPortProxy(tc);
+        virtProxy = new TranslatingPortProxy(tc);
     } else {
         assert(virtProxy == NULL);
         virtProxy = new SETranslatingPortProxy(
index df80cdc4a1e727ae1e096967eda1d24a6f4109e1..dd93c68f495eb1265ded306f641056a56dce45c0 100644 (file)
@@ -45,9 +45,6 @@ namespace Kernel {
 
 class Checkpoint;
 
-class FSTranslatingPortProxy;
-class SETranslatingPortProxy;
-
 /**
  *  Struct for holding general thread state that is needed across CPU
  *  models.  This includes things such as pointers to the process,
index 629f162e84dbcc0c5ba5250108660c4bbd3600e2..a9b3f93a538bb6a2121ce68d2a700b814b1ad421 100644 (file)
@@ -44,7 +44,6 @@
 #include "debug/GIC.hh"
 #include "dev/arm/gic_v3_cpu_interface.hh"
 #include "dev/arm/gic_v3_distributor.hh"
-#include "mem/fs_translating_port_proxy.hh"
 
 const AddrRange Gicv3Redistributor::GICR_IPRIORITYR(SGI_base + 0x0400,
                                                     SGI_base + 0x0420);
index a7c21837e8a7d86af822fb96b6522a70eaf62cdf..5598440044c70bc7605d52bf6c79ae5e636c971e 100644 (file)
@@ -40,7 +40,7 @@
 #include "arch/isa_traits.hh"
 #include "config/the_isa.hh"
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 #include "sim/byteswap.hh"
 #include "sim/system.hh"
 
index d4eb4615b3a1b8fe6de588cd04e29540a97d7277..f7636b235e87d74faab51beaf3239f34cbfeb999 100644 (file)
@@ -81,7 +81,7 @@ Source('serial_link.cc')
 Source('mem_delay.cc')
 
 if env['TARGET_ISA'] != 'null':
-    Source('fs_translating_port_proxy.cc')
+    Source('translating_port_proxy.cc')
     Source('se_translating_port_proxy.cc')
     Source('page_table.cc')
 
diff --git a/src/mem/fs_translating_port_proxy.cc b/src/mem/fs_translating_port_proxy.cc
deleted file mode 100644 (file)
index 99a4b8e..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2011,2013 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2006 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file
- * Port object definitions.
- */
-
-#include "mem/fs_translating_port_proxy.hh"
-
-#include "base/chunk_generator.hh"
-#include "cpu/base.hh"
-#include "cpu/thread_context.hh"
-#include "sim/system.hh"
-
-FSTranslatingPortProxy::FSTranslatingPortProxy(ThreadContext *tc) :
-    PortProxy(tc->getCpuPtr()->getSendFunctional(),
-              tc->getSystemPtr()->cacheLineSize()), _tc(tc),
-              pageBytes(tc->getSystemPtr()->getPageBytes())
-{}
-
-bool
-FSTranslatingPortProxy::tryTLBsOnce(RequestPtr req, BaseTLB::Mode mode) const
-{
-    BaseTLB *dtb = _tc->getDTBPtr();
-    BaseTLB *itb = _tc->getDTBPtr();
-    return dtb->translateFunctional(req, _tc, mode) == NoFault ||
-           itb->translateFunctional(req, _tc, BaseTLB::Read) == NoFault;
-}
-
-bool
-FSTranslatingPortProxy::tryTLBs(RequestPtr req, BaseTLB::Mode mode) const
-{
-    // If at first this doesn't succeed, try to fixup and translate again. If
-    // it still fails, report failure.
-    return tryTLBsOnce(req, mode) ||
-        (fixupAddr(req->getVaddr(), mode) && tryTLBsOnce(req, mode));
-}
-
-bool
-FSTranslatingPortProxy::tryReadBlob(Addr addr, void *p, int size) const
-{
-    for (ChunkGenerator gen(addr, size, pageBytes); !gen.done();
-         gen.next())
-    {
-        auto req = std::make_shared<Request>(
-                gen.addr(), gen.size(), 0, Request::funcMasterId, 0,
-                _tc->contextId());
-
-        if (!tryTLBs(req, BaseTLB::Read))
-            return false;
-
-        PortProxy::readBlobPhys(
-                req->getPaddr(), req->getFlags(), p, gen.size());
-
-        p = static_cast<uint8_t *>(p) + gen.size();
-    }
-    return true;
-}
-
-bool
-FSTranslatingPortProxy::tryWriteBlob(
-        Addr addr, const void *p, int size) const
-{
-    for (ChunkGenerator gen(addr, size, pageBytes); !gen.done();
-         gen.next())
-    {
-        auto req = std::make_shared<Request>(
-                gen.addr(), gen.size(), 0, Request::funcMasterId, 0,
-                _tc->contextId());
-
-        if (!tryTLBs(req, BaseTLB::Write))
-            return false;
-
-        PortProxy::writeBlobPhys(
-                req->getPaddr(), req->getFlags(), p, gen.size());
-        p = static_cast<const uint8_t *>(p) + gen.size();
-    }
-    return true;
-}
-
-bool
-FSTranslatingPortProxy::tryMemsetBlob(Addr address, uint8_t v, int size) const
-{
-    for (ChunkGenerator gen(address, size, pageBytes); !gen.done();
-         gen.next())
-    {
-        auto req = std::make_shared<Request>(
-                gen.addr(), gen.size(), 0, Request::funcMasterId, 0,
-                _tc->contextId());
-
-        if (!tryTLBs(req, BaseTLB::Write))
-            return false;
-
-        PortProxy::memsetBlobPhys(
-                req->getPaddr(), req->getFlags(), v, gen.size());
-    }
-    return true;
-}
diff --git a/src/mem/fs_translating_port_proxy.hh b/src/mem/fs_translating_port_proxy.hh
deleted file mode 100644 (file)
index c3f1bc6..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2011 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2006 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file
- * TranslatingPortProxy Object Declaration for FS.
- *
- * Port proxies are used when non structural entities need access to
- * the memory system. Proxy objects replace the previous
- * FunctionalPort, TranslatingPort and VirtualPort objects, which
- * provided the same functionality as the proxies, but were instances
- * of ports not corresponding to real structural ports of the
- * simulated system. Via the port proxies all the accesses go through
- * an actual port and thus are transparent to a potentially
- * distributed memory and automatically adhere to the memory map of
- * the system.
- */
-
-#ifndef __MEM_FS_TRANSLATING_PORT_PROXY_HH__
-#define __MEM_FS_TRANSLATING_PORT_PROXY_HH__
-
-#include "arch/generic/tlb.hh"
-#include "mem/port_proxy.hh"
-
-class ThreadContext;
-
-/**
- * This proxy attempts to translate virtual addresses using the TLBs. If it
- * fails, subclasses can override the fixupAddr virtual method to try to
- * recover, and then attempt the translation again. If it still fails then the
- * access as a whole fails.
- */
-class FSTranslatingPortProxy : public PortProxy
-{
-  private:
-    bool tryTLBsOnce(RequestPtr req, BaseTLB::Mode) const;
-    bool tryTLBs(RequestPtr req, BaseTLB::Mode) const;
-
-  protected:
-    ThreadContext* _tc;
-    const Addr pageBytes;
-
-    virtual bool
-    fixupAddr(Addr addr, BaseTLB::Mode mode) const
-    {
-        return false;
-    }
-
-  public:
-
-    FSTranslatingPortProxy(ThreadContext* tc);
-    ~FSTranslatingPortProxy() {}
-
-    /** Version of tryReadblob that translates virt->phys and deals
-      * with page boundries. */
-    bool tryReadBlob(Addr addr, void *p, int size) const override;
-
-    /** Version of tryWriteBlob that translates virt->phys and deals
-      * with page boundries. */
-    bool tryWriteBlob(Addr addr, const void *p, int size) const override;
-
-    /**
-     * Fill size bytes starting at addr with byte value val.
-     */
-    bool tryMemsetBlob(Addr address, uint8_t  v, int size) const override;
-};
-
-#endif //__MEM_FS_TRANSLATING_PORT_PROXY_HH__
index 8bab243cb84203171c4711c135d5edb5c1355fab..458b2fad51c6bd53fd2b2104e6d872d71820aa89 100644 (file)
@@ -44,8 +44,8 @@
 #include "sim/system.hh"
 
 SETranslatingPortProxy::SETranslatingPortProxy(
-        ThreadContext *tc, AllocType alloc)
-    : FSTranslatingPortProxy(tc), allocating(alloc)
+        ThreadContext *tc, AllocType alloc) :
+    TranslatingPortProxy(tc), allocating(alloc)
 {}
 
 bool
index 96e17714cbda9dc016e0d4ebda8871b7297eced3..1b6be8a25067f6148cf547d07c4e719365fe5475 100644 (file)
@@ -41,9 +41,9 @@
 #ifndef __MEM_SE_TRANSLATING_PORT_PROXY_HH__
 #define __MEM_SE_TRANSLATING_PORT_PROXY_HH__
 
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/translating_port_proxy.hh"
 
-class SETranslatingPortProxy : public FSTranslatingPortProxy
+class SETranslatingPortProxy : public TranslatingPortProxy
 {
 
   public:
diff --git a/src/mem/translating_port_proxy.cc b/src/mem/translating_port_proxy.cc
new file mode 100644 (file)
index 0000000..c44ff5f
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2011,2013 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2006 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * Port object definitions.
+ */
+
+#include "mem/translating_port_proxy.hh"
+
+#include "base/chunk_generator.hh"
+#include "cpu/base.hh"
+#include "cpu/thread_context.hh"
+#include "sim/system.hh"
+
+TranslatingPortProxy::TranslatingPortProxy(ThreadContext *tc) :
+    PortProxy(tc->getCpuPtr()->getSendFunctional(),
+              tc->getSystemPtr()->cacheLineSize()), _tc(tc),
+              pageBytes(tc->getSystemPtr()->getPageBytes())
+{}
+
+bool
+TranslatingPortProxy::tryTLBsOnce(RequestPtr req, BaseTLB::Mode mode) const
+{
+    BaseTLB *dtb = _tc->getDTBPtr();
+    BaseTLB *itb = _tc->getDTBPtr();
+    return dtb->translateFunctional(req, _tc, mode) == NoFault ||
+           itb->translateFunctional(req, _tc, BaseTLB::Read) == NoFault;
+}
+
+bool
+TranslatingPortProxy::tryTLBs(RequestPtr req, BaseTLB::Mode mode) const
+{
+    // If at first this doesn't succeed, try to fixup and translate again. If
+    // it still fails, report failure.
+    return tryTLBsOnce(req, mode) ||
+        (fixupAddr(req->getVaddr(), mode) && tryTLBsOnce(req, mode));
+}
+
+bool
+TranslatingPortProxy::tryReadBlob(Addr addr, void *p, int size) const
+{
+    for (ChunkGenerator gen(addr, size, pageBytes); !gen.done();
+         gen.next())
+    {
+        auto req = std::make_shared<Request>(
+                gen.addr(), gen.size(), 0, Request::funcMasterId, 0,
+                _tc->contextId());
+
+        if (!tryTLBs(req, BaseTLB::Read))
+            return false;
+
+        PortProxy::readBlobPhys(
+                req->getPaddr(), req->getFlags(), p, gen.size());
+
+        p = static_cast<uint8_t *>(p) + gen.size();
+    }
+    return true;
+}
+
+bool
+TranslatingPortProxy::tryWriteBlob(
+        Addr addr, const void *p, int size) const
+{
+    for (ChunkGenerator gen(addr, size, pageBytes); !gen.done();
+         gen.next())
+    {
+        auto req = std::make_shared<Request>(
+                gen.addr(), gen.size(), 0, Request::funcMasterId, 0,
+                _tc->contextId());
+
+        if (!tryTLBs(req, BaseTLB::Write))
+            return false;
+
+        PortProxy::writeBlobPhys(
+                req->getPaddr(), req->getFlags(), p, gen.size());
+        p = static_cast<const uint8_t *>(p) + gen.size();
+    }
+    return true;
+}
+
+bool
+TranslatingPortProxy::tryMemsetBlob(Addr address, uint8_t v, int size) const
+{
+    for (ChunkGenerator gen(address, size, pageBytes); !gen.done();
+         gen.next())
+    {
+        auto req = std::make_shared<Request>(
+                gen.addr(), gen.size(), 0, Request::funcMasterId, 0,
+                _tc->contextId());
+
+        if (!tryTLBs(req, BaseTLB::Write))
+            return false;
+
+        PortProxy::memsetBlobPhys(
+                req->getPaddr(), req->getFlags(), v, gen.size());
+    }
+    return true;
+}
diff --git a/src/mem/translating_port_proxy.hh b/src/mem/translating_port_proxy.hh
new file mode 100644 (file)
index 0000000..1e17c64
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2011 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2006 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MEM_TRANSLATING_PORT_PROXY_HH__
+#define __MEM_TRANSLATING_PORT_PROXY_HH__
+
+#include "arch/generic/tlb.hh"
+#include "mem/port_proxy.hh"
+
+class ThreadContext;
+
+/**
+ * This proxy attempts to translate virtual addresses using the TLBs. If it
+ * fails, subclasses can override the fixupAddr virtual method to try to
+ * recover, and then attempt the translation again. If it still fails then the
+ * access as a whole fails.
+ */
+class TranslatingPortProxy : public PortProxy
+{
+  private:
+    bool tryTLBsOnce(RequestPtr req, BaseTLB::Mode) const;
+    bool tryTLBs(RequestPtr req, BaseTLB::Mode) const;
+
+  protected:
+    ThreadContext* _tc;
+    const Addr pageBytes;
+
+    virtual bool
+    fixupAddr(Addr addr, BaseTLB::Mode mode) const
+    {
+        return false;
+    }
+
+  public:
+
+    TranslatingPortProxy(ThreadContext* tc);
+
+    /** Version of tryReadblob that translates virt->phys and deals
+      * with page boundries. */
+    bool tryReadBlob(Addr addr, void *p, int size) const override;
+
+    /** Version of tryWriteBlob that translates virt->phys and deals
+      * with page boundries. */
+    bool tryWriteBlob(Addr addr, const void *p, int size) const override;
+
+    /**
+     * Fill size bytes starting at addr with byte value val.
+     */
+    bool tryMemsetBlob(Addr address, uint8_t  v, int size) const override;
+};
+
+#endif //__MEM_TRANSLATING_PORT_PROXY_HH__
index da7a8edcee995d9ee9cf6e961e1b43d78d93e6bd..2861e4dd6688255c926cf3fca34aefe2b3256f86 100644 (file)
@@ -33,7 +33,7 @@
 #include <memory>
 
 #include "cpu/thread_context.hh"
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 
 class Arguments
 {
index d1ec32af6e4b95921bf31bc022e91f2e84246296..92aea797c07501691d594a408932595f1486df42 100644 (file)
@@ -29,7 +29,7 @@
 #ifndef __SIM_VPTR_HH__
 #define __SIM_VPTR_HH__
 
-#include "mem/fs_translating_port_proxy.hh"
+#include "mem/port_proxy.hh"
 
 class ThreadContext;