diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/common/file_util.cpp | 13 | ||||
| -rw-r--r-- | src/common/logging/backend.cpp | 3 | ||||
| -rw-r--r-- | src/common/logging/log.h | 3 | ||||
| -rw-r--r-- | src/common/memory_util.cpp | 177 | ||||
| -rw-r--r-- | src/common/memory_util.h | 21 |
6 files changed, 14 insertions, 205 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index d0e506689..eccd8f64a 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt | |||
| @@ -64,8 +64,6 @@ add_library(common STATIC | |||
| 64 | logging/text_formatter.cpp | 64 | logging/text_formatter.cpp |
| 65 | logging/text_formatter.h | 65 | logging/text_formatter.h |
| 66 | math_util.h | 66 | math_util.h |
| 67 | memory_util.cpp | ||
| 68 | memory_util.h | ||
| 69 | microprofile.cpp | 67 | microprofile.cpp |
| 70 | microprofile.h | 68 | microprofile.h |
| 71 | microprofileui.h | 69 | microprofileui.h |
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index 548463787..b52492da6 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp | |||
| @@ -15,21 +15,24 @@ | |||
| 15 | #ifdef _WIN32 | 15 | #ifdef _WIN32 |
| 16 | #include <windows.h> | 16 | #include <windows.h> |
| 17 | // windows.h needs to be included before other windows headers | 17 | // windows.h needs to be included before other windows headers |
| 18 | #include <commdlg.h> // for GetSaveFileName | 18 | #include <direct.h> // getcwd |
| 19 | #include <direct.h> // getcwd | ||
| 20 | #include <io.h> | 19 | #include <io.h> |
| 21 | #include <shellapi.h> | 20 | #include <shellapi.h> |
| 22 | #include <shlobj.h> // for SHGetFolderPath | 21 | #include <shlobj.h> // for SHGetFolderPath |
| 23 | #include <tchar.h> | 22 | #include <tchar.h> |
| 24 | #include "common/string_util.h" | 23 | #include "common/string_util.h" |
| 25 | 24 | ||
| 26 | // 64 bit offsets for windows | 25 | #ifdef _MSC_VER |
| 26 | // 64 bit offsets for MSVC | ||
| 27 | #define fseeko _fseeki64 | 27 | #define fseeko _fseeki64 |
| 28 | #define ftello _ftelli64 | 28 | #define ftello _ftelli64 |
| 29 | #define atoll _atoi64 | 29 | #define fileno _fileno |
| 30 | #endif | ||
| 31 | |||
| 32 | // 64 bit offsets for MSVC and MinGW. MinGW also needs this for using _wstat64 | ||
| 30 | #define stat _stat64 | 33 | #define stat _stat64 |
| 31 | #define fstat _fstat64 | 34 | #define fstat _fstat64 |
| 32 | #define fileno _fileno | 35 | |
| 33 | #else | 36 | #else |
| 34 | #ifdef __APPLE__ | 37 | #ifdef __APPLE__ |
| 35 | #include <sys/param.h> | 38 | #include <sys/param.h> |
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 9f5918851..6d5218465 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp | |||
| @@ -196,6 +196,7 @@ void FileBackend::Write(const Entry& entry) { | |||
| 196 | SUB(Service, NFP) \ | 196 | SUB(Service, NFP) \ |
| 197 | SUB(Service, NIFM) \ | 197 | SUB(Service, NIFM) \ |
| 198 | SUB(Service, NIM) \ | 198 | SUB(Service, NIM) \ |
| 199 | SUB(Service, NPNS) \ | ||
| 199 | SUB(Service, NS) \ | 200 | SUB(Service, NS) \ |
| 200 | SUB(Service, NVDRV) \ | 201 | SUB(Service, NVDRV) \ |
| 201 | SUB(Service, PCIE) \ | 202 | SUB(Service, PCIE) \ |
| @@ -204,10 +205,12 @@ void FileBackend::Write(const Entry& entry) { | |||
| 204 | SUB(Service, PM) \ | 205 | SUB(Service, PM) \ |
| 205 | SUB(Service, PREPO) \ | 206 | SUB(Service, PREPO) \ |
| 206 | SUB(Service, PSC) \ | 207 | SUB(Service, PSC) \ |
| 208 | SUB(Service, PSM) \ | ||
| 207 | SUB(Service, SET) \ | 209 | SUB(Service, SET) \ |
| 208 | SUB(Service, SM) \ | 210 | SUB(Service, SM) \ |
| 209 | SUB(Service, SPL) \ | 211 | SUB(Service, SPL) \ |
| 210 | SUB(Service, SSL) \ | 212 | SUB(Service, SSL) \ |
| 213 | SUB(Service, TCAP) \ | ||
| 211 | SUB(Service, Time) \ | 214 | SUB(Service, Time) \ |
| 212 | SUB(Service, USB) \ | 215 | SUB(Service, USB) \ |
| 213 | SUB(Service, VI) \ | 216 | SUB(Service, VI) \ |
diff --git a/src/common/logging/log.h b/src/common/logging/log.h index abbd056ee..d4ec31ec3 100644 --- a/src/common/logging/log.h +++ b/src/common/logging/log.h | |||
| @@ -83,6 +83,7 @@ enum class Class : ClassType { | |||
| 83 | Service_NFP, ///< The NFP service | 83 | Service_NFP, ///< The NFP service |
| 84 | Service_NIFM, ///< The NIFM (Network interface) service | 84 | Service_NIFM, ///< The NIFM (Network interface) service |
| 85 | Service_NIM, ///< The NIM service | 85 | Service_NIM, ///< The NIM service |
| 86 | Service_NPNS, ///< The NPNS service | ||
| 86 | Service_NS, ///< The NS services | 87 | Service_NS, ///< The NS services |
| 87 | Service_NVDRV, ///< The NVDRV (Nvidia driver) service | 88 | Service_NVDRV, ///< The NVDRV (Nvidia driver) service |
| 88 | Service_PCIE, ///< The PCIe service | 89 | Service_PCIE, ///< The PCIe service |
| @@ -91,10 +92,12 @@ enum class Class : ClassType { | |||
| 91 | Service_PM, ///< The PM service | 92 | Service_PM, ///< The PM service |
| 92 | Service_PREPO, ///< The PREPO (Play report) service | 93 | Service_PREPO, ///< The PREPO (Play report) service |
| 93 | Service_PSC, ///< The PSC service | 94 | Service_PSC, ///< The PSC service |
| 95 | Service_PSM, ///< The PSM service | ||
| 94 | Service_SET, ///< The SET (Settings) service | 96 | Service_SET, ///< The SET (Settings) service |
| 95 | Service_SM, ///< The SM (Service manager) service | 97 | Service_SM, ///< The SM (Service manager) service |
| 96 | Service_SPL, ///< The SPL service | 98 | Service_SPL, ///< The SPL service |
| 97 | Service_SSL, ///< The SSL service | 99 | Service_SSL, ///< The SSL service |
| 100 | Service_TCAP, ///< The TCAP service. | ||
| 98 | Service_Time, ///< The time service | 101 | Service_Time, ///< The time service |
| 99 | Service_USB, ///< The USB (Universal Serial Bus) service | 102 | Service_USB, ///< The USB (Universal Serial Bus) service |
| 100 | Service_VI, ///< The VI (Video interface) service | 103 | Service_VI, ///< The VI (Video interface) service |
diff --git a/src/common/memory_util.cpp b/src/common/memory_util.cpp deleted file mode 100644 index 9736fb12a..000000000 --- a/src/common/memory_util.cpp +++ /dev/null | |||
| @@ -1,177 +0,0 @@ | |||
| 1 | // Copyright 2013 Dolphin Emulator Project / 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "common/logging/log.h" | ||
| 6 | #include "common/memory_util.h" | ||
| 7 | |||
| 8 | #ifdef _WIN32 | ||
| 9 | #include <windows.h> | ||
| 10 | // Windows.h needs to be included before psapi.h | ||
| 11 | #include <psapi.h> | ||
| 12 | #include "common/common_funcs.h" | ||
| 13 | #include "common/string_util.h" | ||
| 14 | #else | ||
| 15 | #include <cstdlib> | ||
| 16 | #include <sys/mman.h> | ||
| 17 | #endif | ||
| 18 | |||
| 19 | #if !defined(_WIN32) && defined(ARCHITECTURE_x86_64) && !defined(MAP_32BIT) | ||
| 20 | #include <unistd.h> | ||
| 21 | #define PAGE_MASK (getpagesize() - 1) | ||
| 22 | #define round_page(x) ((((unsigned long)(x)) + PAGE_MASK) & ~(PAGE_MASK)) | ||
| 23 | #endif | ||
| 24 | |||
| 25 | // This is purposely not a full wrapper for virtualalloc/mmap, but it | ||
| 26 | // provides exactly the primitive operations that Dolphin needs. | ||
| 27 | |||
| 28 | void* AllocateExecutableMemory(std::size_t size, bool low) { | ||
| 29 | #if defined(_WIN32) | ||
| 30 | void* ptr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); | ||
| 31 | #else | ||
| 32 | static char* map_hint = nullptr; | ||
| 33 | #if defined(ARCHITECTURE_x86_64) && !defined(MAP_32BIT) | ||
| 34 | // This OS has no flag to enforce allocation below the 4 GB boundary, | ||
| 35 | // but if we hint that we want a low address it is very likely we will | ||
| 36 | // get one. | ||
| 37 | // An older version of this code used MAP_FIXED, but that has the side | ||
| 38 | // effect of discarding already mapped pages that happen to be in the | ||
| 39 | // requested virtual memory range (such as the emulated RAM, sometimes). | ||
| 40 | if (low && (!map_hint)) | ||
| 41 | map_hint = (char*)round_page(512 * 1024 * 1024); /* 0.5 GB rounded up to the next page */ | ||
| 42 | #endif | ||
| 43 | void* ptr = mmap(map_hint, size, PROT_READ | PROT_WRITE | PROT_EXEC, | ||
| 44 | MAP_ANON | MAP_PRIVATE | ||
| 45 | #if defined(ARCHITECTURE_x86_64) && defined(MAP_32BIT) | ||
| 46 | | (low ? MAP_32BIT : 0) | ||
| 47 | #endif | ||
| 48 | , | ||
| 49 | -1, 0); | ||
| 50 | #endif /* defined(_WIN32) */ | ||
| 51 | |||
| 52 | #ifdef _WIN32 | ||
| 53 | if (ptr == nullptr) { | ||
| 54 | #else | ||
| 55 | if (ptr == MAP_FAILED) { | ||
| 56 | ptr = nullptr; | ||
| 57 | #endif | ||
| 58 | LOG_ERROR(Common_Memory, "Failed to allocate executable memory"); | ||
| 59 | } | ||
| 60 | #if !defined(_WIN32) && defined(ARCHITECTURE_x86_64) && !defined(MAP_32BIT) | ||
| 61 | else { | ||
| 62 | if (low) { | ||
| 63 | map_hint += size; | ||
| 64 | map_hint = (char*)round_page(map_hint); /* round up to the next page */ | ||
| 65 | } | ||
| 66 | } | ||
| 67 | #endif | ||
| 68 | |||
| 69 | #if EMU_ARCH_BITS == 64 | ||
| 70 | if ((u64)ptr >= 0x80000000 && low == true) | ||
| 71 | LOG_ERROR(Common_Memory, "Executable memory ended up above 2GB!"); | ||
| 72 | #endif | ||
| 73 | |||
| 74 | return ptr; | ||
| 75 | } | ||
| 76 | |||
| 77 | void* AllocateMemoryPages(std::size_t size) { | ||
| 78 | #ifdef _WIN32 | ||
| 79 | void* ptr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); | ||
| 80 | #else | ||
| 81 | void* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); | ||
| 82 | |||
| 83 | if (ptr == MAP_FAILED) | ||
| 84 | ptr = nullptr; | ||
| 85 | #endif | ||
| 86 | |||
| 87 | if (ptr == nullptr) | ||
| 88 | LOG_ERROR(Common_Memory, "Failed to allocate raw memory"); | ||
| 89 | |||
| 90 | return ptr; | ||
| 91 | } | ||
| 92 | |||
| 93 | void* AllocateAlignedMemory(std::size_t size, std::size_t alignment) { | ||
| 94 | #ifdef _WIN32 | ||
| 95 | void* ptr = _aligned_malloc(size, alignment); | ||
| 96 | #else | ||
| 97 | void* ptr = nullptr; | ||
| 98 | #ifdef ANDROID | ||
| 99 | ptr = memalign(alignment, size); | ||
| 100 | #else | ||
| 101 | if (posix_memalign(&ptr, alignment, size) != 0) | ||
| 102 | LOG_ERROR(Common_Memory, "Failed to allocate aligned memory"); | ||
| 103 | #endif | ||
| 104 | #endif | ||
| 105 | |||
| 106 | if (ptr == nullptr) | ||
| 107 | LOG_ERROR(Common_Memory, "Failed to allocate aligned memory"); | ||
| 108 | |||
| 109 | return ptr; | ||
| 110 | } | ||
| 111 | |||
| 112 | void FreeMemoryPages(void* ptr, std::size_t size) { | ||
| 113 | if (ptr) { | ||
| 114 | #ifdef _WIN32 | ||
| 115 | if (!VirtualFree(ptr, 0, MEM_RELEASE)) | ||
| 116 | LOG_ERROR(Common_Memory, "FreeMemoryPages failed!\n{}", GetLastErrorMsg()); | ||
| 117 | #else | ||
| 118 | munmap(ptr, size); | ||
| 119 | #endif | ||
| 120 | } | ||
| 121 | } | ||
| 122 | |||
| 123 | void FreeAlignedMemory(void* ptr) { | ||
| 124 | if (ptr) { | ||
| 125 | #ifdef _WIN32 | ||
| 126 | _aligned_free(ptr); | ||
| 127 | #else | ||
| 128 | free(ptr); | ||
| 129 | #endif | ||
| 130 | } | ||
| 131 | } | ||
| 132 | |||
| 133 | void WriteProtectMemory(void* ptr, std::size_t size, bool allowExecute) { | ||
| 134 | #ifdef _WIN32 | ||
| 135 | DWORD oldValue; | ||
| 136 | if (!VirtualProtect(ptr, size, allowExecute ? PAGE_EXECUTE_READ : PAGE_READONLY, &oldValue)) | ||
| 137 | LOG_ERROR(Common_Memory, "WriteProtectMemory failed!\n{}", GetLastErrorMsg()); | ||
| 138 | #else | ||
| 139 | mprotect(ptr, size, allowExecute ? (PROT_READ | PROT_EXEC) : PROT_READ); | ||
| 140 | #endif | ||
| 141 | } | ||
| 142 | |||
| 143 | void UnWriteProtectMemory(void* ptr, std::size_t size, bool allowExecute) { | ||
| 144 | #ifdef _WIN32 | ||
| 145 | DWORD oldValue; | ||
| 146 | if (!VirtualProtect(ptr, size, allowExecute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE, | ||
| 147 | &oldValue)) | ||
| 148 | LOG_ERROR(Common_Memory, "UnWriteProtectMemory failed!\n{}", GetLastErrorMsg()); | ||
| 149 | #else | ||
| 150 | mprotect(ptr, size, | ||
| 151 | allowExecute ? (PROT_READ | PROT_WRITE | PROT_EXEC) : PROT_WRITE | PROT_READ); | ||
| 152 | #endif | ||
| 153 | } | ||
| 154 | |||
| 155 | std::string MemUsage() { | ||
| 156 | #ifdef _WIN32 | ||
| 157 | #pragma comment(lib, "psapi") | ||
| 158 | DWORD processID = GetCurrentProcessId(); | ||
| 159 | HANDLE hProcess; | ||
| 160 | PROCESS_MEMORY_COUNTERS pmc; | ||
| 161 | std::string Ret; | ||
| 162 | |||
| 163 | // Print information about the memory usage of the process. | ||
| 164 | |||
| 165 | hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); | ||
| 166 | if (nullptr == hProcess) | ||
| 167 | return "MemUsage Error"; | ||
| 168 | |||
| 169 | if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) | ||
| 170 | Ret = fmt::format("{} K", Common::ThousandSeparate(pmc.WorkingSetSize / 1024, 7)); | ||
| 171 | |||
| 172 | CloseHandle(hProcess); | ||
| 173 | return Ret; | ||
| 174 | #else | ||
| 175 | return ""; | ||
| 176 | #endif | ||
| 177 | } | ||
diff --git a/src/common/memory_util.h b/src/common/memory_util.h deleted file mode 100644 index aad071979..000000000 --- a/src/common/memory_util.h +++ /dev/null | |||
| @@ -1,21 +0,0 @@ | |||
| 1 | // Copyright 2013 Dolphin Emulator Project / 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | #include <string> | ||
| 9 | |||
| 10 | void* AllocateExecutableMemory(std::size_t size, bool low = true); | ||
| 11 | void* AllocateMemoryPages(std::size_t size); | ||
| 12 | void FreeMemoryPages(void* ptr, std::size_t size); | ||
| 13 | void* AllocateAlignedMemory(std::size_t size, std::size_t alignment); | ||
| 14 | void FreeAlignedMemory(void* ptr); | ||
| 15 | void WriteProtectMemory(void* ptr, std::size_t size, bool executable = false); | ||
| 16 | void UnWriteProtectMemory(void* ptr, std::size_t size, bool allowExecute = false); | ||
| 17 | std::string MemUsage(); | ||
| 18 | |||
| 19 | inline int GetPageSize() { | ||
| 20 | return 4096; | ||
| 21 | } | ||