port_proxy.hh revision 14011:faf0a568ba6b
11049Sbinkertn@umich.edu/* 21049Sbinkertn@umich.edu * Copyright (c) 2011-2013, 2018 ARM Limited 31318Ssaidi@eecs.umich.edu * All rights reserved 41049Sbinkertn@umich.edu * 51049Sbinkertn@umich.edu * The license below extends only to copyright in the software and shall 61049Sbinkertn@umich.edu * not be construed as granting a license to any other intellectual 71049Sbinkertn@umich.edu * property including but not limited to intellectual property relating 81049Sbinkertn@umich.edu * to a hardware implementation of the functionality of the software 91049Sbinkertn@umich.edu * licensed hereunder. You may use the software subject to the license 101049Sbinkertn@umich.edu * terms below provided that you ensure that this notice is replicated 111049Sbinkertn@umich.edu * unmodified and in its entirety in all distributions of the software, 121049Sbinkertn@umich.edu * modified or unmodified, in source code or in binary form. 131049Sbinkertn@umich.edu * 141049Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 151049Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 161049Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 171049Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 181049Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 191049Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 201049Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 211049Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 221049Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 231049Sbinkertn@umich.edu * this software without specific prior written permission. 241049Sbinkertn@umich.edu * 251049Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 261049Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 271049Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 281049Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 291049Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 301049Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 311049Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 321049Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 331049Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 341049Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 351049Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 361049Sbinkertn@umich.edu * 371049Sbinkertn@umich.edu * Authors: Andreas Hansson 381049Sbinkertn@umich.edu */ 391049Sbinkertn@umich.edu 401049Sbinkertn@umich.edu/** 411049Sbinkertn@umich.edu * @file 421307Sbinkertn@umich.edu * PortProxy Object Declaration. 431307Sbinkertn@umich.edu * 441307Sbinkertn@umich.edu * Port proxies are used when non-structural entities need access to 451307Sbinkertn@umich.edu * the memory system (or structural entities that want to peak into 461307Sbinkertn@umich.edu * the memory system without making a real memory access). 471307Sbinkertn@umich.edu * 481307Sbinkertn@umich.edu * Proxy objects replace the previous FunctionalPort, TranslatingPort 491307Sbinkertn@umich.edu * and VirtualPort objects, which provided the same functionality as 501307Sbinkertn@umich.edu * the proxies, but were instances of ports not corresponding to real 511307Sbinkertn@umich.edu * structural ports of the simulated system. Via the port proxies all 521307Sbinkertn@umich.edu * the accesses go through an actual port (either the system port, 531307Sbinkertn@umich.edu * e.g. for processes or initialisation, or a the data port of the 541307Sbinkertn@umich.edu * CPU, e.g. for threads) and thus are transparent to a potentially 551307Sbinkertn@umich.edu * distributed memory and automatically adhere to the memory map of 561307Sbinkertn@umich.edu * the system. 571307Sbinkertn@umich.edu */ 581307Sbinkertn@umich.edu 591307Sbinkertn@umich.edu#ifndef __MEM_PORT_PROXY_HH__ 601307Sbinkertn@umich.edu#define __MEM_PORT_PROXY_HH__ 611307Sbinkertn@umich.edu 621307Sbinkertn@umich.edu#include "mem/port.hh" 631307Sbinkertn@umich.edu#include "sim/byteswap.hh" 641307Sbinkertn@umich.edu 651307Sbinkertn@umich.edu/** 661307Sbinkertn@umich.edu * This object is a proxy for a structural port, to be used for debug 671307Sbinkertn@umich.edu * accesses. 681307Sbinkertn@umich.edu * 691307Sbinkertn@umich.edu * This proxy object is used when non structural entities 701307Sbinkertn@umich.edu * (e.g. thread contexts, object file loaders) need access to the 711307Sbinkertn@umich.edu * memory system. It calls the corresponding functions on the underlying 721307Sbinkertn@umich.edu * structural port, and provides templatized convenience access functions. 731307Sbinkertn@umich.edu * 741307Sbinkertn@umich.edu * The addresses are interpreted as physical addresses. 751307Sbinkertn@umich.edu * 761307Sbinkertn@umich.edu * @sa SETranslatingProxy 771307Sbinkertn@umich.edu * @sa FSTranslatingProxy 781307Sbinkertn@umich.edu */ 791307Sbinkertn@umich.educlass PortProxy 801307Sbinkertn@umich.edu{ 811307Sbinkertn@umich.edu private: 821307Sbinkertn@umich.edu 831307Sbinkertn@umich.edu /** The actual physical port used by this proxy. */ 841307Sbinkertn@umich.edu MasterPort &_port; 851307Sbinkertn@umich.edu 861307Sbinkertn@umich.edu /** Granularity of any transactions issued through this proxy. */ 871307Sbinkertn@umich.edu const unsigned int _cacheLineSize; 881307Sbinkertn@umich.edu 891307Sbinkertn@umich.edu public: 901307Sbinkertn@umich.edu PortProxy(MasterPort &port, unsigned int cacheLineSize) : 911307Sbinkertn@umich.edu _port(port), _cacheLineSize(cacheLineSize) 921307Sbinkertn@umich.edu {} 931307Sbinkertn@umich.edu virtual ~PortProxy() { } 941307Sbinkertn@umich.edu 951307Sbinkertn@umich.edu 961307Sbinkertn@umich.edu 971307Sbinkertn@umich.edu /** Fixed functionality for use in base classes. */ 981307Sbinkertn@umich.edu 991307Sbinkertn@umich.edu /** 1001307Sbinkertn@umich.edu * Read size bytes memory at physical address and store in p. 1011307Sbinkertn@umich.edu */ 1021307Sbinkertn@umich.edu void readBlobPhys(Addr addr, Request::Flags flags, 1031307Sbinkertn@umich.edu void *p, int size) const; 1041269Sbinkertn@umich.edu 1051307Sbinkertn@umich.edu /** 1061307Sbinkertn@umich.edu * Write size bytes from p to physical address. 1071307Sbinkertn@umich.edu */ 1081307Sbinkertn@umich.edu void writeBlobPhys(Addr addr, Request::Flags flags, 1091049Sbinkertn@umich.edu const void *p, int size) const; 1101269Sbinkertn@umich.edu 1111269Sbinkertn@umich.edu /** 1121269Sbinkertn@umich.edu * Fill size bytes starting at physical addr with byte value val. 1131269Sbinkertn@umich.edu */ 1141269Sbinkertn@umich.edu void memsetBlobPhys(Addr addr, Request::Flags flags, 1151269Sbinkertn@umich.edu uint8_t v, int size) const; 1161162Sbinkertn@umich.edu 1171049Sbinkertn@umich.edu 1181049Sbinkertn@umich.edu 1191269Sbinkertn@umich.edu /** Methods to override in base classes */ 1201269Sbinkertn@umich.edu 1211269Sbinkertn@umich.edu /** 1221269Sbinkertn@umich.edu * Read size bytes memory at address and store in p. 1231269Sbinkertn@umich.edu * Returns true on success and false on failure. 1241269Sbinkertn@umich.edu */ 1251269Sbinkertn@umich.edu virtual bool 1261269Sbinkertn@umich.edu tryReadBlob(Addr addr, void *p, int size) const 1271269Sbinkertn@umich.edu { 1281269Sbinkertn@umich.edu readBlobPhys(addr, 0, p, size); 1291269Sbinkertn@umich.edu return true; 1301269Sbinkertn@umich.edu } 1311269Sbinkertn@umich.edu 1321269Sbinkertn@umich.edu /** 1331269Sbinkertn@umich.edu * Write size bytes from p to address. 1341269Sbinkertn@umich.edu * Returns true on success and false on failure. 1351269Sbinkertn@umich.edu */ 1361269Sbinkertn@umich.edu virtual bool 1371269Sbinkertn@umich.edu tryWriteBlob(Addr addr, const void *p, int size) const 1381269Sbinkertn@umich.edu { 1391269Sbinkertn@umich.edu writeBlobPhys(addr, 0, p, size); 1401269Sbinkertn@umich.edu return true; 1411269Sbinkertn@umich.edu } 1421049Sbinkertn@umich.edu 1431269Sbinkertn@umich.edu /** 1441269Sbinkertn@umich.edu * Fill size bytes starting at addr with byte value val. 1451269Sbinkertn@umich.edu * Returns true on success and false on failure. 1461049Sbinkertn@umich.edu */ 1471049Sbinkertn@umich.edu virtual bool 1481269Sbinkertn@umich.edu tryMemsetBlob(Addr addr, uint8_t val, int size) const 1491049Sbinkertn@umich.edu { 1501269Sbinkertn@umich.edu memsetBlobPhys(addr, 0, val, size); 1511269Sbinkertn@umich.edu return true; 1521165Sbinkertn@umich.edu } 1531049Sbinkertn@umich.edu 1541307Sbinkertn@umich.edu 1551049Sbinkertn@umich.edu 1561307Sbinkertn@umich.edu /** Higher level interfaces based on the above. */ 1571307Sbinkertn@umich.edu 1581049Sbinkertn@umich.edu /** 1591049Sbinkertn@umich.edu * Same as tryReadBlob, but insists on success. 1601049Sbinkertn@umich.edu */ 1611049Sbinkertn@umich.edu void 1621269Sbinkertn@umich.edu readBlob(Addr addr, void *p, int size) const 1631049Sbinkertn@umich.edu { 1641049Sbinkertn@umich.edu if (!tryReadBlob(addr, p, size)) 1651049Sbinkertn@umich.edu fatal("readBlob(%#x, ...) failed", addr); 1661049Sbinkertn@umich.edu } 1671049Sbinkertn@umich.edu 1681049Sbinkertn@umich.edu /** 1691049Sbinkertn@umich.edu * Same as tryWriteBlob, but insists on success. 1701049Sbinkertn@umich.edu */ 1711049Sbinkertn@umich.edu void 1721049Sbinkertn@umich.edu writeBlob(Addr addr, const void *p, int size) const 1731049Sbinkertn@umich.edu { 1741049Sbinkertn@umich.edu if (!tryWriteBlob(addr, p, size)) 1751049Sbinkertn@umich.edu fatal("writeBlob(%#x, ...) failed", addr); 1761049Sbinkertn@umich.edu } 1771049Sbinkertn@umich.edu 1781049Sbinkertn@umich.edu /** 1791049Sbinkertn@umich.edu * Same as tryMemsetBlob, but insists on success. 1801049Sbinkertn@umich.edu */ 1811049Sbinkertn@umich.edu void 1821049Sbinkertn@umich.edu memsetBlob(Addr addr, uint8_t v, int size) const 1831049Sbinkertn@umich.edu { 1841049Sbinkertn@umich.edu if (!tryMemsetBlob(addr, v, size)) 1851049Sbinkertn@umich.edu fatal("memsetBlob(%#x, ...) failed", addr); 1861049Sbinkertn@umich.edu } 1871049Sbinkertn@umich.edu 1881049Sbinkertn@umich.edu /** 1891049Sbinkertn@umich.edu * Read sizeof(T) bytes from address and return as object T. 1901049Sbinkertn@umich.edu */ 1911049Sbinkertn@umich.edu template <typename T> 1921049Sbinkertn@umich.edu T read(Addr address) const; 1931049Sbinkertn@umich.edu 1941049Sbinkertn@umich.edu /** 1951049Sbinkertn@umich.edu * Write object T to address. Writes sizeof(T) bytes. 1961049Sbinkertn@umich.edu */ 1971049Sbinkertn@umich.edu template <typename T> 1981049Sbinkertn@umich.edu void write(Addr address, const T &data) const; 1991049Sbinkertn@umich.edu 2001049Sbinkertn@umich.edu /** 2011049Sbinkertn@umich.edu * Read sizeof(T) bytes from address and return as object T. 2021049Sbinkertn@umich.edu * Performs endianness conversion from the selected guest to host order. 2031049Sbinkertn@umich.edu */ 2041049Sbinkertn@umich.edu template <typename T> 2051049Sbinkertn@umich.edu T read(Addr address, ByteOrder guest_byte_order) const; 2061049Sbinkertn@umich.edu 2071049Sbinkertn@umich.edu /** 2081049Sbinkertn@umich.edu * Write object T to address. Writes sizeof(T) bytes. 2091049Sbinkertn@umich.edu * Performs endianness conversion from host to the selected guest order. 2101049Sbinkertn@umich.edu */ 2111049Sbinkertn@umich.edu template <typename T> 2121049Sbinkertn@umich.edu void write(Addr address, T data, ByteOrder guest_byte_order) const; 2131049Sbinkertn@umich.edu 2141049Sbinkertn@umich.edu /** 2151049Sbinkertn@umich.edu * Write the string str into guest memory at address addr. 2161049Sbinkertn@umich.edu * Returns true on success and false on failure. 2171049Sbinkertn@umich.edu */ 2181049Sbinkertn@umich.edu bool tryWriteString(Addr addr, const char *str) const; 2191049Sbinkertn@umich.edu 2201049Sbinkertn@umich.edu /** 2211049Sbinkertn@umich.edu * Same as tryWriteString, but insists on success. 2221049Sbinkertn@umich.edu */ 2231049Sbinkertn@umich.edu void 2241049Sbinkertn@umich.edu writeString(Addr addr, const char *str) const 2251049Sbinkertn@umich.edu { 2261049Sbinkertn@umich.edu if (!tryWriteString(addr, str)) 2271049Sbinkertn@umich.edu fatal("writeString(%#x, ...) failed", addr); 2281049Sbinkertn@umich.edu } 2291049Sbinkertn@umich.edu 2301049Sbinkertn@umich.edu /** 2311049Sbinkertn@umich.edu * Reads the string at guest address addr into the std::string str. 2321049Sbinkertn@umich.edu * Returns true on success and false on failure. 2331049Sbinkertn@umich.edu */ 2341049Sbinkertn@umich.edu bool tryReadString(std::string &str, Addr addr) const; 2351049Sbinkertn@umich.edu 2361049Sbinkertn@umich.edu /** 2371049Sbinkertn@umich.edu * Same as tryReadString, but insists on success. 2381049Sbinkertn@umich.edu */ 2391049Sbinkertn@umich.edu void 2401049Sbinkertn@umich.edu readString(std::string &str, Addr addr) const 2411049Sbinkertn@umich.edu { 2421049Sbinkertn@umich.edu if (!tryReadString(str, addr)) 2431049Sbinkertn@umich.edu fatal("readString(%#x, ...) failed", addr); 2441049Sbinkertn@umich.edu } 2451049Sbinkertn@umich.edu}; 2461049Sbinkertn@umich.edu 2471049Sbinkertn@umich.edu 2481049Sbinkertn@umich.edutemplate <typename T> 2491049Sbinkertn@umich.eduT 2501049Sbinkertn@umich.eduPortProxy::read(Addr address) const 2511049Sbinkertn@umich.edu{ 2521309Ssaidi@eecs.umich.edu T data; 2531309Ssaidi@eecs.umich.edu readBlob(address, &data, sizeof(T)); 2541309Ssaidi@eecs.umich.edu return data; 2551309Ssaidi@eecs.umich.edu} 2561309Ssaidi@eecs.umich.edu 2571309Ssaidi@eecs.umich.edutemplate <typename T> 2581309Ssaidi@eecs.umich.eduvoid 2591317Ssaidi@eecs.umich.eduPortProxy::write(Addr address, const T &data) const 2601318Ssaidi@eecs.umich.edu{ 2611318Ssaidi@eecs.umich.edu writeBlob(address, &data, sizeof(T)); 2621318Ssaidi@eecs.umich.edu} 2631318Ssaidi@eecs.umich.edu 2641318Ssaidi@eecs.umich.edutemplate <typename T> 2651309Ssaidi@eecs.umich.eduT 2661309Ssaidi@eecs.umich.eduPortProxy::read(Addr address, ByteOrder byte_order) const 2671309Ssaidi@eecs.umich.edu{ 2681309Ssaidi@eecs.umich.edu T data; 2691309Ssaidi@eecs.umich.edu readBlob(address, &data, sizeof(T)); 2701309Ssaidi@eecs.umich.edu return gtoh(data, byte_order); 2711317Ssaidi@eecs.umich.edu} 2721317Ssaidi@eecs.umich.edu 2731317Ssaidi@eecs.umich.edutemplate <typename T> 2741317Ssaidi@eecs.umich.eduvoid 2751318Ssaidi@eecs.umich.eduPortProxy::write(Addr address, T data, ByteOrder byte_order) const 2761318Ssaidi@eecs.umich.edu{ 2771309Ssaidi@eecs.umich.edu data = htog(data, byte_order); 2781309Ssaidi@eecs.umich.edu writeBlob(address, &data, sizeof(T)); 2791309Ssaidi@eecs.umich.edu} 2801309Ssaidi@eecs.umich.edu 2811309Ssaidi@eecs.umich.edu#endif // __MEM_PORT_PROXY_HH__ 2821309Ssaidi@eecs.umich.edu