port_proxy.hh revision 12532
18706Sandreas.hansson@arm.com/*
212522Sandreas.sandberg@arm.com * Copyright (c) 2011-2013, 2018 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 *
448853Sandreas.hansson@arm.com * Port proxies are used when non-structural entities need access to
458853Sandreas.hansson@arm.com * the memory system (or structural entities that want to peak into
468853Sandreas.hansson@arm.com * the memory system without making a real memory access).
478853Sandreas.hansson@arm.com *
488853Sandreas.hansson@arm.com * Proxy objects replace the previous FunctionalPort, TranslatingPort
498853Sandreas.hansson@arm.com * and VirtualPort objects, which provided the same functionality as
508853Sandreas.hansson@arm.com * the proxies, but were instances of ports not corresponding to real
518853Sandreas.hansson@arm.com * structural ports of the simulated system. Via the port proxies all
528853Sandreas.hansson@arm.com * the accesses go through an actual port (either the system port,
538853Sandreas.hansson@arm.com * e.g. for processes or initialisation, or a the data port of the
548853Sandreas.hansson@arm.com * CPU, e.g. for threads) and thus are transparent to a potentially
558706Sandreas.hansson@arm.com * distributed memory and automatically adhere to the memory map of
568706Sandreas.hansson@arm.com * the system.
578706Sandreas.hansson@arm.com */
588706Sandreas.hansson@arm.com
598706Sandreas.hansson@arm.com#ifndef __MEM_PORT_PROXY_HH__
608706Sandreas.hansson@arm.com#define __MEM_PORT_PROXY_HH__
618706Sandreas.hansson@arm.com
628706Sandreas.hansson@arm.com#include "config/the_isa.hh"
639850Sandreas.hansson@arm.com#if THE_ISA != NULL_ISA
648706Sandreas.hansson@arm.com    #include "arch/isa_traits.hh"
658706Sandreas.hansson@arm.com#endif
668706Sandreas.hansson@arm.com
678706Sandreas.hansson@arm.com#include "mem/port.hh"
688706Sandreas.hansson@arm.com#include "sim/byteswap.hh"
698706Sandreas.hansson@arm.com
708706Sandreas.hansson@arm.com/**
718853Sandreas.hansson@arm.com * This object is a proxy for a structural port, to be used for debug
728853Sandreas.hansson@arm.com * accesses.
738706Sandreas.hansson@arm.com *
748706Sandreas.hansson@arm.com * This proxy object is used when non structural entities
758706Sandreas.hansson@arm.com * (e.g. thread contexts, object file loaders) need access to the
768706Sandreas.hansson@arm.com * memory system. It calls the corresponding functions on the underlying
778706Sandreas.hansson@arm.com * structural port, and provides templatized convenience access functions.
788706Sandreas.hansson@arm.com *
798706Sandreas.hansson@arm.com * The addresses are interpreted as physical addresses.
808706Sandreas.hansson@arm.com *
818706Sandreas.hansson@arm.com * @sa SETranslatingProxy
828706Sandreas.hansson@arm.com * @sa FSTranslatingProxy
838706Sandreas.hansson@arm.com */
848706Sandreas.hansson@arm.comclass PortProxy
858706Sandreas.hansson@arm.com{
868853Sandreas.hansson@arm.com  private:
878853Sandreas.hansson@arm.com
888853Sandreas.hansson@arm.com    /** The actual physical port used by this proxy. */
898922Swilliam.wang@arm.com    MasterPort &_port;
908706Sandreas.hansson@arm.com
919814Sandreas.hansson@arm.com    /** Granularity of any transactions issued through this proxy. */
929814Sandreas.hansson@arm.com    const unsigned int _cacheLineSize;
939814Sandreas.hansson@arm.com
948706Sandreas.hansson@arm.com  public:
959814Sandreas.hansson@arm.com    PortProxy(MasterPort &port, unsigned int cacheLineSize) :
969814Sandreas.hansson@arm.com        _port(port), _cacheLineSize(cacheLineSize) { }
978706Sandreas.hansson@arm.com    virtual ~PortProxy() { }
988706Sandreas.hansson@arm.com
998706Sandreas.hansson@arm.com    /**
1008706Sandreas.hansson@arm.com     * Read size bytes memory at address and store in p.
1018706Sandreas.hansson@arm.com     */
10212532Sandreas.sandberg@arm.com    virtual void readBlob(Addr addr, uint8_t* p, int size) const {
10312532Sandreas.sandberg@arm.com        readBlobPhys(addr, 0, p, size);
10412532Sandreas.sandberg@arm.com    }
1058706Sandreas.hansson@arm.com
1068706Sandreas.hansson@arm.com    /**
1078706Sandreas.hansson@arm.com     * Write size bytes from p to address.
1088706Sandreas.hansson@arm.com     */
10912532Sandreas.sandberg@arm.com    virtual void writeBlob(Addr addr, const uint8_t* p, int size) const {
11012532Sandreas.sandberg@arm.com        writeBlobPhys(addr, 0, p, size);
11112532Sandreas.sandberg@arm.com    }
1128706Sandreas.hansson@arm.com
1138706Sandreas.hansson@arm.com    /**
1148706Sandreas.hansson@arm.com     * Fill size bytes starting at addr with byte value val.
1158706Sandreas.hansson@arm.com     */
11612532Sandreas.sandberg@arm.com    virtual void memsetBlob(Addr addr, uint8_t v, int size) const {
11712532Sandreas.sandberg@arm.com        memsetBlobPhys(addr, 0, v, size);
11812532Sandreas.sandberg@arm.com    }
11912532Sandreas.sandberg@arm.com
12012532Sandreas.sandberg@arm.com    /**
12112532Sandreas.sandberg@arm.com     * Read size bytes memory at physical address and store in p.
12212532Sandreas.sandberg@arm.com     */
12312532Sandreas.sandberg@arm.com    void readBlobPhys(Addr addr, Request::Flags flags,
12412532Sandreas.sandberg@arm.com                      uint8_t* p, int size) const;
12512532Sandreas.sandberg@arm.com
12612532Sandreas.sandberg@arm.com    /**
12712532Sandreas.sandberg@arm.com     * Write size bytes from p to physical address.
12812532Sandreas.sandberg@arm.com     */
12912532Sandreas.sandberg@arm.com    void writeBlobPhys(Addr addr, Request::Flags flags,
13012532Sandreas.sandberg@arm.com                       const uint8_t* p, int size) const;
13112532Sandreas.sandberg@arm.com
13212532Sandreas.sandberg@arm.com    /**
13312532Sandreas.sandberg@arm.com     * Fill size bytes starting at physical addr with byte value val.
13412532Sandreas.sandberg@arm.com     */
13512532Sandreas.sandberg@arm.com    void memsetBlobPhys(Addr addr, Request::Flags flags,
13612532Sandreas.sandberg@arm.com                        uint8_t v, int size) const;
1378706Sandreas.hansson@arm.com
1388706Sandreas.hansson@arm.com    /**
1398706Sandreas.hansson@arm.com     * Read sizeof(T) bytes from address and return as object T.
1408706Sandreas.hansson@arm.com     */
1418706Sandreas.hansson@arm.com    template <typename T>
1428861Sandreas.hansson@arm.com    T read(Addr address) const;
1438706Sandreas.hansson@arm.com
1448706Sandreas.hansson@arm.com    /**
1458706Sandreas.hansson@arm.com     * Write object T to address. Writes sizeof(T) bytes.
1468706Sandreas.hansson@arm.com     */
1478706Sandreas.hansson@arm.com    template <typename T>
1488861Sandreas.hansson@arm.com    void write(Addr address, T data) const;
1498706Sandreas.hansson@arm.com
15012522Sandreas.sandberg@arm.com    /**
15112522Sandreas.sandberg@arm.com     * Read sizeof(T) bytes from address and return as object T.
15212522Sandreas.sandberg@arm.com     * Performs selected endianness transform.
15312522Sandreas.sandberg@arm.com     */
15412522Sandreas.sandberg@arm.com    template <typename T>
15512522Sandreas.sandberg@arm.com    T readGtoH(Addr address, ByteOrder guest_byte_order) const;
15612522Sandreas.sandberg@arm.com
15712522Sandreas.sandberg@arm.com    /**
15812522Sandreas.sandberg@arm.com     * Write object T to address. Writes sizeof(T) bytes.
15912522Sandreas.sandberg@arm.com     * Performs selected endianness transform.
16012522Sandreas.sandberg@arm.com     */
16112522Sandreas.sandberg@arm.com    template <typename T>
16212522Sandreas.sandberg@arm.com    void writeHtoG(Addr address, T data, ByteOrder guest_byte_order) const;
16312522Sandreas.sandberg@arm.com
1649850Sandreas.hansson@arm.com#if THE_ISA != NULL_ISA
1658706Sandreas.hansson@arm.com    /**
1668706Sandreas.hansson@arm.com     * Read sizeof(T) bytes from address and return as object T.
1678706Sandreas.hansson@arm.com     * Performs Guest to Host endianness transform.
1688706Sandreas.hansson@arm.com     */
1698706Sandreas.hansson@arm.com    template <typename T>
1708861Sandreas.hansson@arm.com    T readGtoH(Addr address) const;
1718706Sandreas.hansson@arm.com
1728706Sandreas.hansson@arm.com    /**
1738706Sandreas.hansson@arm.com     * Write object T to address. Writes sizeof(T) bytes.
1748706Sandreas.hansson@arm.com     * Performs Host to Guest endianness transform.
1758706Sandreas.hansson@arm.com     */
1768706Sandreas.hansson@arm.com    template <typename T>
1778861Sandreas.hansson@arm.com    void writeHtoG(Addr address, T data) const;
1788706Sandreas.hansson@arm.com#endif
1798706Sandreas.hansson@arm.com};
1808706Sandreas.hansson@arm.com
1818706Sandreas.hansson@arm.com
18212532Sandreas.sandberg@arm.com/**
18312532Sandreas.sandberg@arm.com * This object is a proxy for a structural port, to be used for debug
18412532Sandreas.sandberg@arm.com * accesses to secure memory.
18512532Sandreas.sandberg@arm.com *
18612532Sandreas.sandberg@arm.com * The addresses are interpreted as physical addresses to secure memory.
18712532Sandreas.sandberg@arm.com */
18812532Sandreas.sandberg@arm.comclass SecurePortProxy : public PortProxy
18912532Sandreas.sandberg@arm.com{
19012532Sandreas.sandberg@arm.com  public:
19112532Sandreas.sandberg@arm.com    SecurePortProxy(MasterPort &port, unsigned int cache_line_size)
19212532Sandreas.sandberg@arm.com        : PortProxy(port, cache_line_size) {}
19312532Sandreas.sandberg@arm.com
19412532Sandreas.sandberg@arm.com    void readBlob(Addr addr, uint8_t *p, int size) const override;
19512532Sandreas.sandberg@arm.com    void writeBlob(Addr addr, const uint8_t *p, int size) const override;
19612532Sandreas.sandberg@arm.com    void memsetBlob(Addr addr, uint8_t val, int size) const override;
19712532Sandreas.sandberg@arm.com};
19812532Sandreas.sandberg@arm.com
1998706Sandreas.hansson@arm.comtemplate <typename T>
2008706Sandreas.hansson@arm.comT
2018861Sandreas.hansson@arm.comPortProxy::read(Addr address) const
2028706Sandreas.hansson@arm.com{
2038706Sandreas.hansson@arm.com    T data;
2048706Sandreas.hansson@arm.com    readBlob(address, (uint8_t*)&data, sizeof(T));
2058706Sandreas.hansson@arm.com    return data;
2068706Sandreas.hansson@arm.com}
2078706Sandreas.hansson@arm.com
2088706Sandreas.hansson@arm.comtemplate <typename T>
2098706Sandreas.hansson@arm.comvoid
2108861Sandreas.hansson@arm.comPortProxy::write(Addr address, T data) const
2118706Sandreas.hansson@arm.com{
2128706Sandreas.hansson@arm.com    writeBlob(address, (uint8_t*)&data, sizeof(T));
2138706Sandreas.hansson@arm.com}
2148706Sandreas.hansson@arm.com
21512522Sandreas.sandberg@arm.comtemplate <typename T>
21612522Sandreas.sandberg@arm.comT
21712522Sandreas.sandberg@arm.comPortProxy::readGtoH(Addr address, ByteOrder byte_order) const
21812522Sandreas.sandberg@arm.com{
21912522Sandreas.sandberg@arm.com    T data;
22012522Sandreas.sandberg@arm.com    readBlob(address, (uint8_t*)&data, sizeof(T));
22112522Sandreas.sandberg@arm.com    return gtoh(data, byte_order);
22212522Sandreas.sandberg@arm.com}
22312522Sandreas.sandberg@arm.com
22412522Sandreas.sandberg@arm.comtemplate <typename T>
22512522Sandreas.sandberg@arm.comvoid
22612522Sandreas.sandberg@arm.comPortProxy::writeHtoG(Addr address, T data, ByteOrder byte_order) const
22712522Sandreas.sandberg@arm.com{
22812522Sandreas.sandberg@arm.com    data = htog(data, byte_order);
22912522Sandreas.sandberg@arm.com    writeBlob(address, (uint8_t*)&data, sizeof(T));
23012522Sandreas.sandberg@arm.com}
23112522Sandreas.sandberg@arm.com
2329850Sandreas.hansson@arm.com#if THE_ISA != NULL_ISA
2338706Sandreas.hansson@arm.comtemplate <typename T>
2348706Sandreas.hansson@arm.comT
2358861Sandreas.hansson@arm.comPortProxy::readGtoH(Addr address) const
2368706Sandreas.hansson@arm.com{
2378706Sandreas.hansson@arm.com    T data;
2388706Sandreas.hansson@arm.com    readBlob(address, (uint8_t*)&data, sizeof(T));
2398706Sandreas.hansson@arm.com    return TheISA::gtoh(data);
2408706Sandreas.hansson@arm.com}
2418706Sandreas.hansson@arm.com
2428706Sandreas.hansson@arm.comtemplate <typename T>
2438706Sandreas.hansson@arm.comvoid
2448861Sandreas.hansson@arm.comPortProxy::writeHtoG(Addr address, T data) const
2458706Sandreas.hansson@arm.com{
2468706Sandreas.hansson@arm.com    data = TheISA::htog(data);
2478706Sandreas.hansson@arm.com    writeBlob(address, (uint8_t*)&data, sizeof(T));
2488706Sandreas.hansson@arm.com}
2498706Sandreas.hansson@arm.com#endif
2508706Sandreas.hansson@arm.com
2518706Sandreas.hansson@arm.com#endif // __MEM_PORT_PROXY_HH__
252