22#include <rex/kernel/thread_state.h>
30concept GuestScalar = std::is_arithmetic_v<T> && !std::is_same_v<T, bool>;
43 u8* GetVirtualMembase()
const {
return membase_.GetBase(); }
45 template <
typename T = u8*>
46 T TranslateVirtual(u32 address)
const {
47 return membase_.TranslateVirtual<T>(address);
58 template <
typename T = u8*>
60 return memory_->TryTranslateVirtual<T>(address, required);
67 return membase_.HostToGuestVirtual(host_address);
77 requires(detail::GuestScalar<T>)
78 T
Load(u32 address)
const {
80 std::memcpy(&raw, TranslateVirtual<const u8*>(address),
sizeof(raw));
91 requires(detail::GuestScalar<T>)
92 void Store(u32 address, T value)
const {
93 const BE<T> raw(value);
94 std::memcpy(TranslateVirtual<u8*>(address), &raw,
sizeof(raw));
104 template <
typename T>
105 requires(detail::GuestScalar<T>)
107 if (!IsAccessible(address,
sizeof(T), kMemoryProtectRead)) {
122 template <
typename T>
123 requires(detail::GuestScalar<T>)
125 if (!IsAccessible(address,
sizeof(T), kMemoryProtectRead | kMemoryProtectWrite)) {
142 return std::string_view(TranslateVirtual<const char*>(address));
153 size_t max_length = std::string_view::npos)
const {
154 const char* start = memory_->TryTranslateVirtual<
const char*>(address);
155 if (start ==
nullptr) {
158 constexpr u64 kBlock = 0x1000;
160 while (length < max_length) {
161 const u64 current =
static_cast<u64
>(address) + length;
162 if (current > 0xFFFFFFFFull) {
165 if (length != 0 && current % kBlock == 0 &&
166 memory_->TryTranslateVirtual<
const char*>(
static_cast<u32
>(current)) != start + length) {
169 const size_t block =
static_cast<size_t>(kBlock - current % kBlock);
170 const size_t count = max_length - length < block ? max_length - length : block;
171 if (
const void* end = std::memchr(start + length,
'\0', count)) {
172 length =
static_cast<size_t>(
static_cast<const char*
>(end) - start);
177 return std::string_view(start, length);
181 bool IsAccessible(u32 address, u32 size, u32 required)
const {
182 const u32 last = address + (size - 1);
187 const GuestAddressSpace* memory_;
200template <
typename T, u32 Address>
202 static_assert(Address != 0,
"A guest global needs a nonzero address");
203 static_assert(Address %
alignof(T) == 0,
"A guest global address must be aligned for its type");
204 static_assert(std::is_trivially_copyable_v<T>,
"A guest global holds a trivially copyable type");
206 static constexpr u32 GetAddress() {
return Address; }
217 return view.TranslateVirtual<T*>(Address);
228 if (thread_state ==
nullptr || thread_state->GetAddressSpace() ==
nullptr) {
231 return thread_state->GetAddressSpace()->TryTranslateVirtual<T*>(Address);
243 T* operator->()
const {
return GetHost(); }
245 T& operator*()
const {
return *
GetHost(); }
261#define REX_GUEST_GLOBAL(type, name, address) \
262 inline constexpr rex::kernel::GuestGlobal<type, address> name {}
#define REX_ASSERT(cond,...)
Definition assert.h:84
T TryTranslateVirtual(u32 guest_address, u32 required=kMemoryProtectRead) const
Definition heap.h:637
Definition memory_view.h:38
std::optional< T > TryLoad(u32 address) const
Definition memory_view.h:106
std::string_view GetCString(u32 address) const
Definition memory_view.h:138
bool TryStore(u32 address, T value) const
Definition memory_view.h:124
void Store(u32 address, T value) const
Definition memory_view.h:92
u32 HostToGuestVirtual(const void *host_address) const
Definition memory_view.h:66
T Load(u32 address) const
Definition memory_view.h:78
std::optional< std::string_view > TryGetCString(u32 address, size_t max_length=std::string_view::npos) const
Definition memory_view.h:152
T TryTranslateVirtual(u32 address, u32 required=kMemoryProtectRead) const
Definition memory_view.h:59
static ThreadState * Get()
Definition mapped_ptr.h:412
T GuestPtr(u8 *base, u32 guest_address) noexcept
Definition mapped_ptr.h:393
T Get() const
Definition types.h:93
Definition memory_view.h:201
T * GetHost() const
Definition memory_view.h:209
T * TryGetHost(const rex::kernel::MemoryView &view) const
Definition memory_view.h:239
T * GetHost(const rex::kernel::MemoryView &view) const
Definition memory_view.h:216
T * TryGetHost() const
Definition memory_view.h:226
Integer types, byte order wrappers and size literals.