9template <
unsigned Id,
typename TCpuAccessor,
typename TEndianessC>
class MemRw {
11 static constexpr bool kReadOnly =
false;
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) {}
48 template <
typename T>
ReadResult<T> Read(TCpuAccessor &cpua, me_adr_t vadr)
const {
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");
56 static_cast<void>(cpua);
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);
66 template <
typename T>
WriteResult<T> Write(TCpuAccessor &cpua, me_adr_t vadr, T value)
const {
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");
75 static_cast<void>(cpua);
76 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
77 assert(IsPAdrInRange(padr) ==
true);
79 *
reinterpret_cast<T *const
>(&buf_[padr]) = value;
84 bool IsVAdrInRange(me_adr_t vadr)
const {
85 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
86 if (IsPAdrInRange(padr) ==
false) {
93 u8 *
const buf_{
nullptr};
94 const me_adr_t vadr_offset_{0U};
95 const me_size_t buf_size_{0U};
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_; }