HL
Han-sheng Liu (Gerrit)
Thu, Jun 29, 2023 3:11 PM
Han-sheng Liu has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/69057?usp=email )
Change subject: mem: Support backdoor request in AddrMapper
......................................................................
mem: Support backdoor request in AddrMapper
M src/mem/SConscript
M src/mem/addr_mapper.cc
M src/mem/addr_mapper.hh
A src/mem/backdoor_manager.cc
A src/mem/backdoor_manager.hh
A src/mem/backdoor_manager.test.cc
6 files changed, 457 insertions(+), 1 deletion(-)
Approvals:
Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
Yu-hsin Wang: Looks good to me, but someone else must approve
kokoro: Regressions pass
diff --git a/src/mem/SConscript b/src/mem/SConscript
index 6e017e0..e2a9114 100644
--- a/src/mem/SConscript
+++ b/src/mem/SConscript
@@ -71,6 +71,7 @@
Source('abstract_mem.cc')
Source('addr_mapper.cc')
+Source('backdoor_manager.cc')
Source('bridge.cc')
Source('coherent_xbar.cc')
Source('cfi_mem.cc')
@@ -105,6 +106,8 @@
Source('mem_delay.cc')
Source('port_terminator.cc')
+GTest('backdoor_manager.test', 'backdoor_manager.test.cc',
-
'backdoor_manager.cc', with_tag('gem5_trace'))
GTest('translation_gen.test', 'translation_gen.test.cc')
Source('translating_port_proxy.cc')
diff --git a/src/mem/addr_mapper.cc b/src/mem/addr_mapper.cc
index 091b9d5..3c4054b 100644
--- a/src/mem/addr_mapper.cc
+++ b/src/mem/addr_mapper.cc
@@ -84,6 +84,19 @@
pkt->setAddr(orig_addr);
}
+void
+AddrMapper::recvMemBackdoorReq(const MemBackdoorReq &req,
+{
+Tick
+AddrMapper::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr& backdoor)
+{
- remappedRanges(p.remapped_ranges)
- remappedRanges(p.remapped_ranges),
- backdoorManager(originalRanges, remappedRanges)
{
if (originalRanges.size() != remappedRanges.size())
fatal("AddrMapper: original and shadowed range list must "
@@ -232,6 +259,13 @@
return addr;
}
+MemBackdoorPtr
+RangeAddrMapper::getRevertedBackdoor(MemBackdoorPtr &backdoor,
+{
- return backdoorManager.getRevertedBackdoor(backdoor, range);
+}
- AddrRangeList
RangeAddrMapper::getAddrRanges() const
{
diff --git a/src/mem/addr_mapper.hh b/src/mem/addr_mapper.hh
index 40a0bb0..41709f3 100644
--- a/src/mem/addr_mapper.hh
+++ b/src/mem/addr_mapper.hh
@@ -38,6 +38,10 @@
#ifndef MEM_ADDR_MAPPER_HH
#define MEM_ADDR_MAPPER_HH
+#include <vector>
+
+#include "mem/backdoor_manager.hh"
+#include "mem/packet.hh"
#include "mem/port.hh"
#include "params/AddrMapper.hh"
#include "params/RangeAddrMapper.hh"
@@ -77,6 +81,20 @@
*/
virtual Addr remapAddr(Addr addr) const = 0;
request,
-
* based on the target backdoor at the first parameter.
-
* Note that this function should return a backdoor in original address
-
* space, while the target backdoor is in remapped address space.
Address
-
* reverting logic is probably required in this function.
-
*
-
* @param backdoor the backdoor obtained from target
-
* @param range the initiator request to be fulfilled
-
* @return a backdoor that fulfill the initiator request
-
*/
- virtual MemBackdoorPtr getRevertedBackdoor(MemBackdoorPtr &backdoor,
-
const AddrRange &range) = 0;
-
class AddrMapperSenderState : public Packet::SenderState
{
@@ -168,12 +186,24 @@
mapper.recvFunctional(pkt);
}
-
void recvMemBackdoorReq(const MemBackdoorReq &req,
-
MemBackdoorPtr &backdoor) override
-
{
-
mapper.recvMemBackdoorReq(req, backdoor);
-
}
-
Tick
recvAtomic(PacketPtr pkt) override
{
return mapper.recvAtomic(pkt);
}
-
Tick
-
recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr& backdoor)
override
@@ -209,10 +239,15 @@
void recvFunctionalSnoop(PacketPtr pkt);
-
void recvMemBackdoorReq(const MemBackdoorReq &req,
-
MemBackdoorPtr &backdoor);
-
Tick recvAtomic(PacketPtr pkt);
Tick recvAtomicSnoop(PacketPtr pkt);
-
Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr& backdoor);
-
bool recvTimingReq(PacketPtr pkt);
bool recvTimingResp(PacketPtr pkt);
@@ -269,12 +304,19 @@
std::vector<AddrRange> remappedRanges;
Addr remapAddr(Addr addr) const override;
accesses
// in our output range(s).
}
+
- private:
- BackdoorManager backdoorManager;
};
} // namespace gem5
diff --git a/src/mem/backdoor_manager.cc b/src/mem/backdoor_manager.cc
new file mode 100644
index 0000000..32d267c
--- /dev/null
+++ b/src/mem/backdoor_manager.cc
@@ -0,0 +1,148 @@
+/*
-
- Copyright 2023 Google, Inc
-
-
-
- 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.
-
-
- 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.
- */
+#include <utility>
+
+#include "base/logging.hh"
+#include "mem/backdoor_manager.hh"
+
+namespace gem5
+{
+
+BackdoorManager::BackdoorManager(const std::vector<AddrRange>
&original_ranges,
&remapped_ranges)
+{
+}
+
+MemBackdoorPtr
+BackdoorManager::getRevertedBackdoor(MemBackdoorPtr backdoor,
+{
+MemBackdoorPtr
+BackdoorManager::createRevertedBackdoor(MemBackdoorPtr backdoor,
+{
- std::unique_ptr<MemBackdoor> reverted_backdoor =
std::make_unique<MemBackdoor>();
- reverted_backdoor->flags(backdoor->flags());
- reverted_backdoor->ptr(backdoor->ptr());
- Addr addr = pkt_range.start();
- for (int i = 0; i < originalRanges.size(); ++i) {
-
if (originalRanges[i].contains(addr)) {
-
/** Does not support interleaved range backdoors. */
-
if (originalRanges[i].interleaved() ||
-
remappedRanges[i].interleaved()) {
-
return nullptr;
-
}
-
/** Shrink the backdoor to fit inside address range. */
-
AddrRange shrinked_backdoor_range =
-
backdoor->range() & remappedRanges[i];
-
Addr backdoor_offset =
-
shrinked_backdoor_range.start() -
remappedRanges[i].start();
-
Addr backdoor_size = shrinked_backdoor_range.size();
-
/** Create the backdoor in original address view. */
-
reverted_backdoor->range(AddrRange(
-
originalRanges[i].start() + backdoor_offset,
-
originalRanges[i].start() + backdoor_offset +
backdoor_size));
+
the
backdoor->range().start();
-
reverted_backdoor->ptr(backdoor->ptr() + shrinked_offset);
-
/**
-
* Bind the life cycle of the created backdoor with the target
-
* backdoor. Invalid and delete the created backdoor when the
-
* target backdoor is invalidated.
-
*/
-
MemBackdoorPtr reverted_backdoor_raw_ptr =
reverted_backdoor.get();
std::move(reverted_backdoor));
-
backdoor->addInvalidationCallback(
-
[this, i, it](const MemBackdoor &backdoor) {
-
(*it)->invalidate(); // *it is unique_ptr
reverted_backdoor
+MemBackdoorPtr
+BackdoorManager::findBackdoor(const AddrRange &pkt_range) const
+{
- Addr addr = pkt_range.start();
- Addr size = pkt_range.size();
- for (int i = 0; i < originalRanges.size(); ++i) {
-
/** The original ranges should be disjoint, so at most one range
-
* contains the begin address.
-
*/
-
if (originalRanges[i].contains(addr)) {
-
if (!originalRanges[i].contains(addr + size - 1)) {
-
/** The request range doesn't fit in any address range. */
-
return nullptr;
-
}
-
for (const auto &backdoor : backdoorLists[i]) {
-
if (backdoor->range().contains(addr) &&
-
backdoor->range().contains(addr + size - 1)) {
-
return backdoor.get();
-
}
-
}
-
}
- }
- return nullptr;
+}
+} // namespace gem5
diff --git a/src/mem/backdoor_manager.hh b/src/mem/backdoor_manager.hh
new file mode 100644
index 0000000..676987c
--- /dev/null
+++ b/src/mem/backdoor_manager.hh
@@ -0,0 +1,89 @@
+/*
-
- Copyright 2023 Google, Inc
-
-
-
- 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.
-
-
- 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_BACKDOOR_MANAGER_HH
+#define MEM_BACKDOOR_MANAGER_HH
+
+#include <list>
+#include <memory>
+#include <vector>
+
+#include "mem/backdoor.hh"
+#include "mem/packet.hh"
+
+namespace gem5
+{
+
+/**
&remapped_ranges);
+
the
-
* original request address. The address range is in initiator address
-
* view, and shouldn't exceed the original address range.
-
*/
- MemBackdoorPtr createRevertedBackdoor(MemBackdoorPtr backdoor,
-
const AddrRange &pkt_range);
- /**
-
* This function returns a created backdoor that fulfills the request,
or
-
* returns nullptr if there's no.
-
*/
- MemBackdoorPtr findBackdoor(const AddrRange &pkt_range) const;
- const std::vector<AddrRange> &originalRanges;
- const std::vector<AddrRange> &remappedRanges;
- /**
-
* In this vector, each entry contains a list of backdoors that in the
-
* range in original address view.
-
*/
- std::vector<std::list<std::unique_ptr<MemBackdoor>>> backdoorLists;
+};
+} // namespace gem5
+#endif //MEM_BACKDOOR_MANAGER_HH
diff --git a/src/mem/backdoor_manager.test.cc
b/src/mem/backdoor_manager.test.cc
new file mode 100644
index 0000000..05abc50
--- /dev/null
+++ b/src/mem/backdoor_manager.test.cc
@@ -0,0 +1,140 @@
+/*
-
- Copyright 2023 Google, Inc.
-
-
- 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.
- */
+#include <gtest/gtest.h>
+#include <vector>
+
+#include "base/addr_range.hh"
+#include "base/gtest/logging.hh"
+#include "mem/backdoor.hh"
+#include "mem/backdoor_manager.hh"
+
+namespace gem5
+{
+namespace backdoor_manager_test
+{
+const std::vector<AddrRange> kOriginalRange({AddrRange(0x0, 0x1000)});
+const std::vector<AddrRange> kRemappedRange({AddrRange(0x1000, 0x2000)});
+
+class BackdoorManagerTest : public BackdoorManager, public ::testing::Test
+{
- public:
- BackdoorManagerTest() : BackdoorManager(kOriginalRange, kRemappedRange)
- {
- }
+};
+TEST_F(BackdoorManagerTest, BasicRemapTest)
+{
- /**
-
* The backdoor range is remappedRanges[0], and should be reverted into
-
* originalRanges[0].
-
*/
- AddrRange pkt_range = originalRanges[0];
- uint8_t *ptr = nullptr;
- MemBackdoor remapped_backdoor(remappedRanges[0], ptr,
-
MemBackdoor::Flags::Readable);
- MemBackdoorPtr reverted_backdoor =
-
getRevertedBackdoor(&remapped_backdoor, pkt_range);
- EXPECT_EQ(reverted_backdoor->range(), originalRanges[0]);
- EXPECT_EQ(reverted_backdoor->ptr(), ptr);
- ASSERT_EQ(backdoorLists[0].size(), 1);
- EXPECT_EQ(backdoorLists[0].begin()->get(), reverted_backdoor);
- /**
-
* After the target backdoor is invalidated, the new created backdoor
should
+TEST_F(BackdoorManagerTest, ShrinkTest)
+{
range.
-
* Backdoor is expected to be shrinked.
-
*/
- Addr diff = 0x1000;
- AddrRange remapped_backdoor_range(
-
remappedRanges[0].start() - diff, // 0x0
-
remappedRanges[0].end() + diff); // 0x3000
- uint8_t *ptr = nullptr;
- MemBackdoor remapped_backdoor(remapped_backdoor_range, ptr,
-
MemBackdoor::Flags::Readable);
- MemBackdoorPtr reverted_backdoor =
-
getRevertedBackdoor(&remapped_backdoor, pkt_range);
- EXPECT_EQ(reverted_backdoor->range(), originalRanges[0]);
- EXPECT_EQ(reverted_backdoor->ptr(), ptr + diff);
- remapped_backdoor.invalidate();
+}
+TEST_F(BackdoorManagerTest, ReuseTest)
+{
the
-
* original address range.
-
*/
- Addr mid = originalRanges[0].start() + originalRanges[0].size() / 2;
- AddrRange pkt_range_0 = AddrRange(originalRanges[0].start(), mid);
- AddrRange pkt_range_1 = AddrRange(mid, originalRanges[0].end());
- /**
-
* The address range of the backdoor covers the whole address range, so
-
* both packets can be fulfilled by this backdoor.
-
*/
- uint8_t *ptr = nullptr;
- MemBackdoor remapped_backdoor(remappedRanges[0], ptr,
-
MemBackdoor::Flags::Readable);
- /**
-
* For the first packet, a new backdoor should be constructed.
-
*/
- MemBackdoorPtr reverted_backdoor_0 =
-
getRevertedBackdoor(&remapped_backdoor, pkt_range_0);
- EXPECT_EQ(backdoorLists[0].size(), 1);
- /**
-
* For the second packet, it should return the same backdoor as
previous
-
* one, and no new backdoor should be constructed.
-
*/
- MemBackdoorPtr reverted_backdoor_1 =
-
getRevertedBackdoor(&remapped_backdoor, pkt_range_1);
- EXPECT_EQ(reverted_backdoor_0, reverted_backdoor_1);
- EXPECT_EQ(backdoorLists[0].size(), 1);
- remapped_backdoor.invalidate();
+}
+} // namespace backdoor_manager_test
+} // namespace gem5
--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/69057?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Iedbe8eb75006ce1b81e85910af848fb8c4cba646
Gerrit-Change-Number: 69057
Gerrit-PatchSet: 3
Gerrit-Owner: Han-sheng Liu handsomeliu@google.com
Gerrit-Reviewer: Andreas Sandberg andreas.sandberg@arm.com
Gerrit-Reviewer: Bobby Bruce bbruce@ucdavis.edu
Gerrit-Reviewer: Gabe Black gabeblack@google.com
Gerrit-Reviewer: Giacomo Travaglini giacomo.travaglini@arm.com
Gerrit-Reviewer: Han-sheng Liu handsomeliu@google.com
Gerrit-Reviewer: Jason Lowe-Power jason@lowepower.com
Gerrit-Reviewer: Jason Lowe-Power power.jg@gmail.com
Gerrit-Reviewer: Nikos Nikoleris nikos.nikoleris@arm.com
Gerrit-Reviewer: Yu-hsin Wang yuhsingw@google.com
Gerrit-Reviewer: kokoro noreply+kokoro@google.com
Gerrit-CC: Earl Ou shunhsingou@google.com
Gerrit-CC: kokoro noreply+kokoro@google.com
Han-sheng Liu has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/69057?usp=email )
Change subject: mem: Support backdoor request in AddrMapper
......................................................................
mem: Support backdoor request in AddrMapper
Change-Id: Iedbe8eb75006ce1b81e85910af848fb8c4cba646
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/69057
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Yu-hsin Wang <yuhsingw@google.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
---
M src/mem/SConscript
M src/mem/addr_mapper.cc
M src/mem/addr_mapper.hh
A src/mem/backdoor_manager.cc
A src/mem/backdoor_manager.hh
A src/mem/backdoor_manager.test.cc
6 files changed, 457 insertions(+), 1 deletion(-)
Approvals:
Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
Yu-hsin Wang: Looks good to me, but someone else must approve
kokoro: Regressions pass
diff --git a/src/mem/SConscript b/src/mem/SConscript
index 6e017e0..e2a9114 100644
--- a/src/mem/SConscript
+++ b/src/mem/SConscript
@@ -71,6 +71,7 @@
Source('abstract_mem.cc')
Source('addr_mapper.cc')
+Source('backdoor_manager.cc')
Source('bridge.cc')
Source('coherent_xbar.cc')
Source('cfi_mem.cc')
@@ -105,6 +106,8 @@
Source('mem_delay.cc')
Source('port_terminator.cc')
+GTest('backdoor_manager.test', 'backdoor_manager.test.cc',
+ 'backdoor_manager.cc', with_tag('gem5_trace'))
GTest('translation_gen.test', 'translation_gen.test.cc')
Source('translating_port_proxy.cc')
diff --git a/src/mem/addr_mapper.cc b/src/mem/addr_mapper.cc
index 091b9d5..3c4054b 100644
--- a/src/mem/addr_mapper.cc
+++ b/src/mem/addr_mapper.cc
@@ -84,6 +84,19 @@
pkt->setAddr(orig_addr);
}
+void
+AddrMapper::recvMemBackdoorReq(const MemBackdoorReq &req,
+ MemBackdoorPtr &backdoor)
+{
+ AddrRange remapped_req_range =
AddrRange(remapAddr(req.range().start()),
+ remapAddr(req.range().end()));
+ MemBackdoorReq remapped_req(remapped_req_range, req.flags());
+ memSidePort.sendMemBackdoorReq(remapped_req, backdoor);
+ if (backdoor != nullptr) {
+ backdoor = getRevertedBackdoor(backdoor, req.range());
+ }
+}
+
Tick
AddrMapper::recvAtomic(PacketPtr pkt)
{
@@ -104,6 +117,19 @@
return ret_tick;
}
+Tick
+AddrMapper::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr& backdoor)
+{
+ Addr orig_addr = pkt->getAddr();
+ pkt->setAddr(remapAddr(orig_addr));
+ Tick ret_tick = memSidePort.sendAtomicBackdoor(pkt, backdoor);
+ pkt->setAddr(orig_addr);
+ if (backdoor != nullptr) {
+ backdoor = getRevertedBackdoor(backdoor, pkt->getAddrRange());
+ }
+ return ret_tick;
+}
+
bool
AddrMapper::recvTimingReq(PacketPtr pkt)
{
@@ -206,7 +232,8 @@
RangeAddrMapper::RangeAddrMapper(const RangeAddrMapperParams &p) :
AddrMapper(p),
originalRanges(p.original_ranges),
- remappedRanges(p.remapped_ranges)
+ remappedRanges(p.remapped_ranges),
+ backdoorManager(originalRanges, remappedRanges)
{
if (originalRanges.size() != remappedRanges.size())
fatal("AddrMapper: original and shadowed range list must "
@@ -232,6 +259,13 @@
return addr;
}
+MemBackdoorPtr
+RangeAddrMapper::getRevertedBackdoor(MemBackdoorPtr &backdoor,
+ const AddrRange &range)
+{
+ return backdoorManager.getRevertedBackdoor(backdoor, range);
+}
+
AddrRangeList
RangeAddrMapper::getAddrRanges() const
{
diff --git a/src/mem/addr_mapper.hh b/src/mem/addr_mapper.hh
index 40a0bb0..41709f3 100644
--- a/src/mem/addr_mapper.hh
+++ b/src/mem/addr_mapper.hh
@@ -38,6 +38,10 @@
#ifndef __MEM_ADDR_MAPPER_HH__
#define __MEM_ADDR_MAPPER_HH__
+#include <vector>
+
+#include "mem/backdoor_manager.hh"
+#include "mem/packet.hh"
#include "mem/port.hh"
#include "params/AddrMapper.hh"
#include "params/RangeAddrMapper.hh"
@@ -77,6 +81,20 @@
*/
virtual Addr remapAddr(Addr addr) const = 0;
+ /**
+ * This function returns a backdoor that fulfills the initiator
request,
+ * based on the target backdoor at the first parameter.
+ * Note that this function should return a backdoor in original address
+ * space, while the target backdoor is in remapped address space.
Address
+ * reverting logic is probably required in this function.
+ *
+ * @param backdoor the backdoor obtained from target
+ * @param range the initiator request to be fulfilled
+ * @return a backdoor that fulfill the initiator request
+ */
+ virtual MemBackdoorPtr getRevertedBackdoor(MemBackdoorPtr &backdoor,
+ const AddrRange &range) = 0;
+
class AddrMapperSenderState : public Packet::SenderState
{
@@ -168,12 +186,24 @@
mapper.recvFunctional(pkt);
}
+ void recvMemBackdoorReq(const MemBackdoorReq &req,
+ MemBackdoorPtr &backdoor) override
+ {
+ mapper.recvMemBackdoorReq(req, backdoor);
+ }
+
Tick
recvAtomic(PacketPtr pkt) override
{
return mapper.recvAtomic(pkt);
}
+ Tick
+ recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr& backdoor)
override
+ {
+ return mapper.recvAtomicBackdoor(pkt, backdoor);
+ }
+
bool
recvTimingReq(PacketPtr pkt) override
{
@@ -209,10 +239,15 @@
void recvFunctionalSnoop(PacketPtr pkt);
+ void recvMemBackdoorReq(const MemBackdoorReq &req,
+ MemBackdoorPtr &backdoor);
+
Tick recvAtomic(PacketPtr pkt);
Tick recvAtomicSnoop(PacketPtr pkt);
+ Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr& backdoor);
+
bool recvTimingReq(PacketPtr pkt);
bool recvTimingResp(PacketPtr pkt);
@@ -269,12 +304,19 @@
std::vector<AddrRange> remappedRanges;
Addr remapAddr(Addr addr) const override;
+
+ MemBackdoorPtr getRevertedBackdoor(MemBackdoorPtr &backdoor,
+ const AddrRange &range) override;
+
void
recvRangeChange() override
{
// TODO Check that our peer is actually expecting to receive
accesses
// in our output range(s).
}
+
+ private:
+ BackdoorManager backdoorManager;
};
} // namespace gem5
diff --git a/src/mem/backdoor_manager.cc b/src/mem/backdoor_manager.cc
new file mode 100644
index 0000000..32d267c
--- /dev/null
+++ b/src/mem/backdoor_manager.cc
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2023 Google, Inc
+ * 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.
+ *
+ * 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.
+ */
+
+#include <utility>
+
+#include "base/logging.hh"
+#include "mem/backdoor_manager.hh"
+
+namespace gem5
+{
+
+BackdoorManager::BackdoorManager(const std::vector<AddrRange>
&original_ranges,
+ const std::vector<AddrRange>
&remapped_ranges)
+ : originalRanges(original_ranges),
+ remappedRanges(remapped_ranges),
+ backdoorLists(original_ranges.size())
+{
+}
+
+MemBackdoorPtr
+BackdoorManager::getRevertedBackdoor(MemBackdoorPtr backdoor,
+ const AddrRange &pkt_range)
+{
+ MemBackdoorPtr reverted_backdoor = findBackdoor(pkt_range);
+ if (reverted_backdoor == nullptr) {
+ reverted_backdoor = createRevertedBackdoor(backdoor, pkt_range);
+ }
+ return reverted_backdoor;
+}
+
+MemBackdoorPtr
+BackdoorManager::createRevertedBackdoor(MemBackdoorPtr backdoor,
+ const AddrRange &pkt_range)
+{
+ std::unique_ptr<MemBackdoor> reverted_backdoor =
std::make_unique<MemBackdoor>();
+ reverted_backdoor->flags(backdoor->flags());
+ reverted_backdoor->ptr(backdoor->ptr());
+
+ Addr addr = pkt_range.start();
+ for (int i = 0; i < originalRanges.size(); ++i) {
+ if (originalRanges[i].contains(addr)) {
+ /** Does not support interleaved range backdoors. */
+ if (originalRanges[i].interleaved() ||
+ remappedRanges[i].interleaved()) {
+ return nullptr;
+ }
+
+ /** Shrink the backdoor to fit inside address range. */
+ AddrRange shrinked_backdoor_range =
+ backdoor->range() & remappedRanges[i];
+
+ Addr backdoor_offset =
+ shrinked_backdoor_range.start() -
remappedRanges[i].start();
+ Addr backdoor_size = shrinked_backdoor_range.size();
+
+ /** Create the backdoor in original address view. */
+ reverted_backdoor->range(AddrRange(
+ originalRanges[i].start() + backdoor_offset,
+ originalRanges[i].start() + backdoor_offset +
backdoor_size));
+
+ /**
+ * The backdoor pointer also needs to be shrinked to point to
the
+ * beginning of the range.
+ */
+ Addr shrinked_offset =
+ shrinked_backdoor_range.start() -
backdoor->range().start();
+ reverted_backdoor->ptr(backdoor->ptr() + shrinked_offset);
+
+ /**
+ * Bind the life cycle of the created backdoor with the target
+ * backdoor. Invalid and delete the created backdoor when the
+ * target backdoor is invalidated.
+ */
+ MemBackdoorPtr reverted_backdoor_raw_ptr =
reverted_backdoor.get();
+ auto it = backdoorLists[i].insert(backdoorLists[i].end(),
+
std::move(reverted_backdoor));
+ backdoor->addInvalidationCallback(
+ [this, i, it](const MemBackdoor &backdoor) {
+ (*it)->invalidate(); // *it is unique_ptr
reverted_backdoor
+ this->backdoorLists[i].erase(it);
+ });
+ return reverted_backdoor_raw_ptr;
+ }
+ }
+ // Backdoor is not valid. Return an empty one.
+ panic("Target does not provide valid backdoor.");
+}
+
+MemBackdoorPtr
+BackdoorManager::findBackdoor(const AddrRange &pkt_range) const
+{
+ Addr addr = pkt_range.start();
+ Addr size = pkt_range.size();
+ for (int i = 0; i < originalRanges.size(); ++i) {
+ /** The original ranges should be disjoint, so at most one range
+ * contains the begin address.
+ */
+ if (originalRanges[i].contains(addr)) {
+ if (!originalRanges[i].contains(addr + size - 1)) {
+ /** The request range doesn't fit in any address range. */
+ return nullptr;
+ }
+ for (const auto &backdoor : backdoorLists[i]) {
+ if (backdoor->range().contains(addr) &&
+ backdoor->range().contains(addr + size - 1)) {
+ return backdoor.get();
+ }
+ }
+ }
+ }
+ return nullptr;
+}
+
+} // namespace gem5
diff --git a/src/mem/backdoor_manager.hh b/src/mem/backdoor_manager.hh
new file mode 100644
index 0000000..676987c
--- /dev/null
+++ b/src/mem/backdoor_manager.hh
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2023 Google, Inc
+ * 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.
+ *
+ * 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_BACKDOOR_MANAGER_HH__
+#define __MEM_BACKDOOR_MANAGER_HH__
+
+#include <list>
+#include <memory>
+#include <vector>
+
+#include "mem/backdoor.hh"
+#include "mem/packet.hh"
+
+namespace gem5
+{
+
+/**
+ * This class manages the backdoors for RangeAddrMapper. It provides
+ * functionalities such as backdoor remapping, resource managing.
+ */
+class BackdoorManager
+{
+ public:
+ explicit BackdoorManager(const std::vector<AddrRange> &original_ranges,
+ const std::vector<AddrRange>
&remapped_ranges);
+
+ MemBackdoorPtr getRevertedBackdoor(MemBackdoorPtr backdoor,
+ const AddrRange &pkt_range);
+
+ protected:
+ /**
+ * This function creates a new backdoor, whose address range contains
the
+ * original request address. The address range is in initiator address
+ * view, and shouldn't exceed the original address range.
+ */
+ MemBackdoorPtr createRevertedBackdoor(MemBackdoorPtr backdoor,
+ const AddrRange &pkt_range);
+ /**
+ * This function returns a created backdoor that fulfills the request,
or
+ * returns nullptr if there's no.
+ */
+ MemBackdoorPtr findBackdoor(const AddrRange &pkt_range) const;
+
+ const std::vector<AddrRange> &originalRanges;
+ const std::vector<AddrRange> &remappedRanges;
+
+ /**
+ * In this vector, each entry contains a list of backdoors that in the
+ * range in original address view.
+ */
+ std::vector<std::list<std::unique_ptr<MemBackdoor>>> backdoorLists;
+};
+} // namespace gem5
+
+#endif //__MEM_BACKDOOR_MANAGER_HH__
diff --git a/src/mem/backdoor_manager.test.cc
b/src/mem/backdoor_manager.test.cc
new file mode 100644
index 0000000..05abc50
--- /dev/null
+++ b/src/mem/backdoor_manager.test.cc
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2023 Google, Inc.
+ *
+ * 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.
+ */
+
+#include <gtest/gtest.h>
+#include <vector>
+
+#include "base/addr_range.hh"
+#include "base/gtest/logging.hh"
+#include "mem/backdoor.hh"
+#include "mem/backdoor_manager.hh"
+
+namespace gem5
+{
+namespace backdoor_manager_test
+{
+const std::vector<AddrRange> kOriginalRange({AddrRange(0x0, 0x1000)});
+const std::vector<AddrRange> kRemappedRange({AddrRange(0x1000, 0x2000)});
+
+class BackdoorManagerTest : public BackdoorManager, public ::testing::Test
+{
+ public:
+ BackdoorManagerTest() : BackdoorManager(kOriginalRange, kRemappedRange)
+ {
+ }
+};
+
+TEST_F(BackdoorManagerTest, BasicRemapTest)
+{
+ /**
+ * The backdoor range is remappedRanges[0], and should be reverted into
+ * originalRanges[0].
+ */
+ AddrRange pkt_range = originalRanges[0];
+
+ uint8_t *ptr = nullptr;
+ MemBackdoor remapped_backdoor(remappedRanges[0], ptr,
+ MemBackdoor::Flags::Readable);
+ MemBackdoorPtr reverted_backdoor =
+ getRevertedBackdoor(&remapped_backdoor, pkt_range);
+
+ EXPECT_EQ(reverted_backdoor->range(), originalRanges[0]);
+ EXPECT_EQ(reverted_backdoor->ptr(), ptr);
+ ASSERT_EQ(backdoorLists[0].size(), 1);
+ EXPECT_EQ(backdoorLists[0].begin()->get(), reverted_backdoor);
+
+ /**
+ * After the target backdoor is invalidated, the new created backdoor
should
+ * be freed and removed from the backdoor list.
+ */
+ remapped_backdoor.invalidate();
+ EXPECT_EQ(backdoorLists[0].size(), 0);
+}
+
+TEST_F(BackdoorManagerTest, ShrinkTest)
+{
+ AddrRange pkt_range = originalRanges[0];
+
+ /**
+ * The backdoor range is larger than the address remapper's address
range.
+ * Backdoor is expected to be shrinked.
+ */
+ Addr diff = 0x1000;
+ AddrRange remapped_backdoor_range(
+ remappedRanges[0].start() - diff, // 0x0
+ remappedRanges[0].end() + diff); // 0x3000
+
+ uint8_t *ptr = nullptr;
+ MemBackdoor remapped_backdoor(remapped_backdoor_range, ptr,
+ MemBackdoor::Flags::Readable);
+ MemBackdoorPtr reverted_backdoor =
+ getRevertedBackdoor(&remapped_backdoor, pkt_range);
+
+ EXPECT_EQ(reverted_backdoor->range(), originalRanges[0]);
+ EXPECT_EQ(reverted_backdoor->ptr(), ptr + diff);
+
+ remapped_backdoor.invalidate();
+}
+
+TEST_F(BackdoorManagerTest, ReuseTest)
+{
+ /**
+ * The two packets have different address range, but both contained in
the
+ * original address range.
+ */
+ Addr mid = originalRanges[0].start() + originalRanges[0].size() / 2;
+ AddrRange pkt_range_0 = AddrRange(originalRanges[0].start(), mid);
+ AddrRange pkt_range_1 = AddrRange(mid, originalRanges[0].end());
+
+ /**
+ * The address range of the backdoor covers the whole address range, so
+ * both packets can be fulfilled by this backdoor.
+ */
+ uint8_t *ptr = nullptr;
+ MemBackdoor remapped_backdoor(remappedRanges[0], ptr,
+ MemBackdoor::Flags::Readable);
+ /**
+ * For the first packet, a new backdoor should be constructed.
+ */
+ MemBackdoorPtr reverted_backdoor_0 =
+ getRevertedBackdoor(&remapped_backdoor, pkt_range_0);
+ EXPECT_EQ(backdoorLists[0].size(), 1);
+
+ /**
+ * For the second packet, it should return the same backdoor as
previous
+ * one, and no new backdoor should be constructed.
+ */
+ MemBackdoorPtr reverted_backdoor_1 =
+ getRevertedBackdoor(&remapped_backdoor, pkt_range_1);
+ EXPECT_EQ(reverted_backdoor_0, reverted_backdoor_1);
+ EXPECT_EQ(backdoorLists[0].size(), 1);
+
+ remapped_backdoor.invalidate();
+}
+
+} // namespace backdoor_manager_test
+} // namespace gem5
--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/69057?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Iedbe8eb75006ce1b81e85910af848fb8c4cba646
Gerrit-Change-Number: 69057
Gerrit-PatchSet: 3
Gerrit-Owner: Han-sheng Liu <handsomeliu@google.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandberg@arm.com>
Gerrit-Reviewer: Bobby Bruce <bbruce@ucdavis.edu>
Gerrit-Reviewer: Gabe Black <gabeblack@google.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Gerrit-Reviewer: Han-sheng Liu <handsomeliu@google.com>
Gerrit-Reviewer: Jason Lowe-Power <jason@lowepower.com>
Gerrit-Reviewer: Jason Lowe-Power <power.jg@gmail.com>
Gerrit-Reviewer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Gerrit-Reviewer: Yu-hsin Wang <yuhsingw@google.com>
Gerrit-Reviewer: kokoro <noreply+kokoro@google.com>
Gerrit-CC: Earl Ou <shunhsingou@google.com>
Gerrit-CC: kokoro <noreply+kokoro@google.com>