libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
mem_rw.h
1#pragma once
2
3#include "libmicroemu/internal/bus/mem_access_results.h"
4#include "libmicroemu/types.h"
5#include <type_traits>
6
7namespace libmicroemu::internal {
8
9template <unsigned Id, typename TCpuAccessor, typename TEndianessC> class MemRw {
10public:
11 static constexpr bool kReadOnly = false;
12
16 explicit MemRw(u8 *const buf, const me_size_t buf_size, const me_adr_t vadr_offset)
17 : buf_(buf), vadr_offset_(vadr_offset), buf_size_(buf_size) {}
18
22 virtual ~MemRw() = default;
23
28 MemRw(const MemRw &r_src) = default;
29
34 MemRw &operator=(const MemRw &r_src) = default;
35
40 MemRw(MemRw &&r_src) = default;
41
46 MemRw &operator=(MemRw &&r_src) = default;
47
48 template <typename T> ReadResult<T> Read(TCpuAccessor &cpua, me_adr_t vadr) const {
49 // clang-format off
50 static_assert(
51 std::is_same<T, u32>::value ||
52 std::is_same<T, u16>::value ||
53 std::is_same<T, u8>::value,
54 "Read only allows u32, u16 and u8");
55 // clang-format on
56 static_cast<void>(cpua);
57
58 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
59 assert(IsPAdrInRange(padr) == true);
60 T val = *reinterpret_cast<const T *>(&buf_[padr]);
61 T cval = TEndianessC::template Convert<T>(val);
62
63 return ReadResult<T>{cval, ReadStatusCode::kOk};
64 }
65
66 template <typename T> WriteResult<T> Write(TCpuAccessor &cpua, me_adr_t vadr, T value) const {
67 // clang-format off
68 static_assert(
69 std::is_same<T, u32>::value ||
70 std::is_same<T, u16>::value ||
71 std::is_same<T, u8>::value,
72 "Write only allows u32, u16 and u8 types");
73 // clang-format on
74
75 static_cast<void>(cpua);
76 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
77 assert(IsPAdrInRange(padr) == true);
78
79 *reinterpret_cast<T *const>(&buf_[padr]) = value;
80
81 return WriteResult<T>{WriteStatusCode::kOk};
82 }
83
84 bool IsVAdrInRange(me_adr_t vadr) const {
85 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
86 if (IsPAdrInRange(padr) == false) {
87 return false;
88 }
89 return true;
90 }
91
92private:
93 u8 *const buf_{nullptr};
94 const me_adr_t vadr_offset_{0U};
95 const me_size_t buf_size_{0U};
96
97 me_adr_t ConvertToPhysicalAdr(me_adr_t vadr) const { return vadr - vadr_offset_; }
98 bool IsPAdrInRange(me_adr_t padr) const { return padr < buf_size_; }
99};
100
101} // namespace libmicroemu::internal
MemRw & operator=(MemRw &&r_src)=default
Move assignment operator for Mem.
MemRw & operator=(const MemRw &r_src)=default
Copy assignment operator for Mem.
MemRw(MemRw &&r_src)=default
Move constructor for Mem.
virtual ~MemRw()=default
Destructor.
MemRw(u8 *const buf, const me_size_t buf_size, const me_adr_t vadr_offset)
Constructor.
Definition mem_rw.h:16
MemRw(const MemRw &r_src)=default
Copy constructor for Mem.
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
Definition mem_access_results.h:11
Definition mem_access_results.h:21