summaryrefslogtreecommitdiff
path: root/Source/Core/Common/MemoryUtil.cpp
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2014-09-15 23:03:07 -0400
committercomex <comexk@gmail.com>2014-09-17 20:08:09 -0400
commit7ad90275934b63dcc4726a7c49ee9a64758dda3b (patch)
tree997df90c6dbf680543a10ad47a3d09801237ccfd /Source/Core/Common/MemoryUtil.cpp
parent755bd2c445488709a9c2b7d283ca5e6e56fdc56e (diff)
Be pedantic about stack overflow on Linux and OS X.
Add some magic to the fault handler to handle stack overflow due to BLR optimization, and disable the optimization if fastmem is not enabled.
Diffstat (limited to 'Source/Core/Common/MemoryUtil.cpp')
-rw-r--r--Source/Core/Common/MemoryUtil.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/Source/Core/Common/MemoryUtil.cpp b/Source/Core/Common/MemoryUtil.cpp
index f7e1d7d902..a741deef4f 100644
--- a/Source/Core/Common/MemoryUtil.cpp
+++ b/Source/Core/Common/MemoryUtil.cpp
@@ -158,6 +158,25 @@ void FreeAlignedMemory(void* ptr)
}
}
+void ReadProtectMemory(void* ptr, size_t size)
+{
+ bool error_occurred = false;
+
+#ifdef _WIN32
+ DWORD oldValue;
+ if (!VirtualProtect(ptr, size, PAGE_NOACCESS, &oldValue))
+ error_occurred = true;
+#else
+ int retval = mprotect(ptr, size, PROT_NONE);
+
+ if (retval != 0)
+ error_occurred = true;
+#endif
+
+ if (error_occurred)
+ PanicAlert("ReadProtectMemory failed!\n%s", GetLastErrorMsg());
+}
+
void WriteProtectMemory(void* ptr, size_t size, bool allowExecute)
{
bool error_occurred = false;