gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
memhelpers.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013, 2019 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  * Copyright (c) 2011 Google
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
41 #ifndef __ARCH_GENERIC_MEMHELPERS_HH__
42 #define __ARCH_GENERIC_MEMHELPERS_HH__
43 
44 #include "base/types.hh"
45 #include "mem/packet.hh"
46 #include "mem/request.hh"
47 #include "sim/byteswap.hh"
48 #include "sim/insttracer.hh"
49 
50 template <class XC>
51 Fault
52 initiateMemRead(XC *xc, Addr addr, std::size_t size,
53  Request::Flags flags,
54  const std::vector<bool> &byte_enable)
55 {
56  return xc->initiateMemRead(addr, size, flags, byte_enable);
57 }
58 
62 template <class XC, class MemT>
63 Fault
65  MemT &mem, Request::Flags flags)
66 {
67  static const std::vector<bool> byte_enable(sizeof(MemT), true);
68  return initiateMemRead(xc, addr, sizeof(MemT),
69  flags, byte_enable);
70 }
71 
73 template <ByteOrder Order, class MemT>
74 void
75 getMem(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
76 {
77  mem = pkt->get<MemT>(Order);
78  if (traceData)
79  traceData->setData(mem);
80 }
81 
82 template <class MemT>
83 void
84 getMemLE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
85 {
86  getMem<ByteOrder::little>(pkt, mem, traceData);
87 }
88 
89 template <class MemT>
90 void
91 getMemBE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
92 {
93  getMem<ByteOrder::big>(pkt, mem, traceData);
94 }
95 
97 template <class XC>
98 Fault
99 readMemAtomic(XC *xc, Addr addr, uint8_t *mem,
100  std::size_t size, Request::Flags flags,
101  const std::vector<bool> &byte_enable)
102 {
103  return xc->readMem(addr, mem, size, flags, byte_enable);
104 }
105 
107 template <ByteOrder Order, class XC, class MemT>
108 Fault
109 readMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem,
110  Request::Flags flags)
111 {
112  memset(&mem, 0, sizeof(mem));
113  static const std::vector<bool> byte_enable(sizeof(MemT), true);
114  Fault fault = readMemAtomic(xc, addr, (uint8_t*)&mem,
115  sizeof(MemT), flags, byte_enable);
116  if (fault == NoFault) {
117  mem = gtoh(mem, Order);
118  if (traceData)
119  traceData->setData(mem);
120  }
121  return fault;
122 }
123 
124 template <class XC, class MemT>
125 Fault
126 readMemAtomicLE(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem,
127  Request::Flags flags)
128 {
129  return readMemAtomic<ByteOrder::little>(
130  xc, traceData, addr, mem, flags);
131 }
132 
133 template <class XC, class MemT>
134 Fault
135 readMemAtomicBE(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem,
136  Request::Flags flags)
137 {
138  return readMemAtomic<ByteOrder::big>(xc, traceData, addr, mem, flags);
139 }
140 
142 template <class XC>
143 Fault
144 writeMemTiming(XC *xc, uint8_t *mem, Addr addr,
145  std::size_t size, Request::Flags flags, uint64_t *res,
146  const std::vector<bool> &byte_enable)
147 {
148  return xc->writeMem(mem, size, addr, flags, res, byte_enable);
149 }
150 
151 template <ByteOrder Order, class XC, class MemT>
152 Fault
153 writeMemTiming(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr,
154  Request::Flags flags, uint64_t *res)
155 {
156  if (traceData) {
157  traceData->setData(mem);
158  }
159  mem = htog(mem, Order);
160  static const std::vector<bool> byte_enable(sizeof(MemT), true);
161  return writeMemTiming(xc, (uint8_t*)&mem, addr,
162  sizeof(MemT), flags, res, byte_enable);
163 }
164 
165 template <class XC, class MemT>
166 Fault
167 writeMemTimingLE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr,
168  Request::Flags flags, uint64_t *res)
169 {
170  return writeMemTiming<ByteOrder::little>(
171  xc, traceData, mem, addr, flags, res);
172 }
173 
174 template <class XC, class MemT>
175 Fault
176 writeMemTimingBE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr,
177  Request::Flags flags, uint64_t *res)
178 {
179  return writeMemTiming<ByteOrder::big>(
180  xc, traceData, mem, addr, flags, res);
181 }
182 
184 template <class XC>
185 Fault
186 writeMemAtomic(XC *xc, uint8_t *mem, Addr addr,
187  std::size_t size, Request::Flags flags,
188  uint64_t *res, const std::vector<bool> &byte_enable)
189 {
190  return xc->writeMem(mem, size, addr, flags, res, byte_enable);
191 }
192 
193 template <ByteOrder Order, class XC, class MemT>
194 Fault
195 writeMemAtomic(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
196  Addr addr, Request::Flags flags, uint64_t *res)
197 {
198  if (traceData) {
199  traceData->setData(mem);
200  }
201  MemT host_mem = htog(mem, Order);
202  static const std::vector<bool> byte_enable(sizeof(MemT), true);
203  Fault fault = writeMemAtomic(xc, (uint8_t*)&host_mem,
204  addr, sizeof(MemT), flags, res, byte_enable);
205  if (fault == NoFault && res != NULL) {
206  if (flags & Request::MEM_SWAP || flags & Request::MEM_SWAP_COND)
207  *(MemT *)res = gtoh(*(MemT *)res, Order);
208  else
209  *res = gtoh(*res, Order);
210  }
211  return fault;
212 }
213 
214 template <class XC, class MemT>
215 Fault
216 writeMemAtomicLE(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
217  Addr addr, Request::Flags flags, uint64_t *res)
218 {
219  return writeMemAtomic<ByteOrder::little>(
220  xc, traceData, mem, addr, flags, res);
221 }
222 
223 template <class XC, class MemT>
224 Fault
225 writeMemAtomicBE(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
226  Addr addr, Request::Flags flags, uint64_t *res)
227 {
228  return writeMemAtomic<ByteOrder::big>(
229  xc, traceData, mem, addr, flags, res);
230 }
231 
233 template <ByteOrder Order, class XC, class MemT>
234 Fault
235 amoMemAtomic(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr,
236  Request::Flags flags, AtomicOpFunctor *_amo_op)
237 {
238  assert(_amo_op);
239 
240  // mem will hold the previous value at addr after the AMO completes
241  memset(&mem, 0, sizeof(mem));
242 
243  AtomicOpFunctorPtr amo_op = AtomicOpFunctorPtr(_amo_op);
244  Fault fault = xc->amoMem(addr, (uint8_t *)&mem, sizeof(MemT), flags,
245  std::move(amo_op));
246 
247  if (fault == NoFault) {
248  mem = gtoh(mem, Order);
249  if (traceData)
250  traceData->setData(mem);
251  }
252  return fault;
253 }
254 
255 template <class XC, class MemT>
256 Fault
257 amoMemAtomicLE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr,
258  Request::Flags flags, AtomicOpFunctor *_amo_op)
259 {
260  return amoMemAtomic<ByteOrder::little>(
261  xc, traceData, mem, addr, flags, _amo_op);
262 }
263 
264 template <class XC, class MemT>
265 Fault
266 amoMemAtomicBE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr,
267  Request::Flags flags, AtomicOpFunctor *_amo_op)
268 {
269  return amoMemAtomic<ByteOrder::big>(
270  xc, traceData, mem, addr, flags, _amo_op);
271 }
272 
274 template <class XC, class MemT>
275 Fault
276 initiateMemAMO(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT& mem,
277  Request::Flags flags, AtomicOpFunctor *_amo_op)
278 {
279  assert(_amo_op);
280  AtomicOpFunctorPtr amo_op = AtomicOpFunctorPtr(_amo_op);
281  return xc->initiateMemAMO(addr, sizeof(MemT), flags, std::move(amo_op));
282 }
283 
284 #endif
writeMemTiming
Fault writeMemTiming(XC *xc, uint8_t *mem, Addr addr, std::size_t size, Request::Flags flags, uint64_t *res, const std::vector< bool > &byte_enable)
Write to memory in timing mode.
Definition: memhelpers.hh:144
getMem
void getMem(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
Extract the data returned from a timing mode read.
Definition: memhelpers.hh:75
AtomicOpFunctorPtr
std::unique_ptr< AtomicOpFunctor > AtomicOpFunctorPtr
Definition: amo.hh:239
writeMemAtomic
Fault writeMemAtomic(XC *xc, uint8_t *mem, Addr addr, std::size_t size, Request::Flags flags, uint64_t *res, const std::vector< bool > &byte_enable)
Write to memory in atomic mode.
Definition: memhelpers.hh:186
writeMemAtomicBE
Fault writeMemAtomicBE(XC *xc, Trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
Definition: memhelpers.hh:225
Request::MEM_SWAP_COND
@ MEM_SWAP_COND
Definition: request.hh:152
amoMemAtomicLE
Fault amoMemAtomicLE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
Definition: memhelpers.hh:257
insttracer.hh
Flags< FlagsType >
Trace::InstRecord
Definition: insttracer.hh:55
std::vector< bool >
request.hh
packet.hh
AtomicOpFunctor
Definition: amo.hh:40
Fault
std::shared_ptr< FaultBase > Fault
Definition: types.hh:246
htog
T htog(T value, ByteOrder guest_byte_order)
Definition: byteswap.hh:156
amoMemAtomicBE
Fault amoMemAtomicBE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
Definition: memhelpers.hh:266
initiateMemAMO
Fault initiateMemAMO(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags, AtomicOpFunctor *_amo_op)
Do atomic read-modify-wrote (AMO) in timing mode.
Definition: memhelpers.hh:276
writeMemTimingLE
Fault writeMemTimingLE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
Definition: memhelpers.hh:167
Trace::InstRecord::setData
void setData(std::array< T, N > d)
Definition: insttracer.hh:183
readMemAtomic
Fault readMemAtomic(XC *xc, Addr addr, uint8_t *mem, std::size_t size, Request::Flags flags, const std::vector< bool > &byte_enable)
Read from memory in atomic mode.
Definition: memhelpers.hh:99
NoFault
constexpr decltype(nullptr) NoFault
Definition: types.hh:251
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:80
readMemAtomicBE
Fault readMemAtomicBE(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
Definition: memhelpers.hh:135
Packet::get
T get(ByteOrder endian) const
Get the data in the packet byte swapped from the specified endianness.
Definition: packet_access.hh:82
initiateMemRead
Fault initiateMemRead(XC *xc, Addr addr, std::size_t size, Request::Flags flags, const std::vector< bool > &byte_enable)
Definition: memhelpers.hh:52
getMemLE
void getMemLE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
Definition: memhelpers.hh:84
types.hh
Request::MEM_SWAP
@ MEM_SWAP
This request is for a memory swap.
Definition: request.hh:151
getMemBE
void getMemBE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
Definition: memhelpers.hh:91
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:258
writeMemTimingBE
Fault writeMemTimingBE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
Definition: memhelpers.hh:176
mem
bool_vector8 mem[]
Definition: reset_stim.h:43
gtoh
T gtoh(T value, ByteOrder guest_byte_order)
Definition: byteswap.hh:163
amoMemAtomic
Fault amoMemAtomic(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
Do atomic read-modify-write (AMO) in atomic mode.
Definition: memhelpers.hh:235
byteswap.hh
readMemAtomicLE
Fault readMemAtomicLE(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
Definition: memhelpers.hh:126
writeMemAtomicLE
Fault writeMemAtomicLE(XC *xc, Trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
Definition: memhelpers.hh:216

Generated on Tue Mar 23 2021 19:41:23 for gem5 by doxygen 1.8.17