|
|
|
@ -393,6 +393,10 @@ private: |
|
|
|
ankerl::unordered_dense::map<size_t, size_t> placeholder_host_pointers; ///< Placeholder backing offset
|
|
|
|
}; |
|
|
|
|
|
|
|
#elif defined(__OPENORBIS__)
|
|
|
|
// None of the luxuries of POSIX
|
|
|
|
class Impl { |
|
|
|
}; |
|
|
|
#else // ^^^ Windows ^^^ vvv POSIX vvv
|
|
|
|
|
|
|
|
#ifdef ARCHITECTURE_arm64
|
|
|
|
@ -700,30 +704,32 @@ HostMemory::HostMemory(HostMemory&&) noexcept = default; |
|
|
|
|
|
|
|
HostMemory& HostMemory::operator=(HostMemory&&) noexcept = default; |
|
|
|
|
|
|
|
void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length, |
|
|
|
MemoryPermission perms, bool separate_heap) { |
|
|
|
void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms, bool separate_heap) { |
|
|
|
#ifndef __OPENORBIS__
|
|
|
|
ASSERT(virtual_offset % PageAlignment == 0); |
|
|
|
ASSERT(host_offset % PageAlignment == 0); |
|
|
|
ASSERT(length % PageAlignment == 0); |
|
|
|
ASSERT(virtual_offset + length <= virtual_size); |
|
|
|
ASSERT(host_offset + length <= backing_size); |
|
|
|
if (length == 0 || !virtual_base || !impl) { |
|
|
|
if (length == 0 || !virtual_base || !impl) |
|
|
|
return; |
|
|
|
} |
|
|
|
impl->Map(virtual_offset + virtual_base_offset, host_offset, length, perms); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
void HostMemory::Unmap(size_t virtual_offset, size_t length, bool separate_heap) { |
|
|
|
#ifndef __OPENORBIS__
|
|
|
|
ASSERT(virtual_offset % PageAlignment == 0); |
|
|
|
ASSERT(length % PageAlignment == 0); |
|
|
|
ASSERT(virtual_offset + length <= virtual_size); |
|
|
|
if (length == 0 || !virtual_base || !impl) { |
|
|
|
if (length == 0 || !virtual_base || !impl) |
|
|
|
return; |
|
|
|
} |
|
|
|
impl->Unmap(virtual_offset + virtual_base_offset, length); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
void HostMemory::Protect(size_t virtual_offset, size_t length, MemoryPermission perm) { |
|
|
|
#ifndef __OPENORBIS__
|
|
|
|
ASSERT(virtual_offset % PageAlignment == 0); |
|
|
|
ASSERT(length % PageAlignment == 0); |
|
|
|
ASSERT(virtual_offset + length <= virtual_size); |
|
|
|
@ -734,17 +740,21 @@ void HostMemory::Protect(size_t virtual_offset, size_t length, MemoryPermission |
|
|
|
const bool write = True(perm & MemoryPermission::Write); |
|
|
|
const bool execute = True(perm & MemoryPermission::Execute); |
|
|
|
impl->Protect(virtual_offset + virtual_base_offset, length, read, write, execute); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
void HostMemory::ClearBackingRegion(size_t physical_offset, size_t length, u32 fill_value) { |
|
|
|
std::memset(backing_base + physical_offset, fill_value, length); |
|
|
|
if (!impl) |
|
|
|
std::memset(backing_base + physical_offset, fill_value, length); |
|
|
|
} |
|
|
|
|
|
|
|
void HostMemory::EnableDirectMappedAddress() { |
|
|
|
#ifndef __OPENORBIS__
|
|
|
|
if (impl) { |
|
|
|
impl->EnableDirectMappedAddress(); |
|
|
|
virtual_size += reinterpret_cast<uintptr_t>(virtual_base); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Common
|