/* * Copyright (c) 2021 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef DEV_MEM_HPP #define DEV_MEM_HPP #include #include namespace EthosU { namespace DevMem { /**************************************************************************** * Exception ****************************************************************************/ class Exception : public std::exception { public: Exception(const char *msg); Exception(const std::string &msg); virtual ~Exception() throw(); virtual const char *what() const throw(); private: std::string msg; }; /**************************************************************************** * DevMem ****************************************************************************/ class DevMem { public: DevMem(uintptr_t address, size_t size); virtual ~DevMem(); void read(char *dst, size_t length, size_t offset); template void read(T &dst, size_t offset) { read(reinterpret_cast(&dst), sizeof(dst), offset); } void write(char *src, size_t length, size_t offset); template void write(T &src, size_t offset) { write(reinterpret_cast(&src), sizeof(src), offset); } private: char *base; const uintptr_t pageMask; const size_t pageOffset; const size_t size; }; /**************************************************************************** * Log ****************************************************************************/ class Log : public DevMem { public: Log(uintptr_t address, size_t size = LOG_SIZE_MAX); void clear(); void print(); private: struct LogHeader { uint32_t size; uint32_t read; uint32_t pad[6]; uint32_t write; }; static const size_t LOG_SIZE_MIN = 1024; static const size_t LOG_SIZE_MAX = 1024 * 1024; static uintptr_t getAddress(); }; } // namespace DevMem } // namespace EthosU #endif /* DEV_MEM_HPP */