port_proxy.hh revision 8706
18706Sandreas.hansson@arm.com/*
28706Sandreas.hansson@arm.com * Copyright (c) 2011 ARM Limited
38706Sandreas.hansson@arm.com * All rights reserved
48706Sandreas.hansson@arm.com *
58706Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
68706Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
78706Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
88706Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
98706Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
108706Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
118706Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
128706Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
138706Sandreas.hansson@arm.com *
148706Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
158706Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
168706Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
178706Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
188706Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
198706Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
208706Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
218706Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
228706Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
238706Sandreas.hansson@arm.com * this software without specific prior written permission.
248706Sandreas.hansson@arm.com *
258706Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
268706Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
278706Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
288706Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
298706Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
308706Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
318706Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
328706Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
338706Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
348706Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
358706Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
368706Sandreas.hansson@arm.com *
378706Sandreas.hansson@arm.com * Authors: Andreas Hansson
388706Sandreas.hansson@arm.com */
398706Sandreas.hansson@arm.com
408706Sandreas.hansson@arm.com/**
418706Sandreas.hansson@arm.com * @file
428706Sandreas.hansson@arm.com * PortProxy Object Declaration.
438706Sandreas.hansson@arm.com *
448706Sandreas.hansson@arm.com * Port proxies are used when non structural entities need access to
458706Sandreas.hansson@arm.com * the memory system. Proxy objects replace the previous
468706Sandreas.hansson@arm.com * FunctionalPort, TranslatingPort and VirtualPort objects, which
478706Sandreas.hansson@arm.com * provided the same functionality as the proxies, but were instances
488706Sandreas.hansson@arm.com * of ports not corresponding to real structural ports of the
498706Sandreas.hansson@arm.com * simulated system. Via the port proxies all the accesses go through
508706Sandreas.hansson@arm.com * an actual port and thus are transparent to a potentially
518706Sandreas.hansson@arm.com * distributed memory and automatically adhere to the memory map of
528706Sandreas.hansson@arm.com * the system.
538706Sandreas.hansson@arm.com */
548706Sandreas.hansson@arm.com
558706Sandreas.hansson@arm.com#ifndef __MEM_PORT_PROXY_HH__
568706Sandreas.hansson@arm.com#define __MEM_PORT_PROXY_HH__
578706Sandreas.hansson@arm.com
588706Sandreas.hansson@arm.com#include "config/the_isa.hh"
598706Sandreas.hansson@arm.com#if THE_ISA != NO_ISA
608706Sandreas.hansson@arm.com    #include "arch/isa_traits.hh"
618706Sandreas.hansson@arm.com#endif
628706Sandreas.hansson@arm.com
638706Sandreas.hansson@arm.com#include "base/types.hh"
648706Sandreas.hansson@arm.com#include "mem/port.hh"
658706Sandreas.hansson@arm.com#include "sim/byteswap.hh"
668706Sandreas.hansson@arm.com
678706Sandreas.hansson@arm.com/**
688706Sandreas.hansson@arm.com * This object is a proxy for a structural port,
698706Sandreas.hansson@arm.com * to be used for debug accesses.
708706Sandreas.hansson@arm.com *
718706Sandreas.hansson@arm.com * This proxy object is used when non structural entities
728706Sandreas.hansson@arm.com * (e.g. thread contexts, object file loaders) need access to the
738706Sandreas.hansson@arm.com * memory system. It calls the corresponding functions on the underlying
748706Sandreas.hansson@arm.com * structural port, and provides templatized convenience access functions.
758706Sandreas.hansson@arm.com *
768706Sandreas.hansson@arm.com * The addresses are interpreted as physical addresses.
778706Sandreas.hansson@arm.com *
788706Sandreas.hansson@arm.com * @sa SETranslatingProxy
798706Sandreas.hansson@arm.com * @sa FSTranslatingProxy
808706Sandreas.hansson@arm.com */
818706Sandreas.hansson@arm.comclass PortProxy
828706Sandreas.hansson@arm.com{
838706Sandreas.hansson@arm.com  protected:
848706Sandreas.hansson@arm.com    Port &_port;
858706Sandreas.hansson@arm.com
868706Sandreas.hansson@arm.com  public:
878706Sandreas.hansson@arm.com    PortProxy(Port &port) : _port(port) { }
888706Sandreas.hansson@arm.com    virtual ~PortProxy() { }
898706Sandreas.hansson@arm.com
908706Sandreas.hansson@arm.com  public:
918706Sandreas.hansson@arm.com    /**
928706Sandreas.hansson@arm.com     * Read size bytes memory at address and store in p.
938706Sandreas.hansson@arm.com     */
948706Sandreas.hansson@arm.com    virtual void readBlob(Addr address, uint8_t* p, int size)
958706Sandreas.hansson@arm.com    { _port.readBlob(address, p, size); }
968706Sandreas.hansson@arm.com
978706Sandreas.hansson@arm.com    /**
988706Sandreas.hansson@arm.com     * Write size bytes from p to address.
998706Sandreas.hansson@arm.com     */
1008706Sandreas.hansson@arm.com    virtual void writeBlob(Addr address, uint8_t* p, int size)
1018706Sandreas.hansson@arm.com    { _port.writeBlob(address, p, size); }
1028706Sandreas.hansson@arm.com
1038706Sandreas.hansson@arm.com    /**
1048706Sandreas.hansson@arm.com     * Fill size bytes starting at addr with byte value val.
1058706Sandreas.hansson@arm.com     */
1068706Sandreas.hansson@arm.com    virtual void memsetBlob(Addr address, uint8_t  v, int size)
1078706Sandreas.hansson@arm.com    { _port.memsetBlob(address, v, size); }
1088706Sandreas.hansson@arm.com
1098706Sandreas.hansson@arm.com    /**
1108706Sandreas.hansson@arm.com     * Read sizeof(T) bytes from address and return as object T.
1118706Sandreas.hansson@arm.com     */
1128706Sandreas.hansson@arm.com    template <typename T>
1138706Sandreas.hansson@arm.com    T read(Addr address);
1148706Sandreas.hansson@arm.com
1158706Sandreas.hansson@arm.com    /**
1168706Sandreas.hansson@arm.com     * Write object T to address. Writes sizeof(T) bytes.
1178706Sandreas.hansson@arm.com     */
1188706Sandreas.hansson@arm.com    template <typename T>
1198706Sandreas.hansson@arm.com    void write(Addr address, T data);
1208706Sandreas.hansson@arm.com
1218706Sandreas.hansson@arm.com#if THE_ISA != NO_ISA
1228706Sandreas.hansson@arm.com    /**
1238706Sandreas.hansson@arm.com     * Read sizeof(T) bytes from address and return as object T.
1248706Sandreas.hansson@arm.com     * Performs Guest to Host endianness transform.
1258706Sandreas.hansson@arm.com     */
1268706Sandreas.hansson@arm.com    template <typename T>
1278706Sandreas.hansson@arm.com    T readGtoH(Addr address);
1288706Sandreas.hansson@arm.com
1298706Sandreas.hansson@arm.com    /**
1308706Sandreas.hansson@arm.com     * Write object T to address. Writes sizeof(T) bytes.
1318706Sandreas.hansson@arm.com     * Performs Host to Guest endianness transform.
1328706Sandreas.hansson@arm.com     */
1338706Sandreas.hansson@arm.com    template <typename T>
1348706Sandreas.hansson@arm.com    void writeHtoG(Addr address, T data);
1358706Sandreas.hansson@arm.com#endif
1368706Sandreas.hansson@arm.com};
1378706Sandreas.hansson@arm.com
1388706Sandreas.hansson@arm.com
1398706Sandreas.hansson@arm.comtemplate <typename T>
1408706Sandreas.hansson@arm.comT
1418706Sandreas.hansson@arm.comPortProxy::read(Addr address)
1428706Sandreas.hansson@arm.com{
1438706Sandreas.hansson@arm.com    T data;
1448706Sandreas.hansson@arm.com    readBlob(address, (uint8_t*)&data, sizeof(T));
1458706Sandreas.hansson@arm.com    return data;
1468706Sandreas.hansson@arm.com}
1478706Sandreas.hansson@arm.com
1488706Sandreas.hansson@arm.comtemplate <typename T>
1498706Sandreas.hansson@arm.comvoid
1508706Sandreas.hansson@arm.comPortProxy::write(Addr address, T data)
1518706Sandreas.hansson@arm.com{
1528706Sandreas.hansson@arm.com    writeBlob(address, (uint8_t*)&data, sizeof(T));
1538706Sandreas.hansson@arm.com}
1548706Sandreas.hansson@arm.com
1558706Sandreas.hansson@arm.com#if THE_ISA != NO_ISA
1568706Sandreas.hansson@arm.comtemplate <typename T>
1578706Sandreas.hansson@arm.comT
1588706Sandreas.hansson@arm.comPortProxy::readGtoH(Addr address)
1598706Sandreas.hansson@arm.com{
1608706Sandreas.hansson@arm.com    T data;
1618706Sandreas.hansson@arm.com    readBlob(address, (uint8_t*)&data, sizeof(T));
1628706Sandreas.hansson@arm.com    return TheISA::gtoh(data);
1638706Sandreas.hansson@arm.com}
1648706Sandreas.hansson@arm.com
1658706Sandreas.hansson@arm.comtemplate <typename T>
1668706Sandreas.hansson@arm.comvoid
1678706Sandreas.hansson@arm.comPortProxy::writeHtoG(Addr address, T data)
1688706Sandreas.hansson@arm.com{
1698706Sandreas.hansson@arm.com    data = TheISA::htog(data);
1708706Sandreas.hansson@arm.com    writeBlob(address, (uint8_t*)&data, sizeof(T));
1718706Sandreas.hansson@arm.com}
1728706Sandreas.hansson@arm.com#endif
1738706Sandreas.hansson@arm.com
1748706Sandreas.hansson@arm.com#endif // __MEM_PORT_PROXY_HH__
175