memhelpers.hh revision 10474:799c8ee4ecba
15081Sgblack@eecs.umich.edu/* 25081Sgblack@eecs.umich.edu * Copyright (c) 2011 Google 35081Sgblack@eecs.umich.edu * All rights reserved. 47087Snate@binkert.org * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 125081Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137087Snate@binkert.org * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215081Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227087Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235081Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245081Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255081Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265081Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275081Sgblack@eecs.umich.edu * 285081Sgblack@eecs.umich.edu * Authors: Gabe Black 295081Sgblack@eecs.umich.edu */ 305081Sgblack@eecs.umich.edu 315081Sgblack@eecs.umich.edu#ifndef __ARCH_X86_MEMHELPERS_HH__ 325081Sgblack@eecs.umich.edu#define __ARCH_X86_MEMHELPERS_HH__ 335081Sgblack@eecs.umich.edu 345081Sgblack@eecs.umich.edu#include "base/types.hh" 355081Sgblack@eecs.umich.edu#include "sim/byteswap.hh" 365081Sgblack@eecs.umich.edu#include "sim/insttracer.hh" 375081Sgblack@eecs.umich.edu 385907Sgblack@eecs.umich.edunamespace X86ISA 395907Sgblack@eecs.umich.edu{ 405907Sgblack@eecs.umich.edu 415907Sgblack@eecs.umich.edutemplate <class XC> 426062Sgblack@eecs.umich.eduFault 435907Sgblack@eecs.umich.edureadMemTiming(XC *xc, Trace::InstRecord *traceData, Addr addr, 445907Sgblack@eecs.umich.edu uint64_t &mem, unsigned dataSize, unsigned flags) 455907Sgblack@eecs.umich.edu{ 4611320Ssteve.reinhardt@amd.com return xc->readMem(addr, (uint8_t *)&mem, dataSize, flags); 475907Sgblack@eecs.umich.edu} 485907Sgblack@eecs.umich.edu 496062Sgblack@eecs.umich.edustatic inline uint64_t 506344Sgblack@eecs.umich.edugetMem(PacketPtr pkt, unsigned dataSize, Trace::InstRecord *traceData) 515907Sgblack@eecs.umich.edu{ 525907Sgblack@eecs.umich.edu uint64_t mem; 535907Sgblack@eecs.umich.edu switch (dataSize) { 545907Sgblack@eecs.umich.edu case 1: 555907Sgblack@eecs.umich.edu mem = pkt->get<uint8_t>(); 565907Sgblack@eecs.umich.edu break; 575907Sgblack@eecs.umich.edu case 2: 585907Sgblack@eecs.umich.edu mem = pkt->get<uint16_t>(); 595907Sgblack@eecs.umich.edu break; 605907Sgblack@eecs.umich.edu case 4: 615907Sgblack@eecs.umich.edu mem = pkt->get<uint32_t>(); 626222Sgblack@eecs.umich.edu break; 636222Sgblack@eecs.umich.edu case 8: 646222Sgblack@eecs.umich.edu mem = pkt->get<uint64_t>(); 656222Sgblack@eecs.umich.edu break; 665907Sgblack@eecs.umich.edu default: 675907Sgblack@eecs.umich.edu panic("Unhandled size in getMem.\n"); 685907Sgblack@eecs.umich.edu } 695907Sgblack@eecs.umich.edu if (traceData) 705907Sgblack@eecs.umich.edu traceData->setData(mem); 715907Sgblack@eecs.umich.edu return mem; 725907Sgblack@eecs.umich.edu} 735907Sgblack@eecs.umich.edu 745907Sgblack@eecs.umich.edutemplate <class XC> 756222Sgblack@eecs.umich.eduFault 766222Sgblack@eecs.umich.edureadMemAtomic(XC *xc, Trace::InstRecord *traceData, Addr addr, uint64_t &mem, 776222Sgblack@eecs.umich.edu unsigned dataSize, unsigned flags) 786222Sgblack@eecs.umich.edu{ 795907Sgblack@eecs.umich.edu memset(&mem, 0, sizeof(mem)); 805907Sgblack@eecs.umich.edu Fault fault = readMemTiming(xc, traceData, addr, mem, dataSize, flags); 815907Sgblack@eecs.umich.edu if (fault == NoFault) { 827932Stharris@microsoft.com // If LE to LE, this is a nop, if LE to BE, the actual data ends up 837932Stharris@microsoft.com // in the right place because the LSBs where at the low addresses on 845907Sgblack@eecs.umich.edu // access. This doesn't work for BE guests. 855907Sgblack@eecs.umich.edu mem = gtoh(mem); 865907Sgblack@eecs.umich.edu if (traceData) 875907Sgblack@eecs.umich.edu traceData->setData(mem); 885907Sgblack@eecs.umich.edu } 895907Sgblack@eecs.umich.edu return fault; 905907Sgblack@eecs.umich.edu} 915907Sgblack@eecs.umich.edu 925907Sgblack@eecs.umich.edutemplate <class XC> 935907Sgblack@eecs.umich.eduFault 945907Sgblack@eecs.umich.eduwriteMemTiming(XC *xc, Trace::InstRecord *traceData, uint64_t mem, 956062Sgblack@eecs.umich.edu unsigned dataSize, Addr addr, unsigned flags, uint64_t *res) 965907Sgblack@eecs.umich.edu{ 975907Sgblack@eecs.umich.edu if (traceData) { 985907Sgblack@eecs.umich.edu traceData->setData(mem); 9911320Ssteve.reinhardt@amd.com } 1005907Sgblack@eecs.umich.edu mem = TheISA::htog(mem); 1015907Sgblack@eecs.umich.edu return xc->writeMem((uint8_t *)&mem, dataSize, addr, flags, res); 1026062Sgblack@eecs.umich.edu} 1036344Sgblack@eecs.umich.edu 1045907Sgblack@eecs.umich.edutemplate <class XC> 1055907Sgblack@eecs.umich.eduFault 1065907Sgblack@eecs.umich.eduwriteMemAtomic(XC *xc, Trace::InstRecord *traceData, uint64_t mem, 1075907Sgblack@eecs.umich.edu unsigned dataSize, Addr addr, unsigned flags, uint64_t *res) 1085907Sgblack@eecs.umich.edu{ 1095907Sgblack@eecs.umich.edu Fault fault = writeMemTiming(xc, traceData, mem, dataSize, addr, flags, 1105907Sgblack@eecs.umich.edu res); 1115907Sgblack@eecs.umich.edu if (fault == NoFault && res != NULL) { 1125907Sgblack@eecs.umich.edu *res = gtoh(*res); 1135907Sgblack@eecs.umich.edu } 1145907Sgblack@eecs.umich.edu return fault; 1156222Sgblack@eecs.umich.edu} 1166222Sgblack@eecs.umich.edu 1176222Sgblack@eecs.umich.edu} 1186222Sgblack@eecs.umich.edu 1195907Sgblack@eecs.umich.edu#endif 1205907Sgblack@eecs.umich.edu