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