gem5 v23.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
addr_mapper.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012 ARM Limited
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#ifndef __MEM_ADDR_MAPPER_HH__
39#define __MEM_ADDR_MAPPER_HH__
40
41#include "mem/port.hh"
42#include "params/AddrMapper.hh"
43#include "params/RangeAddrMapper.hh"
44#include "sim/sim_object.hh"
45
46namespace gem5
47{
48
58class AddrMapper : public SimObject
59{
60 public:
61 AddrMapper(const AddrMapperParams &params);
62
63 virtual ~AddrMapper() = default;
64
65 Port &getPort(const std::string &if_name,
66 PortID idx=InvalidPortID) override;
67
68 void init() override;
69
70 protected:
78 virtual Addr remapAddr(Addr addr) const = 0;
79
81 {
82
83 public:
84
90 AddrMapperSenderState(Addr _origAddr) : origAddr(_origAddr)
91 {}
92
95
98 };
99
101 {
102 public:
103 MapperRequestPort(const std::string& _name, AddrMapper& _mapper)
104 : RequestPort(_name), mapper(_mapper)
105 { }
106
107 protected:
108 void
110 {
112 }
113
114 Tick
116 {
117 return mapper.recvAtomicSnoop(pkt);
118 }
119
120 bool
122 {
123 return mapper.recvTimingResp(pkt);
124 }
125
126 void
128 {
130 }
131
132 void
134 {
136 }
137
138 bool
139 isSnooping() const override
140 {
141 return mapper.isSnooping();
142 }
143
144 void
145 recvReqRetry() override
146 {
148 }
149
150 private:
152 };
153
156
158 {
159 public:
160 MapperResponsePort(const std::string& _name, AddrMapper& _mapper)
161 : ResponsePort(_name), mapper(_mapper)
162 {}
163
164 protected:
165 void
167 {
169 }
170
171 Tick
172 recvAtomic(PacketPtr pkt) override
173 {
174 return mapper.recvAtomic(pkt);
175 }
176
177 bool
179 {
180 return mapper.recvTimingReq(pkt);
181 }
182
183 bool
185 {
186 return mapper.recvTimingSnoopResp(pkt);
187 }
188
190 getAddrRanges() const override
191 {
192 return mapper.getAddrRanges();
193 }
194
195 void
196 recvRespRetry() override
197 {
199 }
200
201 private:
203 };
204
207
208 void recvFunctional(PacketPtr pkt);
209
211
213
215
216 bool recvTimingReq(PacketPtr pkt);
217
218 bool recvTimingResp(PacketPtr pkt);
219
221
223
224 virtual AddrRangeList getAddrRanges() const = 0;
225
226 bool isSnooping() const;
227
228 void recvReqRetry();
229
230 void recvRespRetry();
231
232 virtual void recvRangeChange();
233};
234
242{
243 public:
244 RangeAddrMapper(const RangeAddrMapperParams &p);
245
246 ~RangeAddrMapper() = default;
247
248 AddrRangeList getAddrRanges() const override;
249
250 void
251 init() override
252 {
255 }
256
257 protected:
264
270
271 Addr remapAddr(Addr addr) const override;
272 void
274 {
275 // TODO Check that our peer is actually expecting to receive accesses
276 // in our output range(s).
277 }
278};
279
280} // namespace gem5
281
282#endif //__MEM_ADDR_MAPPER_HH__
Addr origAddr
The original address the packet was destined for.
AddrMapperSenderState(Addr _origAddr)
Construct a new sender state to remember the original address.
void recvFunctionalSnoop(PacketPtr pkt) override
Receive a functional snoop request packet from the peer.
void recvRangeChange() override
Called to receive an address range change from the peer response port.
bool isSnooping() const override
Determine if this request port is snooping or not.
MapperRequestPort(const std::string &_name, AddrMapper &_mapper)
void recvTimingSnoopReq(PacketPtr pkt) override
Receive a timing snoop request from the peer.
Tick recvAtomicSnoop(PacketPtr pkt) override
Receive an atomic snoop request packet from our peer.
bool recvTimingResp(PacketPtr pkt) override
Receive a timing response from the peer.
void recvReqRetry() override
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
bool recvTimingReq(PacketPtr pkt) override
Receive a timing request from the peer.
MapperResponsePort(const std::string &_name, AddrMapper &_mapper)
bool recvTimingSnoopResp(PacketPtr pkt) override
Receive a timing snoop response from the peer.
AddrRangeList getAddrRanges() const override
Get a list of the non-overlapping address ranges the owner is responsible for.
void recvFunctional(PacketPtr pkt) override
Receive a functional request packet from the peer.
Tick recvAtomic(PacketPtr pkt) override
Receive an atomic request packet from the peer.
void recvRespRetry() override
Called by the peer if sendTimingResp was called on this protocol (causing recvTimingResp to be called...
An address mapper changes the packet addresses in going from the response port side of the mapper to ...
MapperRequestPort memSidePort
Instance of request port, facing the memory side.
virtual AddrRangeList getAddrRanges() const =0
virtual void recvRangeChange()
MapperResponsePort cpuSidePort
Instance of response port, i.e.
Tick recvAtomicSnoop(PacketPtr pkt)
bool recvTimingResp(PacketPtr pkt)
void recvFunctionalSnoop(PacketPtr pkt)
bool recvTimingReq(PacketPtr pkt)
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
void recvTimingSnoopReq(PacketPtr pkt)
virtual ~AddrMapper()=default
bool isSnooping() const
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
void recvFunctional(PacketPtr pkt)
bool recvTimingSnoopResp(PacketPtr pkt)
Tick recvAtomic(PacketPtr pkt)
virtual Addr remapAddr(Addr addr) const =0
This function does the actual remapping of one address to another.
const std::string _name
Definition named.hh:41
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
Ports are used to interface objects to each other.
Definition port.hh:62
Range address mapper that maps a set of original ranges to a set of remapped ranges,...
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
~RangeAddrMapper()=default
std::vector< AddrRange > originalRanges
This contains a list of ranges the should be remapped.
std::vector< AddrRange > remappedRanges
This contains a list of ranges that addresses should be remapped to.
Addr remapAddr(Addr addr) const override
This function does the actual remapping of one address to another.
AddrRangeList getAddrRanges() const override
void recvRangeChange() override
A RequestPort is a specialisation of a Port, which implements the default protocol for the three diff...
Definition port.hh:79
A ResponsePort is a specialization of a port.
Definition port.hh:288
void sendRangeChange() const
Called by the owner to send a range change.
Definition port.hh:319
Abstract superclass for simulation objects.
STL vector class.
Definition stl.hh:37
const Params & params() const
Port Object Declaration.
Bitfield< 0 > p
Bitfield< 3 > addr
Definition types.hh:84
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
const PortID InvalidPortID
Definition types.hh:246
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition types.hh:245
uint64_t Tick
Tick count type.
Definition types.hh:58
A virtual base opaque structure used to hold state associated with the packet (e.g....
Definition packet.hh:469

Generated on Mon Jul 10 2023 14:24:32 for gem5 by doxygen 1.9.7