libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
mem_ro.h
1#pragma once
2
3#include "libmicroemu/internal/bus/mem_access_results.h"
5#include "libmicroemu/types.h"
6#include <type_traits>
7
9namespace libmicroemu ::internal {
10
11// Read only memory access
12template <unsigned Id, typename TCpuAccessor, typename TEndianessC> class MemRo {
13public:
14 static constexpr bool kReadOnly = true;
15
19 explicit MemRo(const u8 *const buf, const me_size_t buf_size, const me_adr_t vadr_offset)
20 : buf_(buf), vadr_offset_(vadr_offset), buf_size_(buf_size) {}
21
25 virtual ~MemRo() = default;
26
31 MemRo(const MemRo &r_src) = default;
32
37 MemRo &operator=(const MemRo &r_src) = default;
38
43 MemRo(MemRo &&r_src) = default;
44
49 MemRo &operator=(MemRo &&r_src) = default;
50
51 template <typename T> ReadResult<T> Read(TCpuAccessor &cpua, me_adr_t vadr) const {
52 // clang-format off
53 static_assert(
54 std::is_same<T, u32>::value ||
55 std::is_same<T, u16>::value ||
56 std::is_same<T, u8>::value,
57 "Read only allows u32, u16 and u8 types");
58 // clang-format on
59 static_cast<void>(cpua);
60
61 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
62 assert(IsPAdrInRange(padr) == true);
63 T val = *reinterpret_cast<const T *>(&buf_[padr]);
64 T cval = TEndianessC::template Convert<T>(val);
65
66 return ReadResult<T>{cval, ReadStatusCode::kOk};
67 }
68
69 template <typename T> WriteResult<T> Write(TCpuAccessor &cpua, me_adr_t vadr, T value) const {
70 static_cast<void>(vadr); // only used in debug mode
71
72 // clang-format off
73 static_assert(
74 std::is_same<T, u32>::value ||
75 std::is_same<T, u16>::value ||
76 std::is_same<T, u8>::value,
77 "Write only allows u32, u16 and u8 types");
78 // clang-format on
79 static_cast<void>(value);
80 static_cast<void>(cpua);
81
82 assert(IsPAdrInRange(ConvertToPhysicalAdr(vadr)) == true);
83 return WriteResult<T>{WriteStatusCode::kWriteNotAllowed};
84 }
85
86 bool IsVAdrInRange(me_adr_t vadr) const {
87 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
88 if (IsPAdrInRange(padr) == false) {
89 return false;
90 }
91 return true;
92 }
93
94private:
95 const u8 *const buf_{nullptr};
96 const me_adr_t vadr_offset_{0U};
97 const me_size_t buf_size_{0U};
98
99 me_adr_t ConvertToPhysicalAdr(me_adr_t vadr) const { return vadr - vadr_offset_; }
100
101 bool IsPAdrInRange(me_adr_t padr) const { return padr < buf_size_; }
102};
103
104} // namespace libmicroemu::internal
MemRo & operator=(MemRo &&r_src)=default
Move assignment operator for MemRo.
MemRo(const MemRo &r_src)=default
Copy constructor for MemRo.
MemRo & operator=(const MemRo &r_src)=default
Copy assignment operator for MemRo.
MemRo(const u8 *const buf, const me_size_t buf_size, const me_adr_t vadr_offset)
Constructor.
Definition mem_ro.h:19
MemRo(MemRo &&r_src)=default
Move constructor for MemRo.
virtual ~MemRo()=default
Destructor.
The libmicroemu namespace contains all classes and functions of the libmicroemu which are public.
Definition bkpt_flags.h:6
Contains the Result class which is used to return the result of a function.
Definition result.h:15