gem5 v24.0.0.0
Loading...
Searching...
No Matches
backdoor_manager.cc
Go to the documentation of this file.
1/*
2 * Copyright 2023 Google, Inc
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include <utility>
39
40#include "base/logging.hh"
42
43namespace gem5
44{
45
47 const std::vector<AddrRange> &remapped_ranges)
48 : originalRanges(original_ranges),
49 remappedRanges(remapped_ranges),
50 backdoorLists(original_ranges.size())
51{
52}
53
56 const AddrRange &pkt_range)
57{
58 MemBackdoorPtr reverted_backdoor = findBackdoor(pkt_range);
59 if (reverted_backdoor == nullptr) {
60 reverted_backdoor = createRevertedBackdoor(backdoor, pkt_range);
61 }
62 return reverted_backdoor;
63}
64
67 const AddrRange &pkt_range)
68{
69 std::unique_ptr<MemBackdoor> reverted_backdoor = std::make_unique<MemBackdoor>();
70 reverted_backdoor->flags(backdoor->flags());
71 reverted_backdoor->ptr(backdoor->ptr());
72
73 Addr addr = pkt_range.start();
74 for (int i = 0; i < originalRanges.size(); ++i) {
75 if (originalRanges[i].contains(addr)) {
77 if (originalRanges[i].interleaved() ||
78 remappedRanges[i].interleaved()) {
79 return nullptr;
80 }
81
83 AddrRange shrinked_backdoor_range =
84 backdoor->range() & remappedRanges[i];
85
86 Addr backdoor_offset =
87 shrinked_backdoor_range.start() - remappedRanges[i].start();
88 Addr backdoor_size = shrinked_backdoor_range.size();
89
91 reverted_backdoor->range(AddrRange(
92 originalRanges[i].start() + backdoor_offset,
93 originalRanges[i].start() + backdoor_offset + backdoor_size));
94
99 Addr shrinked_offset =
100 shrinked_backdoor_range.start() - backdoor->range().start();
101 reverted_backdoor->ptr(backdoor->ptr() + shrinked_offset);
102
108 MemBackdoorPtr reverted_backdoor_raw_ptr = reverted_backdoor.get();
109 auto it = backdoorLists[i].insert(backdoorLists[i].end(),
110 std::move(reverted_backdoor));
111 backdoor->addInvalidationCallback(
112 [this, i, it](const MemBackdoor &backdoor) {
113 (*it)->invalidate(); // *it is unique_ptr reverted_backdoor
114 this->backdoorLists[i].erase(it);
115 });
116 return reverted_backdoor_raw_ptr;
117 }
118 }
119 // Backdoor is not valid. Return an empty one.
120 panic("Target does not provide valid backdoor.");
121}
122
125{
126 Addr addr = pkt_range.start();
127 Addr size = pkt_range.size();
128 for (int i = 0; i < originalRanges.size(); ++i) {
132 if (originalRanges[i].contains(addr)) {
133 if (!originalRanges[i].contains(addr + size - 1)) {
135 return nullptr;
136 }
137 for (const auto &backdoor : backdoorLists[i]) {
138 if (backdoor->range().contains(addr) &&
139 backdoor->range().contains(addr + size - 1)) {
140 return backdoor.get();
141 }
142 }
143 }
144 }
145 return nullptr;
146}
147
148} // namespace gem5
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
Definition addr_range.hh:82
MemBackdoorPtr createRevertedBackdoor(MemBackdoorPtr backdoor, const AddrRange &pkt_range)
This function creates a new backdoor, whose address range contains the original request address.
BackdoorManager(const std::vector< AddrRange > &original_ranges, const std::vector< AddrRange > &remapped_ranges)
const std::vector< AddrRange > & originalRanges
MemBackdoorPtr findBackdoor(const AddrRange &pkt_range) const
This function returns a created backdoor that fulfills the request, or returns nullptr if there's no.
std::vector< std::list< std::unique_ptr< MemBackdoor > > > backdoorLists
In this vector, each entry contains a list of backdoors that in the range in original address view.
const std::vector< AddrRange > & remappedRanges
MemBackdoorPtr getRevertedBackdoor(MemBackdoorPtr backdoor, const AddrRange &pkt_range)
uint8_t * ptr() const
Definition backdoor.hh:62
const AddrRange & range() const
Definition backdoor.hh:58
void addInvalidationCallback(CbFunction func)
Definition backdoor.hh:103
Flags flags() const
Definition backdoor.hh:89
STL vector class.
Definition stl.hh:37
Addr start() const
Get the start address of the range.
Addr size() const
Get the size of the address range.
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:188
Bitfield< 7 > i
Definition misc_types.hh:67
Bitfield< 3 > addr
Definition types.hh:84
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147

Generated on Tue Jun 18 2024 16:24:04 for gem5 by doxygen 1.11.0