aboutsummaryrefslogtreecommitdiff
path: root/utils/ethosu_logd/dev_mem.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/ethosu_logd/dev_mem.hpp')
-rw-r--r--utils/ethosu_logd/dev_mem.hpp101
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 */