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