gem5  [DEVELOP-FOR-23.0]
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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"
41 #include "mem/backdoor_manager.hh"
42 
43 namespace 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
gem5::BackdoorManager::findBackdoor
MemBackdoorPtr findBackdoor(const AddrRange &pkt_range) const
This function returns a created backdoor that fulfills the request, or returns nullptr if there's no.
Definition: backdoor_manager.cc:124
gem5::AddrRange::start
Addr start() const
Get the start address of the range.
Definition: addr_range.hh:343
std::vector
STL vector class.
Definition: stl.hh:37
gem5::MemBackdoor::addInvalidationCallback
void addInvalidationCallback(CbFunction func)
Definition: backdoor.hh:103
gem5::MemBackdoor::flags
Flags flags() const
Definition: backdoor.hh:89
gem5::ArmISA::i
Bitfield< 7 > i
Definition: misc_types.hh:67
gem5::BackdoorManager::BackdoorManager
BackdoorManager(const std::vector< AddrRange > &original_ranges, const std::vector< AddrRange > &remapped_ranges)
Definition: backdoor_manager.cc:46
gem5::BackdoorManager::backdoorLists
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.
Definition: backdoor_manager.hh:85
gem5::BackdoorManager::originalRanges
const std::vector< AddrRange > & originalRanges
Definition: backdoor_manager.hh:78
gem5::BackdoorManager::createRevertedBackdoor
MemBackdoorPtr createRevertedBackdoor(MemBackdoorPtr backdoor, const AddrRange &pkt_range)
This function creates a new backdoor, whose address range contains the original request address.
Definition: backdoor_manager.cc:66
gem5::AddrRange::size
Addr size() const
Get the size of the address range.
Definition: addr_range.hh:326
gem5::BackdoorManager::remappedRanges
const std::vector< AddrRange > & remappedRanges
Definition: backdoor_manager.hh:79
gem5::Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
gem5::MemBackdoor
Definition: backdoor.hh:41
gem5::MemBackdoor::ptr
uint8_t * ptr() const
Definition: backdoor.hh:62
gem5::MemBackdoor::range
const AddrRange & range() const
Definition: backdoor.hh:58
logging.hh
gem5::AddrRange
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
Definition: addr_range.hh:81
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: gpu_translation_state.hh:37
backdoor_manager.hh
gem5::BackdoorManager::getRevertedBackdoor
MemBackdoorPtr getRevertedBackdoor(MemBackdoorPtr backdoor, const AddrRange &pkt_range)
Definition: backdoor_manager.cc:55
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:188
gem5::X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:84

Generated on Sun Jul 30 2023 01:56:57 for gem5 by doxygen 1.8.17