gem5 v23.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
50namespace gem5
51{
52
53template <class XC>
55initiateMemRead(XC *xc, Addr addr, std::size_t size,
57 const std::vector<bool> &byte_enable)
58{
59 return xc->initiateMemRead(addr, size, flags, byte_enable);
60}
61
65template <class XC, class MemT>
69{
70 static const std::vector<bool> byte_enable(sizeof(MemT), true);
71 return initiateMemRead(xc, addr, sizeof(MemT),
72 flags, byte_enable);
73}
74
76template <ByteOrder Order, class MemT>
77void
78getMem(PacketPtr pkt, MemT &mem, trace::InstRecord *traceData)
79{
80 mem = pkt->get<MemT>(Order);
81 if (traceData)
82 traceData->setData(mem);
83}
84
85template <class MemT>
86void
87getMemLE(PacketPtr pkt, MemT &mem, trace::InstRecord *traceData)
88{
89 getMem<ByteOrder::little>(pkt, mem, traceData);
90}
91
92template <class MemT>
93void
94getMemBE(PacketPtr pkt, MemT &mem, trace::InstRecord *traceData)
95{
96 getMem<ByteOrder::big>(pkt, mem, traceData);
97}
98
100template <class XC>
101Fault
102readMemAtomic(XC *xc, Addr addr, uint8_t *mem,
103 std::size_t size, Request::Flags flags,
104 const std::vector<bool> &byte_enable)
105{
106 return xc->readMem(addr, mem, size, flags, byte_enable);
107}
108
110template <ByteOrder Order, class XC, class MemT>
111Fault
112readMemAtomic(XC *xc, trace::InstRecord *traceData, Addr addr, MemT &mem,
114{
115 memset(&mem, 0, sizeof(mem));
116 static const std::vector<bool> byte_enable(sizeof(MemT), true);
117 Fault fault = readMemAtomic(xc, addr, (uint8_t*)&mem,
118 sizeof(MemT), flags, byte_enable);
119 if (fault == NoFault) {
120 mem = gtoh(mem, Order);
121 if (traceData)
122 traceData->setData(mem);
123 }
124 return fault;
125}
126
127template <class XC, class MemT>
128Fault
129readMemAtomicLE(XC *xc, trace::InstRecord *traceData, Addr addr, MemT &mem,
131{
132 return readMemAtomic<ByteOrder::little>(
133 xc, traceData, addr, mem, flags);
134}
135
136template <class XC, class MemT>
137Fault
138readMemAtomicBE(XC *xc, trace::InstRecord *traceData, Addr addr, MemT &mem,
140{
141 return readMemAtomic<ByteOrder::big>(xc, traceData, addr, mem, flags);
142}
143
145template <class XC>
146Fault
147writeMemTiming(XC *xc, uint8_t *mem, Addr addr,
148 std::size_t size, Request::Flags flags, uint64_t *res,
149 const std::vector<bool> &byte_enable)
150{
151 return xc->writeMem(mem, size, addr, flags, res, byte_enable);
152}
153
154template <ByteOrder Order, class XC, class MemT>
155Fault
156writeMemTiming(XC *xc, trace::InstRecord *traceData, MemT mem, Addr addr,
157 Request::Flags flags, uint64_t *res)
158{
159 if (traceData) {
160 traceData->setData(mem);
161 }
162 mem = htog(mem, Order);
163 static const std::vector<bool> byte_enable(sizeof(MemT), true);
164 return writeMemTiming(xc, (uint8_t*)&mem, addr,
165 sizeof(MemT), flags, res, byte_enable);
166}
167
168template <class XC, class MemT>
169Fault
171 Request::Flags flags, uint64_t *res)
172{
173 return writeMemTiming<ByteOrder::little>(
174 xc, traceData, mem, addr, flags, res);
175}
176
177template <class XC, class MemT>
178Fault
180 Request::Flags flags, uint64_t *res)
181{
182 return writeMemTiming<ByteOrder::big>(
183 xc, traceData, mem, addr, flags, res);
184}
185
187template <class XC>
188Fault
189writeMemAtomic(XC *xc, uint8_t *mem, Addr addr,
190 std::size_t size, Request::Flags flags,
191 uint64_t *res, const std::vector<bool> &byte_enable)
192{
193 return xc->writeMem(mem, size, addr, flags, res, byte_enable);
194}
195
196template <ByteOrder Order, class XC, class MemT>
197Fault
198writeMemAtomic(XC *xc, trace::InstRecord *traceData, const MemT &mem,
199 Addr addr, Request::Flags flags, uint64_t *res)
200{
201 if (traceData) {
202 traceData->setData(mem);
203 }
204 MemT host_mem = htog(mem, Order);
205 static const std::vector<bool> byte_enable(sizeof(MemT), true);
206 Fault fault = writeMemAtomic(xc, (uint8_t*)&host_mem,
207 addr, sizeof(MemT), flags, res, byte_enable);
208 if (fault == NoFault && res != NULL) {
210 *(MemT *)res = gtoh(*(MemT *)res, Order);
211 else
212 *res = gtoh(*res, Order);
213 }
214 return fault;
215}
216
217template <class XC, class MemT>
218Fault
219writeMemAtomicLE(XC *xc, trace::InstRecord *traceData, const MemT &mem,
220 Addr addr, Request::Flags flags, uint64_t *res)
221{
222 return writeMemAtomic<ByteOrder::little>(
223 xc, traceData, mem, addr, flags, res);
224}
225
226template <class XC, class MemT>
227Fault
228writeMemAtomicBE(XC *xc, trace::InstRecord *traceData, const MemT &mem,
229 Addr addr, Request::Flags flags, uint64_t *res)
230{
231 return writeMemAtomic<ByteOrder::big>(
232 xc, traceData, mem, addr, flags, res);
233}
234
236template <ByteOrder Order, class XC, class MemT>
237Fault
238amoMemAtomic(XC *xc, trace::InstRecord *traceData, MemT &mem, Addr addr,
240{
241 assert(_amo_op);
242
243 // mem will hold the previous value at addr after the AMO completes
244 memset(&mem, 0, sizeof(mem));
245
246 AtomicOpFunctorPtr amo_op = AtomicOpFunctorPtr(_amo_op);
247 Fault fault = xc->amoMem(addr, (uint8_t *)&mem, sizeof(MemT), flags,
248 std::move(amo_op));
249
250 if (fault == NoFault) {
251 mem = gtoh(mem, Order);
252 if (traceData)
253 traceData->setData(mem);
254 }
255 return fault;
256}
257
258template <class XC, class MemT>
259Fault
260amoMemAtomicLE(XC *xc, trace::InstRecord *traceData, MemT &mem, Addr addr,
262{
263 return amoMemAtomic<ByteOrder::little>(
264 xc, traceData, mem, addr, flags, _amo_op);
265}
266
267template <class XC, class MemT>
268Fault
269amoMemAtomicBE(XC *xc, trace::InstRecord *traceData, MemT &mem, Addr addr,
271{
272 return amoMemAtomic<ByteOrder::big>(
273 xc, traceData, mem, addr, flags, _amo_op);
274}
275
277template <class XC, class MemT>
278Fault
279initiateMemAMO(XC *xc, trace::InstRecord *traceData, Addr addr, MemT& mem,
281{
282 assert(_amo_op);
283 AtomicOpFunctorPtr amo_op = AtomicOpFunctorPtr(_amo_op);
284 return xc->initiateMemAMO(addr, sizeof(MemT), flags, std::move(amo_op));
285}
286
287} // namespace gem5
288
289#endif
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
T get(ByteOrder endian) const
Get the data in the packet byte swapped from the specified endianness.
@ MEM_SWAP
This request is for a memory swap.
Definition request.hh:158
void setData(std::array< T, N > d)
STL vector class.
Definition stl.hh:37
std::unique_ptr< AtomicOpFunctor > AtomicOpFunctorPtr
Definition amo.hh:269
uint8_t flags
Definition helpers.cc:66
Bitfield< 3 > addr
Definition types.hh:84
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Fault readMemAtomicBE(XC *xc, trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
std::shared_ptr< FaultBase > Fault
Definition types.hh:249
void getMemLE(PacketPtr pkt, MemT &mem, trace::InstRecord *traceData)
Definition memhelpers.hh:87
Fault initiateMemRead(XC *xc, Addr addr, std::size_t size, Request::Flags flags, const std::vector< bool > &byte_enable)
Definition memhelpers.hh:55
Fault amoMemAtomicBE(XC *xc, trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
Fault writeMemTimingLE(XC *xc, trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
T gtoh(T value, ByteOrder guest_byte_order)
Definition byteswap.hh:194
Fault writeMemAtomicBE(XC *xc, trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
void getMemBE(PacketPtr pkt, MemT &mem, trace::InstRecord *traceData)
Definition memhelpers.hh:94
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.
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.
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.
Fault readMemAtomicLE(XC *xc, trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
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.
Fault writeMemAtomicLE(XC *xc, trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
T htog(T value, ByteOrder guest_byte_order)
Definition byteswap.hh:187
Fault writeMemTimingBE(XC *xc, trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
void getMem(PacketPtr pkt, MemT &mem, trace::InstRecord *traceData)
Extract the data returned from a timing mode read.
Definition memhelpers.hh:78
Fault amoMemAtomicLE(XC *xc, trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
constexpr decltype(nullptr) NoFault
Definition types.hh:253
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.
Declaration of the Packet class.
Declaration of a request, the overall memory request consisting of the parts of the request that are ...
bool_vector8 mem[]
Definition reset_stim.h:43

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