diff options
Diffstat (limited to 'src/dolphin')
-rw-r--r-- | src/dolphin/CodeBlock.h | 29 | ||||
-rw-r--r-- | src/dolphin/MemoryUtil.cpp | 182 | ||||
-rw-r--r-- | src/dolphin/MemoryUtil.h | 22 |
3 files changed, 1 insertions, 232 deletions
diff --git a/src/dolphin/CodeBlock.h b/src/dolphin/CodeBlock.h index 1434297..31a8d93 100644 --- a/src/dolphin/CodeBlock.h +++ b/src/dolphin/CodeBlock.h @@ -49,15 +49,6 @@ public: CodeBlock(CodeBlock&&) = delete; CodeBlock& operator=(CodeBlock&&) = delete; - // Call this before you generate any code. - void AllocCodeSpace(size_t size) - { - region_size = size; - total_region_size = size; - region = static_cast<u8*>(Common::AllocateExecutableMemory(total_region_size)); - T::SetCodePtr(region); - } - // Always clear code space with breakpoints, so that if someone accidentally executes // uninitialized, it just breaks into the debugger. void ClearCodeSpace() @@ -66,26 +57,8 @@ public: ResetCodePtr(); } - // Call this when shutting down. Don't rely on the destructor, even though it'll do the job. - void FreeCodeSpace() - { - ASSERT(!m_is_child); - Common::FreeMemoryPages(region, total_region_size); - region = nullptr; - region_size = 0; - total_region_size = 0; - for (CodeBlock* child : m_children) - { - child->region = nullptr; - child->region_size = 0; - child->total_region_size = 0; - } - } - bool IsInSpace(const u8* ptr) const { return ptr >= region && ptr < (region + region_size); } - // Cannot currently be undone. Will write protect the entire code region. - // Start over if you need to change the code (call FreeCodeSpace(), AllocCodeSpace()). - void WriteProtect() { Common::WriteProtectMemory(region, region_size, true); } + void ResetCodePtr() { T::SetCodePtr(region); } size_t GetSpaceLeft() const { diff --git a/src/dolphin/MemoryUtil.cpp b/src/dolphin/MemoryUtil.cpp deleted file mode 100644 index 7273a8a..0000000 --- a/src/dolphin/MemoryUtil.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license_dolphin.txt file included. - -#include <cstddef> -#include <cstdlib> -#include <string> - -#include "../types.h" -#include "CommonFuncs.h" -#include "Log.h" - -#ifdef _WIN32 -#include <windows.h> -//#include "Common/StringUtil.h" -#else -#include <stdio.h> -#include <sys/mman.h> -#include <sys/types.h> -#if defined __APPLE__ || defined __FreeBSD__ || defined __OpenBSD__ -#include <sys/sysctl.h> -#elif defined __HAIKU__ -#include <OS.h> -#else -#include <sys/sysinfo.h> -#endif -#endif - -namespace Common -{ -// This is purposely not a full wrapper for virtualalloc/mmap, but it -// provides exactly the primitive operations that Dolphin needs. - -void* AllocateExecutableMemory(size_t size) -{ -#if defined(_WIN32) - void* ptr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); -#else - void* ptr = - mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); - - if (ptr == MAP_FAILED) - ptr = nullptr; -#endif - - if (ptr == nullptr) - PanicAlert("Failed to allocate executable memory"); - - return ptr; -} - -void* AllocateMemoryPages(size_t size) -{ -#ifdef _WIN32 - void* ptr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); -#else - void* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - - if (ptr == MAP_FAILED) - ptr = nullptr; -#endif - - if (ptr == nullptr) - PanicAlert("Failed to allocate raw memory"); - - return ptr; -} - -void* AllocateAlignedMemory(size_t size, size_t alignment) -{ -#ifdef _WIN32 - void* ptr = _aligned_malloc(size, alignment); -#else - void* ptr = nullptr; - if (posix_memalign(&ptr, alignment, size) != 0) - ERROR_LOG(MEMMAP, "Failed to allocate aligned memory"); -#endif - - if (ptr == nullptr) - PanicAlert("Failed to allocate aligned memory"); - - return ptr; -} - -void FreeMemoryPages(void* ptr, size_t size) -{ - if (ptr) - { -#ifdef _WIN32 - if (!VirtualFree(ptr, 0, MEM_RELEASE)) - PanicAlert("FreeMemoryPages failed!\nVirtualFree: %s", GetLastErrorString().c_str()); -#else - if (munmap(ptr, size) != 0) - PanicAlert("FreeMemoryPages failed!\nmunmap: %s", LastStrerrorString().c_str()); -#endif - } -} - -void FreeAlignedMemory(void* ptr) -{ - if (ptr) - { -#ifdef _WIN32 - _aligned_free(ptr); -#else - free(ptr); -#endif - } -} - -void ReadProtectMemory(void* ptr, size_t size) -{ -#ifdef _WIN32 - DWORD oldValue; - if (!VirtualProtect(ptr, size, PAGE_NOACCESS, &oldValue)) - PanicAlert("ReadProtectMemory failed!\nVirtualProtect: %s", GetLastErrorString().c_str()); -#else - if (mprotect(ptr, size, PROT_NONE) != 0) - PanicAlert("ReadProtectMemory failed!\nmprotect: %s", LastStrerrorString().c_str()); -#endif -} - -void WriteProtectMemory(void* ptr, size_t size, bool allowExecute) -{ -#ifdef _WIN32 - DWORD oldValue; - if (!VirtualProtect(ptr, size, allowExecute ? PAGE_EXECUTE_READ : PAGE_READONLY, &oldValue)) - PanicAlert("WriteProtectMemory failed!\nVirtualProtect: %s", GetLastErrorString().c_str()); -#else - if (mprotect(ptr, size, allowExecute ? (PROT_READ | PROT_EXEC) : PROT_READ) != 0) - PanicAlert("WriteProtectMemory failed!\nmprotect: %s", LastStrerrorString().c_str()); -#endif -} - -void UnWriteProtectMemory(void* ptr, size_t size, bool allowExecute) -{ -#ifdef _WIN32 - DWORD oldValue; - if (!VirtualProtect(ptr, size, allowExecute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE, &oldValue)) - PanicAlert("UnWriteProtectMemory failed!\nVirtualProtect: %s", GetLastErrorString().c_str()); -#else - if (mprotect(ptr, size, - allowExecute ? (PROT_READ | PROT_WRITE | PROT_EXEC) : PROT_WRITE | PROT_READ) != 0) - { - PanicAlert("UnWriteProtectMemory failed!\nmprotect: %s", LastStrerrorString().c_str()); - } -#endif -} - -size_t MemPhysical() -{ -#ifdef _WIN32 - MEMORYSTATUSEX memInfo; - memInfo.dwLength = sizeof(MEMORYSTATUSEX); - GlobalMemoryStatusEx(&memInfo); - return memInfo.ullTotalPhys; -#elif defined __APPLE__ || defined __FreeBSD__ || defined __OpenBSD__ - int mib[2]; - size_t physical_memory; - mib[0] = CTL_HW; -#ifdef __APPLE__ - mib[1] = HW_MEMSIZE; -#elif defined __FreeBSD__ - mib[1] = HW_REALMEM; -#elif defined __OpenBSD__ - mib[1] = HW_PHYSMEM; -#endif - size_t length = sizeof(size_t); - sysctl(mib, 2, &physical_memory, &length, NULL, 0); - return physical_memory; -#elif defined __HAIKU__ - system_info sysinfo; - get_system_info(&sysinfo); - return static_cast<size_t>(sysinfo.max_pages * B_PAGE_SIZE); -#else - struct sysinfo memInfo; - sysinfo(&memInfo); - return (size_t)memInfo.totalram * memInfo.mem_unit; -#endif -} - -} // namespace Common diff --git a/src/dolphin/MemoryUtil.h b/src/dolphin/MemoryUtil.h deleted file mode 100644 index 607b7a8..0000000 --- a/src/dolphin/MemoryUtil.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license_dolphin.txt file included. - -#pragma once - -#include <cstddef> -#include <string> - -namespace Common -{ -void* AllocateExecutableMemory(size_t size); -void* AllocateMemoryPages(size_t size); -void FreeMemoryPages(void* ptr, size_t size); -void* AllocateAlignedMemory(size_t size, size_t alignment); -void FreeAlignedMemory(void* ptr); -void ReadProtectMemory(void* ptr, size_t size); -void WriteProtectMemory(void* ptr, size_t size, bool executable = false); -void UnWriteProtectMemory(void* ptr, size_t size, bool allowExecute = false); -size_t MemPhysical(); - -} // namespace Common |