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