Go to the documentation of this file.
41 #ifndef __ARCH_GENERIC_MEMHELPERS_HH__
42 #define __ARCH_GENERIC_MEMHELPERS_HH__
56 return xc->initiateMemRead(
addr, size, flags, byte_enable);
62 template <
class XC,
class MemT>
73 template <ByteOrder Order,
class MemT>
77 mem = pkt->
get<MemT>(Order);
86 getMem<ByteOrder::little>(pkt,
mem, traceData);
93 getMem<ByteOrder::big>(pkt,
mem, traceData);
103 return xc->readMem(
addr,
mem, size, flags, byte_enable);
107 template <ByteOrder Order,
class XC,
class MemT>
112 memset(&
mem, 0,
sizeof(
mem));
115 sizeof(MemT), flags, byte_enable);
124 template <
class XC,
class MemT>
129 return readMemAtomic<ByteOrder::little>(
130 xc, traceData,
addr,
mem, flags);
133 template <
class XC,
class MemT>
138 return readMemAtomic<ByteOrder::big>(xc, traceData,
addr,
mem, flags);
148 return xc->writeMem(
mem, size,
addr, flags, res, byte_enable);
151 template <ByteOrder Order,
class XC,
class MemT>
162 sizeof(MemT), flags, res, byte_enable);
165 template <
class XC,
class MemT>
170 return writeMemTiming<ByteOrder::little>(
171 xc, traceData,
mem,
addr, flags, res);
174 template <
class XC,
class MemT>
179 return writeMemTiming<ByteOrder::big>(
180 xc, traceData,
mem,
addr, flags, res);
190 return xc->writeMem(
mem, size,
addr, flags, res, byte_enable);
193 template <ByteOrder Order,
class XC,
class MemT>
201 MemT host_mem =
htog(
mem, Order);
204 addr,
sizeof(MemT), flags, res, byte_enable);
205 if (fault ==
NoFault && res != NULL) {
207 *(MemT *)res =
gtoh(*(MemT *)res, Order);
209 *res =
gtoh(*res, Order);
214 template <
class XC,
class MemT>
219 return writeMemAtomic<ByteOrder::little>(
220 xc, traceData,
mem,
addr, flags, res);
223 template <
class XC,
class MemT>
228 return writeMemAtomic<ByteOrder::big>(
229 xc, traceData,
mem,
addr, flags, res);
233 template <ByteOrder Order,
class XC,
class MemT>
241 memset(&
mem, 0,
sizeof(
mem));
244 Fault fault = xc->amoMem(
addr, (uint8_t *)&
mem,
sizeof(MemT), flags,
255 template <
class XC,
class MemT>
260 return amoMemAtomic<ByteOrder::little>(
261 xc, traceData,
mem,
addr, flags, _amo_op);
264 template <
class XC,
class MemT>
269 return amoMemAtomic<ByteOrder::big>(
270 xc, traceData,
mem,
addr, flags, _amo_op);
274 template <
class XC,
class MemT>
281 return xc->initiateMemAMO(
addr,
sizeof(MemT), flags, std::move(amo_op));
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.
void getMem(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
Extract the data returned from a timing mode read.
std::unique_ptr< AtomicOpFunctor > AtomicOpFunctorPtr
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 writeMemAtomicBE(XC *xc, Trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
Fault amoMemAtomicLE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
std::shared_ptr< FaultBase > Fault
T htog(T value, ByteOrder guest_byte_order)
Fault amoMemAtomicBE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
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 writeMemTimingLE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
void setData(std::array< T, N > d)
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.
constexpr decltype(nullptr) NoFault
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Fault readMemAtomicBE(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
T get(ByteOrder endian) const
Get the data in the packet byte swapped from the specified endianness.
Fault initiateMemRead(XC *xc, Addr addr, std::size_t size, Request::Flags flags, const std::vector< bool > &byte_enable)
void getMemLE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
@ MEM_SWAP
This request is for a memory swap.
void getMemBE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Fault writeMemTimingBE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
T gtoh(T value, ByteOrder guest_byte_order)
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 writeMemAtomicLE(XC *xc, Trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
Generated on Tue Mar 23 2021 19:41:23 for gem5 by doxygen 1.8.17