12template <
unsigned Id,
typename TCpuAccessor,
typename TEndianessC>
class MemRo {
14 static constexpr bool kReadOnly =
true;
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) {}
51 template <
typename T> ReadResult<T> Read(TCpuAccessor &cpua, me_adr_t vadr)
const {
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");
59 static_cast<void>(cpua);
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);
66 return ReadResult<T>{cval, ReadStatusCode::kOk};
69 template <
typename T> WriteResult<T> Write(TCpuAccessor &cpua, me_adr_t vadr, T value)
const {
70 static_cast<void>(vadr);
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");
79 static_cast<void>(value);
80 static_cast<void>(cpua);
82 assert(IsPAdrInRange(ConvertToPhysicalAdr(vadr)) ==
true);
83 return WriteResult<T>{WriteStatusCode::kWriteNotAllowed};
86 bool IsVAdrInRange(me_adr_t vadr)
const {
87 const me_adr_t padr = ConvertToPhysicalAdr(vadr);
88 if (IsPAdrInRange(padr) ==
false) {
95 const u8 *
const buf_{
nullptr};
96 const me_adr_t vadr_offset_{0U};
97 const me_size_t buf_size_{0U};
99 me_adr_t ConvertToPhysicalAdr(me_adr_t vadr)
const {
return vadr - vadr_offset_; }
101 bool IsPAdrInRange(me_adr_t padr)
const {
return padr < buf_size_; }