memhelpers.hh revision 8444
18442Sgblack@eecs.umich.edu/*
28442Sgblack@eecs.umich.edu * Copyright (c) 2011 Google
38442Sgblack@eecs.umich.edu * All rights reserved.
48442Sgblack@eecs.umich.edu *
58442Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
68442Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
78442Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
88442Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
98442Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
108442Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
118442Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
128442Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
138442Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
148442Sgblack@eecs.umich.edu * this software without specific prior written permission.
158442Sgblack@eecs.umich.edu *
168442Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178442Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188442Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198442Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208442Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218442Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228442Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238442Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248442Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258442Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268442Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278442Sgblack@eecs.umich.edu *
288442Sgblack@eecs.umich.edu * Authors: Gabe Black
298442Sgblack@eecs.umich.edu */
308442Sgblack@eecs.umich.edu
318442Sgblack@eecs.umich.edu#ifndef __ARCH_GENERIC_MEMHELPERS_HH__
328442Sgblack@eecs.umich.edu#define __ARCH_GENERIC_MEMHELPERS_HH__
338442Sgblack@eecs.umich.edu
348442Sgblack@eecs.umich.edu#include "base/types.hh"
358442Sgblack@eecs.umich.edu#include "sim/byteswap.hh"
368442Sgblack@eecs.umich.edu#include "sim/fault_fwd.hh"
378442Sgblack@eecs.umich.edu#include "sim/insttracer.hh"
388442Sgblack@eecs.umich.edu
398442Sgblack@eecs.umich.edu/// Read from memory in timing mode.
408442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
418442Sgblack@eecs.umich.eduFault
428442Sgblack@eecs.umich.edureadMemTiming(XC *xc, Trace::InstRecord *traceData, Addr addr,
438442Sgblack@eecs.umich.edu        MemT &mem, unsigned flags)
448442Sgblack@eecs.umich.edu{
458444Sgblack@eecs.umich.edu    return xc->readMem(addr, (uint8_t *)&mem, sizeof(MemT), flags);
468442Sgblack@eecs.umich.edu}
478442Sgblack@eecs.umich.edu
488442Sgblack@eecs.umich.edu/// Extract the data returned from a timing mode read.
498442Sgblack@eecs.umich.edutemplate <class MemT>
508442Sgblack@eecs.umich.eduvoid
518442Sgblack@eecs.umich.edugetMem(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
528442Sgblack@eecs.umich.edu{
538442Sgblack@eecs.umich.edu    mem = pkt->get<MemT>();
548442Sgblack@eecs.umich.edu    if (traceData)
558442Sgblack@eecs.umich.edu        traceData->setData(mem);
568442Sgblack@eecs.umich.edu}
578442Sgblack@eecs.umich.edu
588442Sgblack@eecs.umich.edu/// Read from memory in atomic mode.
598442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
608442Sgblack@eecs.umich.eduFault
618442Sgblack@eecs.umich.edureadMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem,
628442Sgblack@eecs.umich.edu        unsigned flags)
638442Sgblack@eecs.umich.edu{
648442Sgblack@eecs.umich.edu    memset(&mem, 0, sizeof(mem));
658442Sgblack@eecs.umich.edu    Fault fault = readMemTiming(xc, traceData, addr, mem, flags);
668442Sgblack@eecs.umich.edu    if (fault == NoFault) {
678442Sgblack@eecs.umich.edu        mem = gtoh(mem);
688442Sgblack@eecs.umich.edu        if (traceData)
698442Sgblack@eecs.umich.edu            traceData->setData(mem);
708442Sgblack@eecs.umich.edu    }
718442Sgblack@eecs.umich.edu    return fault;
728442Sgblack@eecs.umich.edu}
738442Sgblack@eecs.umich.edu
748442Sgblack@eecs.umich.edu/// Write to memory in timing mode.
758442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
768442Sgblack@eecs.umich.eduFault
778442Sgblack@eecs.umich.eduwriteMemTiming(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr,
788442Sgblack@eecs.umich.edu        unsigned flags, uint64_t *res)
798442Sgblack@eecs.umich.edu{
808442Sgblack@eecs.umich.edu    if (traceData) {
818442Sgblack@eecs.umich.edu        traceData->setData(mem);
828442Sgblack@eecs.umich.edu    }
838442Sgblack@eecs.umich.edu    mem = TheISA::htog(mem);
848444Sgblack@eecs.umich.edu    return xc->writeMem((uint8_t *)&mem, sizeof(MemT), addr, flags, res);
858442Sgblack@eecs.umich.edu}
868442Sgblack@eecs.umich.edu
878442Sgblack@eecs.umich.edu/// Write to memory in atomic mode.
888442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
898442Sgblack@eecs.umich.eduFault
908442Sgblack@eecs.umich.eduwriteMemAtomic(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
918442Sgblack@eecs.umich.edu        Addr addr, unsigned flags, uint64_t *res)
928442Sgblack@eecs.umich.edu{
938442Sgblack@eecs.umich.edu    Fault fault = writeMemTiming(xc, traceData, mem, addr, flags, res);
948442Sgblack@eecs.umich.edu    if (fault == NoFault && res != NULL) {
958442Sgblack@eecs.umich.edu        *res = gtoh((MemT)*res);
968442Sgblack@eecs.umich.edu    }
978442Sgblack@eecs.umich.edu    return fault;
988442Sgblack@eecs.umich.edu}
998442Sgblack@eecs.umich.edu
1008442Sgblack@eecs.umich.edu#endif
101