41 #ifndef __ARCH_GENERIC_MEMHELPERS_HH__ 42 #define __ARCH_GENERIC_MEMHELPERS_HH__ 44 #include "arch/isa_traits.hh" 54 template <
class XC,
class MemT>
59 return xc->initiateMemRead(addr,
sizeof(MemT), flags);
63 template <ByteOrder Order,
class MemT>
67 mem = pkt->
get<MemT>(Order);
76 getMem<LittleEndianByteOrder>(pkt,
mem, traceData);
83 getMem<BigEndianByteOrder>(pkt,
mem, traceData);
87 template <ByteOrder Order,
class XC,
class MemT>
92 memset(&mem, 0,
sizeof(mem));
93 Fault fault = xc->readMem(addr, (uint8_t *)&mem,
sizeof(MemT), flags);
95 mem =
gtoh(mem, Order);
102 template <
class XC,
class MemT>
107 return readMemAtomic<LittleEndianByteOrder>(
108 xc, traceData,
addr,
mem, flags);
111 template <
class XC,
class MemT>
116 return readMemAtomic<BigEndianByteOrder>(xc, traceData,
addr,
mem, flags);
120 template <ByteOrder Order,
class XC,
class MemT>
128 mem =
htog(mem, Order);
129 return xc->writeMem((uint8_t *)&mem,
sizeof(MemT), addr, flags, res);
132 template <
class XC,
class MemT>
137 return writeMemTiming<LittleEndianByteOrder>(
138 xc, traceData,
mem,
addr, flags, res);
141 template <
class XC,
class MemT>
146 return writeMemTiming<BigEndianByteOrder>(
147 xc, traceData,
mem,
addr, flags, res);
151 template <ByteOrder Order,
class XC,
class MemT>
159 MemT host_mem =
htog(mem, Order);
161 xc->writeMem((uint8_t *)&host_mem,
sizeof(MemT), addr, flags, res);
162 if (fault ==
NoFault && res != NULL) {
164 *(MemT *)res =
gtoh(*(MemT *)res, Order);
166 *res =
gtoh(*res, Order);
171 template <
class XC,
class MemT>
176 return writeMemAtomic<LittleEndianByteOrder>(
177 xc, traceData,
mem,
addr, flags, res);
180 template <
class XC,
class MemT>
185 return writeMemAtomic<BigEndianByteOrder>(
186 xc, traceData,
mem,
addr, flags, res);
190 template <ByteOrder Order,
class XC,
class MemT>
198 memset(&mem, 0,
sizeof(mem));
201 Fault fault = xc->amoMem(addr, (uint8_t *)&mem,
sizeof(MemT), flags,
205 mem =
gtoh(mem, Order);
212 template <
class XC,
class MemT>
217 return amoMemAtomic<LittleEndianByteOrder>(
218 xc, traceData,
mem,
addr, flags, _amo_op);
221 template <
class XC,
class MemT>
226 return amoMemAtomic<BigEndianByteOrder>(
227 xc, traceData,
mem,
addr, flags, _amo_op);
231 template <
class XC,
class MemT>
238 return xc->initiateMemAMO(addr,
sizeof(MemT), flags, std::move(amo_op));
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.
decltype(nullptr) constexpr NoFault
T gtoh(T value, ByteOrder guest_byte_order)
Fault readMemAtomicBE(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
Declaration of a request, the overall memory request consisting of the parts of the request that are ...
std::unique_ptr< AtomicOpFunctor > AtomicOpFunctorPtr
Fault initiateMemRead(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
Initiate a read from memory in timing mode.
void getMemBE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
Fault writeMemAtomic(XC *xc, Trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
Write to memory in atomic mode.
void getMem(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
Extract the data returned from a timing mode read.
void getMemLE(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
T htog(T value, ByteOrder guest_byte_order)
This request is for a memory swap.
Fault readMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem, Request::Flags flags)
Read from memory in atomic mode.
Fault writeMemAtomicBE(XC *xc, Trace::InstRecord *traceData, const MemT &mem, Addr addr, Request::Flags flags, uint64_t *res)
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,16,32,64}_t.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
void setData(std::array< T, N > d)
Declaration of the Packet class.
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 writeMemTiming(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
Write to memory in timing mode.
Fault writeMemTimingLE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
T get(ByteOrder endian) const
Get the data in the packet byte swapped from the specified endianness.
Fault amoMemAtomicLE(XC *xc, Trace::InstRecord *traceData, MemT &mem, Addr addr, Request::Flags flags, AtomicOpFunctor *_amo_op)
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)
Fault writeMemTimingBE(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr, Request::Flags flags, uint64_t *res)
std::shared_ptr< FaultBase > Fault