ReXGlue SDK
Loading...
Searching...
No Matches
guest_memory.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <cstddef>
14#include <cstring>
15#include <span>
16#include <string>
17#include <type_traits>
18
19#include <rex/platform.h>
20#include <rex/result.h>
21#include <rex/types.h>
22
23namespace rex::kernel {
24
25class TitleState;
26class GuestAllocator;
28class MemoryView;
29
30enum class GuestProtect : u8 {
31 kReadOnly,
32 kReadWrite,
33};
34
35enum class GuestHeap : u8 {
36 kTitle,
37 kSystem,
39};
40
46class REX_KERNEL_API GuestMemory {
47 public:
48 GuestMemory(const GuestMemory&) = delete;
49 GuestMemory& operator=(const GuestMemory&) = delete;
50
57 [[nodiscard]] Result<void> CopyFrom(u32 address, std::span<std::byte> out) const;
58
65 [[nodiscard]] Result<void> CopyTo(u32 address, std::span<const std::byte> data);
66
68 [[nodiscard]] Result<std::span<const std::byte>> GetReadOnlySpan(u32 address, u32 length) const;
69
74 [[nodiscard]] Result<std::span<std::byte>> GetWritableSpan(u32 address, u32 length);
75
82 template <typename T>
83 requires std::is_trivially_copyable_v<T>
84 [[nodiscard]] Result<T> Load(u32 address) const;
85
92 template <typename T>
93 requires std::is_trivially_copyable_v<T>
94 [[nodiscard]] Result<void> Store(u32 address, const T& value);
95
102 [[nodiscard]] Result<std::string> ReadString(u32 address, u32 max_length = 4096) const;
103
110 [[nodiscard]] Result<std::u16string> ReadString16(u32 address, u32 max_length = 4096) const;
111
120 [[nodiscard]] Result<u32> Allocate(u32 size, u32 alignment, GuestProtect protect,
122
129 [[nodiscard]] Result<void> Free(u32 address);
130
137 [[nodiscard]] Result<void> Protect(u32 address, u32 length, GuestProtect protect);
138
142 [[nodiscard]] kernel::MemoryView GetView() const;
143
150 [[nodiscard]] Result<u32> HostToGuest(const void* host) const;
151
152 private:
153 friend class TitleRuntime;
154 friend class kernel::GuestAllocator;
155 friend class kernel::TitleState;
156 explicit GuestMemory(kernel::GuestAddressSpace& memory);
157 kernel::GuestAddressSpace& GetAddressSpace() const;
158 ~GuestMemory();
159
160 struct State;
161 State* state_ = nullptr;
162};
163
169template <typename T>
170 requires std::is_trivially_copyable_v<T>
171[[nodiscard]] Result<T> GuestMemory::Load(u32 address) const {
172 T value;
173 REX_TRY_VOID(CopyFrom(address, std::as_writable_bytes(std::span(&value, 1))));
174 return value;
175}
176
182template <typename T>
183 requires std::is_trivially_copyable_v<T>
184[[nodiscard]] Result<void> GuestMemory::Store(u32 address, const T& value) {
185 return CopyTo(address, std::as_bytes(std::span(&value, 1)));
186}
187
188} // namespace rex::kernel
Definition heap.h:594
Definition guest_allocator.h:49
Result< u32 > HostToGuest(const void *host) const
Result< std::span< std::byte > > GetWritableSpan(u32 address, u32 length)
kernel::MemoryView GetView() const
Result< void > Protect(u32 address, u32 length, GuestProtect protect)
Result< std::u16string > ReadString16(u32 address, u32 max_length=4096) const
Result< T > Load(u32 address) const
Definition guest_memory.h:171
Result< void > CopyFrom(u32 address, std::span< std::byte > out) const
Result< u32 > Allocate(u32 size, u32 alignment, GuestProtect protect, GuestHeap heap=GuestHeap::kTitle)
Result< std::span< const std::byte > > GetReadOnlySpan(u32 address, u32 length) const
Result< void > Store(u32 address, const T &value)
Definition guest_memory.h:184
Result< void > Free(u32 address)
Result< std::string > ReadString(u32 address, u32 max_length=4096) const
Result< void > CopyTo(u32 address, std::span< const std::byte > data)
Definition memory_view.h:38
Definition export.h:24
GuestHeap
Definition guest_memory.h:35
@ kTitle
Definition guest_memory.h:36
@ kPhysical
Definition guest_memory.h:38
Definition endian.h:27
std::expected< T, Error > Result
Definition result.h:98
Platform flags, packing macros and export markers.
#define REX_KERNEL_API
Definition platform.h:297
#define REX_TRY_VOID(expr)
Definition result.h:192
Integer types, byte order wrappers and size literals.