memhelpers.hh revision 11608
18442Sgblack@eecs.umich.edu/*
210026SAli.Saidi@ARM.com * Copyright (c) 2013 ARM Limited
310026SAli.Saidi@ARM.com * All rights reserved
410026SAli.Saidi@ARM.com *
510026SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall
610026SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual
710026SAli.Saidi@ARM.com * property including but not limited to intellectual property relating
810026SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software
910026SAli.Saidi@ARM.com * licensed hereunder.  You may use the software subject to the license
1010026SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated
1110026SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software,
1210026SAli.Saidi@ARM.com * modified or unmodified, in source code or in binary form.
1310026SAli.Saidi@ARM.com *
148442Sgblack@eecs.umich.edu * Copyright (c) 2011 Google
158442Sgblack@eecs.umich.edu * All rights reserved.
168442Sgblack@eecs.umich.edu *
178442Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
188442Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
198442Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
208442Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
218442Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
228442Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
238442Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
248442Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
258442Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
268442Sgblack@eecs.umich.edu * this software without specific prior written permission.
278442Sgblack@eecs.umich.edu *
288442Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
298442Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
308442Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
318442Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
328442Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
338442Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
348442Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
358442Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
368442Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
378442Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
388442Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
398442Sgblack@eecs.umich.edu *
408442Sgblack@eecs.umich.edu * Authors: Gabe Black
418442Sgblack@eecs.umich.edu */
428442Sgblack@eecs.umich.edu
438442Sgblack@eecs.umich.edu#ifndef __ARCH_GENERIC_MEMHELPERS_HH__
448442Sgblack@eecs.umich.edu#define __ARCH_GENERIC_MEMHELPERS_HH__
458442Sgblack@eecs.umich.edu
468442Sgblack@eecs.umich.edu#include "base/types.hh"
4710026SAli.Saidi@ARM.com#include "mem/request.hh"
488442Sgblack@eecs.umich.edu#include "sim/byteswap.hh"
498442Sgblack@eecs.umich.edu#include "sim/insttracer.hh"
508442Sgblack@eecs.umich.edu
5111303Ssteve.reinhardt@amd.com/// Initiate a read from memory in timing mode.  Note that the 'mem'
5211303Ssteve.reinhardt@amd.com/// parameter is unused; only the type of that parameter is used
5311303Ssteve.reinhardt@amd.com/// to determine the size of the access.
548442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
558442Sgblack@eecs.umich.eduFault
5611303Ssteve.reinhardt@amd.cominitiateMemRead(XC *xc, Trace::InstRecord *traceData, Addr addr,
5711608Snikos.nikoleris@arm.com                MemT &mem, Request::Flags flags)
588442Sgblack@eecs.umich.edu{
5911303Ssteve.reinhardt@amd.com    return xc->initiateMemRead(addr, sizeof(MemT), flags);
608442Sgblack@eecs.umich.edu}
618442Sgblack@eecs.umich.edu
628442Sgblack@eecs.umich.edu/// Extract the data returned from a timing mode read.
638442Sgblack@eecs.umich.edutemplate <class MemT>
648442Sgblack@eecs.umich.eduvoid
658442Sgblack@eecs.umich.edugetMem(PacketPtr pkt, MemT &mem, Trace::InstRecord *traceData)
668442Sgblack@eecs.umich.edu{
678442Sgblack@eecs.umich.edu    mem = pkt->get<MemT>();
688442Sgblack@eecs.umich.edu    if (traceData)
698442Sgblack@eecs.umich.edu        traceData->setData(mem);
708442Sgblack@eecs.umich.edu}
718442Sgblack@eecs.umich.edu
728442Sgblack@eecs.umich.edu/// Read from memory in atomic mode.
738442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
748442Sgblack@eecs.umich.eduFault
758442Sgblack@eecs.umich.edureadMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr, MemT &mem,
7611608Snikos.nikoleris@arm.com              Request::Flags flags)
778442Sgblack@eecs.umich.edu{
788442Sgblack@eecs.umich.edu    memset(&mem, 0, sizeof(mem));
7911301Ssteve.reinhardt@amd.com    Fault fault = xc->readMem(addr, (uint8_t *)&mem, sizeof(MemT), flags);
808442Sgblack@eecs.umich.edu    if (fault == NoFault) {
818737Skoansin.tan@gmail.com        mem = TheISA::gtoh(mem);
828442Sgblack@eecs.umich.edu        if (traceData)
838442Sgblack@eecs.umich.edu            traceData->setData(mem);
848442Sgblack@eecs.umich.edu    }
858442Sgblack@eecs.umich.edu    return fault;
868442Sgblack@eecs.umich.edu}
878442Sgblack@eecs.umich.edu
888442Sgblack@eecs.umich.edu/// Write to memory in timing mode.
898442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
908442Sgblack@eecs.umich.eduFault
918442Sgblack@eecs.umich.eduwriteMemTiming(XC *xc, Trace::InstRecord *traceData, MemT mem, Addr addr,
9211608Snikos.nikoleris@arm.com               Request::Flags flags, uint64_t *res)
938442Sgblack@eecs.umich.edu{
948442Sgblack@eecs.umich.edu    if (traceData) {
958442Sgblack@eecs.umich.edu        traceData->setData(mem);
968442Sgblack@eecs.umich.edu    }
978442Sgblack@eecs.umich.edu    mem = TheISA::htog(mem);
988444Sgblack@eecs.umich.edu    return xc->writeMem((uint8_t *)&mem, sizeof(MemT), addr, flags, res);
998442Sgblack@eecs.umich.edu}
1008442Sgblack@eecs.umich.edu
1018442Sgblack@eecs.umich.edu/// Write to memory in atomic mode.
1028442Sgblack@eecs.umich.edutemplate <class XC, class MemT>
1038442Sgblack@eecs.umich.eduFault
1048442Sgblack@eecs.umich.eduwriteMemAtomic(XC *xc, Trace::InstRecord *traceData, const MemT &mem,
10511608Snikos.nikoleris@arm.com               Addr addr, Request::Flags flags, uint64_t *res)
1068442Sgblack@eecs.umich.edu{
10711301Ssteve.reinhardt@amd.com    if (traceData) {
10811301Ssteve.reinhardt@amd.com        traceData->setData(mem);
10911301Ssteve.reinhardt@amd.com    }
11011301Ssteve.reinhardt@amd.com    MemT host_mem = TheISA::htog(mem);
11111301Ssteve.reinhardt@amd.com    Fault fault =
11211301Ssteve.reinhardt@amd.com          xc->writeMem((uint8_t *)&host_mem, sizeof(MemT), addr, flags, res);
1138442Sgblack@eecs.umich.edu    if (fault == NoFault && res != NULL) {
11410026SAli.Saidi@ARM.com        if (flags & Request::MEM_SWAP || flags & Request::MEM_SWAP_COND)
11510026SAli.Saidi@ARM.com            *res = TheISA::gtoh((MemT)*res);
11610026SAli.Saidi@ARM.com        else
11710026SAli.Saidi@ARM.com            *res = TheISA::gtoh(*res);
1188442Sgblack@eecs.umich.edu    }
1198442Sgblack@eecs.umich.edu    return fault;
1208442Sgblack@eecs.umich.edu}
1218442Sgblack@eecs.umich.edu
1228442Sgblack@eecs.umich.edu#endif
123