2a3
> * Copyright (c) 2015 Advanced Micro Devices, Inc.
33a35,36
> #include <array>
>
50,51c53,55
< static inline uint64_t
< getMem(PacketPtr pkt, unsigned dataSize, Trace::InstRecord *traceData)
---
> static void
> getMem(PacketPtr pkt, uint64_t &mem, unsigned dataSize,
> Trace::InstRecord *traceData)
53d56
< uint64_t mem;
72d74
< return mem;
74a77,99
>
> template <size_t N>
> void
> getMem(PacketPtr pkt, std::array<uint64_t, N> &mem, unsigned dataSize,
> Trace::InstRecord *traceData)
> {
> assert(dataSize >= 8);
> assert((dataSize % 8) == 0);
>
> int num_words = dataSize / 8;
> assert(num_words <= N);
>
> auto pkt_data = pkt->getConstPtr<const uint64_t>();
> for (int i = 0; i < num_words; ++i)
> mem[i] = gtoh(pkt_data[i]);
>
> // traceData record only has space for 64 bits, so we just record
> // the first qword
> if (traceData)
> traceData->setData(mem[0]);
> }
>
>
92a118,141
> template <class XC, size_t N>
> Fault
> readMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr,
> std::array<uint64_t, N> &mem, unsigned dataSize,
> unsigned flags)
> {
> assert(dataSize >= 8);
> assert((dataSize % 8) == 0);
>
> Fault fault = xc->readMem(addr, (uint8_t *)&mem, dataSize, flags);
>
> if (fault == NoFault) {
> int num_words = dataSize / 8;
> assert(num_words <= N);
>
> for (int i = 0; i < num_words; ++i)
> mem[i] = gtoh(mem[i]);
>
> if (traceData)
> traceData->setData(mem[0]);
> }
> return fault;
> }
>
104a154,175
> template <class XC, size_t N>
> Fault
> writeMemTiming(XC *xc, Trace::InstRecord *traceData,
> std::array<uint64_t, N> &mem, unsigned dataSize,
> Addr addr, unsigned flags, uint64_t *res)
> {
> assert(dataSize >= 8);
> assert((dataSize % 8) == 0);
>
> if (traceData) {
> traceData->setData(mem[0]);
> }
>
> int num_words = dataSize / 8;
> assert(num_words <= N);
>
> for (int i = 0; i < num_words; ++i)
> mem[i] = htog(mem[i]);
>
> return xc->writeMem((uint8_t *)&mem, dataSize, addr, flags, res);
> }
>
121a193,215
> template <class XC, size_t N>
> Fault
> writeMemAtomic(XC *xc, Trace::InstRecord *traceData,
> std::array<uint64_t, N> &mem, unsigned dataSize,
> Addr addr, unsigned flags, uint64_t *res)
> {
> if (traceData) {
> traceData->setData(mem[0]);
> }
>
> int num_words = dataSize / 8;
> assert(num_words <= N);
>
> for (int i = 0; i < num_words; ++i)
> mem[i] = htog(mem[i]);
>
> Fault fault = xc->writeMem((uint8_t *)&mem, dataSize, addr, flags, res);
>
> if (fault == NoFault && res != NULL) {
> *res = gtoh(*res);
> }
>
> return fault;
123a218,219
> }
>