30 T* host_ptr_ =
nullptr;
37 MappedPtr(T* host_ptr, u32 guest_addr) : host_ptr_(host_ptr), guest_addr_(guest_addr) {}
47 u32 GetGuestAddress()
const {
return guest_addr_; }
49 T* GetHostPtr()
const {
return host_ptr_; }
51 operator T*()
const {
return host_ptr_; }
53 T* operator->()
const {
return host_ptr_; }
55 T& operator*()
const {
return *host_ptr_; }
61 if constexpr (is_be_type_v<T>) {
62 return static_cast<T::value_type
>(*host_ptr_);
68 explicit operator bool()
const {
return host_ptr_ !=
nullptr; }
70 explicit operator u32()
const {
return GetGuestAddress(); }
77 return MappedPtr(host_ptr_ + offset, guest_addr_ +
static_cast<u32
>(offset *
sizeof(T)));
85 return MappedPtr(host_ptr_ - offset, guest_addr_ -
static_cast<u32
>(offset *
sizeof(T)));
90 return reinterpret_cast<U
>(host_ptr_);
98 return reinterpret_cast<rex::BE<U>*
>(host_ptr_);
106 std::memset(host_ptr_, 0,
sizeof(T));
113 std::memset(host_ptr_, 0, size);
123 void* host_ptr_ =
nullptr;
130 MappedPtr(
void* host_ptr, u32 guest_addr) : host_ptr_(host_ptr), guest_addr_(guest_addr) {}
140 u32 GetGuestAddress()
const {
return guest_addr_; }
142 u32
GetValue()
const {
return guest_addr_; }
144 void* GetHostPtr()
const {
return host_ptr_; }
146 operator void*()
const {
return host_ptr_; }
151 operator u8*()
const {
return static_cast<u8*
>(host_ptr_); }
153 explicit operator bool()
const {
return host_ptr_ !=
nullptr; }
155 explicit operator u32()
const {
return guest_addr_; }
162 template <std::
integral IntType>
164 return MappedPtr(
static_cast<u8*
>(host_ptr_) +
static_cast<std::ptrdiff_t
>(offset),
165 guest_addr_ +
static_cast<u32
>(offset));
173 template <std::
integral IntType>
175 return MappedPtr(
static_cast<u8*
>(host_ptr_) -
static_cast<std::ptrdiff_t
>(offset),
176 guest_addr_ -
static_cast<u32
>(offset));
179 template <
typename U>
181 return reinterpret_cast<U
>(host_ptr_);
187 template <
typename U>
189 return reinterpret_cast<rex::BE<U>*
>(host_ptr_);
195 std::memset(host_ptr_, 0, size);
205 char* host_ptr_ =
nullptr;
212 MappedPtr(
char* host_ptr, u32 guest_addr) : host_ptr_(host_ptr), guest_addr_(guest_addr) {}
217 u32 GetGuestAddress()
const {
return guest_addr_; }
219 char* GetHostPtr()
const {
return host_ptr_; }
221 operator char*()
const {
return host_ptr_; }
223 explicit operator bool()
const {
return host_ptr_ !=
nullptr; }
229 return host_ptr_ ? std::string_view(host_ptr_) : std::string_view();
232 char* operator->()
const {
return host_ptr_; }
234 char& operator*()
const {
return *host_ptr_; }
241 return MappedPtr(host_ptr_ + offset, guest_addr_ +
static_cast<u32
>(offset));
249 return MappedPtr(host_ptr_ - offset, guest_addr_ -
static_cast<u32
>(offset));
252 char& operator[](
size_t idx)
const {
return host_ptr_[idx]; }
254 template <
typename U>
256 return reinterpret_cast<U
>(host_ptr_);
265 char16_t* host_ptr_ =
nullptr;
272 MappedPtr(
char16_t* host_ptr, u32 guest_addr) : host_ptr_(host_ptr), guest_addr_(guest_addr) {}
277 u32 GetGuestAddress()
const {
return guest_addr_; }
279 char16_t* GetHostPtr()
const {
return host_ptr_; }
281 operator char16_t*()
const {
return host_ptr_; }
283 explicit operator bool()
const {
return host_ptr_ !=
nullptr; }
289 return host_ptr_ ? std::u16string_view(host_ptr_) : std::u16string_view();
292 char16_t* operator->()
const {
return host_ptr_; }
294 char16_t& operator*()
const {
return *host_ptr_; }
301 return MappedPtr(host_ptr_ + offset, guest_addr_ +
static_cast<u32
>(offset *
sizeof(
char16_t)));
309 return MappedPtr(host_ptr_ - offset, guest_addr_ -
static_cast<u32
>(offset *
sizeof(
char16_t)));
312 char16_t& operator[](
size_t idx)
const {
return host_ptr_[idx]; }
314 template <
typename U>
316 return reinterpret_cast<U
>(host_ptr_);
353namespace rex::memory::detail {
362#ifndef REX_PHYSICAL_OFFSET_IN_CODE
363#error "REX_PHYSICAL_OFFSET_IN_CODE is set by the CMake option of the same name"
365inline constexpr bool kPhysicalOffsetInCode =
static_cast<bool>(REX_PHYSICAL_OFFSET_IN_CODE);
371constexpr u32 PhysicalHostOffset(u32 guest_addr)
noexcept {
372 return (kPhysicalOffsetInCode && guest_addr >= 0xE0000000u) ? 0x1000u : 0u;
380constexpr u32 RemovePhysicalHostOffset(std::size_t host_offset)
noexcept {
381 constexpr std::size_t kOffset = PhysicalHostOffset(0xE0000000u);
383 host_offset >= 0xE0000000u + kOffset && host_offset < 0x100000000ull + kOffset;
384 return static_cast<u32
>(shifted ? host_offset - kOffset : host_offset);
392template <
typename T = u8*>
393inline T
GuestPtr(u8* base, u32 guest_address)
noexcept {
394 return reinterpret_cast<T
>(base + guest_address + detail::PhysicalHostOffset(guest_address));
404 if (host_address ==
nullptr) {
407 return detail::RemovePhysicalHostOffset(
reinterpret_cast<std::size_t
>(host_address) -
408 reinterpret_cast<std::size_t
>(base));
414 constexpr GuestMembase()
noexcept =
default;
416 explicit constexpr GuestMembase(u8* base) noexcept : base_(base) {}
421 [[nodiscard]]
constexpr u8*
GetBase() const noexcept {
return base_; }
424 template <
typename T = u8*>
u32 HostToGuestVirtual(const void *host_address) const noexcept
Definition mapped_ptr.h:435
constexpr u8 * GetBase() const noexcept
Definition mapped_ptr.h:421
T TranslateVirtual(u32 guest_address) const noexcept
Definition mapped_ptr.h:425
std::u16string_view GetValue() const
Definition mapped_ptr.h:288
MappedPtr(std::nullptr_t)
Definition mapped_ptr.h:275
MappedPtr operator+(std::ptrdiff_t offset) const
Definition mapped_ptr.h:300
MappedPtr operator-(std::ptrdiff_t offset) const
Definition mapped_ptr.h:308
std::string_view GetValue() const
Definition mapped_ptr.h:228
MappedPtr operator+(std::ptrdiff_t offset) const
Definition mapped_ptr.h:240
MappedPtr operator-(std::ptrdiff_t offset) const
Definition mapped_ptr.h:248
MappedPtr(std::nullptr_t)
Definition mapped_ptr.h:215
static MappedPtr FromHost(void *host_ptr)
Definition mapped_ptr.h:138
rex::BE< U > * AsArray() const
Definition mapped_ptr.h:188
MappedPtr operator+(IntType offset) const
Definition mapped_ptr.h:163
MappedPtr operator-(IntType offset) const
Definition mapped_ptr.h:174
void Zero(size_t size) const
Definition mapped_ptr.h:193
MappedPtr(std::nullptr_t)
Definition mapped_ptr.h:133
Definition mapped_ptr.h:29
MappedPtr operator+(std::ptrdiff_t offset) const
Definition mapped_ptr.h:76
auto GetValue() const
Definition mapped_ptr.h:60
void Zero(size_t size) const
Definition mapped_ptr.h:111
MappedPtr(std::nullptr_t)
Definition mapped_ptr.h:40
rex::BE< U > * AsArray() const
Definition mapped_ptr.h:97
static MappedPtr FromHost(T *host_ptr)
Definition mapped_ptr.h:45
MappedPtr operator-(std::ptrdiff_t offset) const
Definition mapped_ptr.h:84
void Zero() const
Definition mapped_ptr.h:104
T GuestPtr(u8 *base, u32 guest_address) noexcept
Definition mapped_ptr.h:393
u32 HostPtrToGuest(const u8 *base, const void *host_address) noexcept
Definition mapped_ptr.h:403
Definition mapped_ptr.h:321
Definition mapped_ptr.h:330
Integer types, byte order wrappers and size literals.