diff options
Diffstat (limited to 'utils/ethosu_logd/dev_mem.hpp')
-rw-r--r-- | utils/ethosu_logd/dev_mem.hpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/utils/ethosu_logd/dev_mem.hpp b/utils/ethosu_logd/dev_mem.hpp new file mode 100644 index 0000000..9d3f0a8 --- /dev/null +++ b/utils/ethosu_logd/dev_mem.hpp @@ -0,0 +1,101 @@ +/* + * 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 <exception> +#include <string> + +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 <typename T> + void read(T &dst, size_t offset) { + read(reinterpret_cast<char *>(&dst), sizeof(dst), offset); + } + + void write(char *src, size_t length, size_t offset); + + template <typename T> + void write(T &src, size_t offset) { + write(reinterpret_cast<char *>(&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 */ |