memhelpers.hh revision 8737
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) { 678737Skoansin.tan@gmail.com mem = TheISA::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) { 958737Skoansin.tan@gmail.com *res = TheISA::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