blob: 9d3f0a8fbbe595674fbbd0af4d14c9e180e97cc5 [file] [log] [blame]
/*
* 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 */