43 #ifndef __ARCH_GENERIC_MEMHELPERS_HH__ 44 #define __ARCH_GENERIC_MEMHELPERS_HH__ 46 #include "arch/isa_traits.hh" 56 template <
class XC,
class MemT>
61 return xc->initiateMemRead(addr,
sizeof(MemT), flags);
65 template <ByteOrder Order,
class MemT>
69 mem = pkt->
get<MemT>(Order);
78 getMem<LittleEndianByteOrder>(pkt,
mem, traceData);
85 getMem<BigEndianByteOrder>(pkt,
mem, traceData);
89 template <ByteOrder Order,
class XC,
class MemT>
94 memset(&mem, 0,
sizeof(mem));
95 Fault fault = xc->readMem(addr, (uint8_t *)&mem,
sizeof(MemT), flags);
97 mem =
gtoh(mem, Order);
104 template <
class XC,
class MemT>
109 return readMemAtomic<LittleEndianByteOrder>(
110 xc, traceData,
addr,
mem, flags);
113 template <
class XC,
class MemT>
118 return readMemAtomic<BigEndianByteOrder>(xc, traceData,
addr,
mem, flags);
122 template <ByteOrder Order,
class XC,
class MemT>
130 mem =
htog(mem, Order);
131 return xc->writeMem((uint8_t *)&mem,
sizeof(MemT), addr, flags, res);
134 template <
class XC,
class MemT>
139 return writeMemTiming<LittleEndianByteOrder>(
140 xc, traceData,
mem,
addr, flags, res);
143 template <
class XC,
class MemT>
148 return writeMemTiming<BigEndianByteOrder>(
149 xc, traceData,
mem,
addr, flags, res);
153 template <ByteOrder Order,
class XC,
class MemT>
161 MemT host_mem =
htog(mem, Order);
163 xc->writeMem((uint8_t *)&host_mem,
sizeof(MemT), addr, flags, res);
164 if (fault ==
NoFault && res != NULL) {
166 *(MemT *)res =
gtoh(*(MemT *)res, Order);
168 *res =
gtoh(*res, Order);
173 template <
class XC,
class MemT>
178 return writeMemAtomic<LittleEndianByteOrder>(
179 xc, traceData,
mem,
addr, flags, res);
182 template <
class XC,
class MemT>
187 return writeMemAtomic<BigEndianByteOrder>(
188 xc, traceData,
mem,
addr, flags, res);
192 template <ByteOrder Order,
class XC,
class MemT>
200 memset(&mem, 0,
sizeof(mem));
203 Fault fault = xc->amoMem(addr, (uint8_t *)&mem,
sizeof(MemT), flags,
207 mem =
gtoh(mem, Order);
214 template <
class XC,
class MemT>
219 return amoMemAtomic<LittleEndianByteOrder>(
220 xc, traceData,
mem,
addr, flags, _amo_op);
223 template <
class XC,
class MemT>
228 return amoMemAtomic<BigEndianByteOrder>(
229 xc, traceData,
mem,
addr, flags, _amo_op);
233 template <
class XC,
class MemT>
240 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)
This request is for a memory swap.
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)
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