libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
memory_helpers.h
1#pragma once
3#include "libmicroemu/internal/utils/traits.h"
4#include "libmicroemu/types.h"
5#include <cstddef>
6#include <cstdint>
7#include <tuple>
8#include <type_traits>
9
10namespace libmicroemu::internal {
11
13
14public:
15 template <typename TCpuStates, typename TBus, typename... Args,
16 typename = std::enable_if_t<(std::is_same_v<Args, uint32_t> && ...)>>
17 static Result<std::array<u32, sizeof...(Args)>> ReadMemory(TCpuStates &cpua, TBus &bus,
18 Args... value) {
19 using TElement = typename std::tuple_element<0, std::tuple<Args...>>::type;
20 std::array<TElement, sizeof...(Args)> result_ma;
21 auto sc = AssignReadResult(cpua, bus, result_ma, value...);
22 return Result<std::array<u32, sizeof...(Args)>>(sc, result_ma);
23 }
24
25 // @brief Copies data from an memory address used by the emulator to an local array.
26 // @param dest_ptr The character array to store the data.
27 // @param dest_len The maximum length of the character array.
28 // @param mem_acs object to access the emulated memory.
29 // @param src_ptr The memory address to read the data from.
30 // @param len The length of data to be read.
31 // @return Result<void> The result of the write operation.
32 template <typename TCpuStates, typename TBus>
33 static Result<void> CpyFromEmuMem(TCpuStates &cpua, TBus &bus, char *dest_ptr,
34 std::size_t dest_len, me_adr_t src_ptr, me_size_t src_len) {
35 auto res_len = src_len <= dest_len ? src_len : dest_len;
36
37 for (u32 i = 0U; i < res_len; ++i) {
38 auto r_ch = bus.template Read<u8>(cpua, src_ptr);
39 if (r_ch.IsErr()) {
40 return Err<u8, void>(r_ch);
41 };
42 const auto &ch = r_ch.content;
43 dest_ptr[i] = ch;
44 src_ptr++;
45 }
46
47 return Ok();
48 }
49
50 // @brief Copies data from an local array to an memory address used by the emulator.
51 template <typename TCpuStates, typename TBus>
52 static Result<u32> CpyToEmuMem(TCpuStates &cpua, TBus &bus, me_adr_t dest_ptr, me_size_t dest_len,
53 char *src_ptr, std::size_t src_len) {
54 auto res_len = dest_len <= src_len ? dest_len : src_len;
55
56 for (u32 i = 0U; i < res_len; ++i) {
57 auto r_ch = bus.template Write<u8>(cpua, dest_ptr, src_ptr[i]);
58 if (r_ch.IsErr()) {
59 return Err<void, u32>(r_ch);
60 };
61 dest_ptr++;
62 }
63
64 return Ok<u32>(res_len);
65 }
66
67private:
68 // ------------------
69
70 template <std::size_t I = 0, std::size_t N, typename TCpuStates, typename TBus, typename T,
71 typename... Args>
72 static typename std::enable_if <
73 I<(N - 1), StatusCode>::type AssignReadResult(TCpuStates &cpua, TBus &bus,
74 std::array<uint32_t, N> &result_ma, T value,
75 Args... args) {
76 auto r_w1 = bus.template Read<u32>(cpua, value);
77
78 // abort if an error occured
79 if (r_w1.IsErr()) {
80 return r_w1.status_code;
81 }
82
83 result_ma[I] = r_w1.content;
84 auto sc = AssignReadResult<I + 1, N, TCpuStates, TBus, Args...>(cpua, bus, result_ma, args...);
85 return sc;
86 }
87
88 template <std::size_t I = 0, std::size_t N, typename TCpuStates, typename TBus, typename T>
89 static typename std::enable_if_t<I == (N - 1), StatusCode>
90 AssignReadResult(TCpuStates &cpua, TBus &bus, std::array<uint32_t, N> &result_ma, T value) {
91 auto r_w1 = bus.template Read<u32>(cpua, value);
92 // abort if an error occured
93 if (r_w1.IsErr()) {
94 return r_w1.status_code;
95 }
96 result_ma[I] = r_w1.content;
98 }
99
103 MemoryHelpers() = delete;
104
108 ~MemoryHelpers() = delete;
109
114 MemoryHelpers(const MemoryHelpers &r_src) = delete;
115
120 MemoryHelpers &operator=(const MemoryHelpers &r_src) = delete;
121
126 MemoryHelpers(MemoryHelpers &&r_src) = delete;
127
132 MemoryHelpers &operator=(MemoryHelpers &&r_src) = delete;
133};
134
135} // namespace libmicroemu::internal
Definition memory_helpers.h:12
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
StatusCode
Enum representing various status codes used throughout the system.
Definition status_code.h:17
@ kSuccess
Operation succeeded successfully.
Definition status_code.h:20
Contains the Result class which is used to return the result of a function.
Definition result.h:15