commit
305faa73ec
|
@ -9,6 +9,7 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "Common/Assert.h"
|
||||||
#include "Common/CommonFuncs.h"
|
#include "Common/CommonFuncs.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/MsgHandler.h"
|
#include "Common/MsgHandler.h"
|
||||||
|
@ -28,30 +29,32 @@ namespace EMM
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
static PVOID s_veh_handle;
|
||||||
|
|
||||||
static LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs)
|
static LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs)
|
||||||
{
|
{
|
||||||
switch (pPtrs->ExceptionRecord->ExceptionCode)
|
switch (pPtrs->ExceptionRecord->ExceptionCode)
|
||||||
{
|
{
|
||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
{
|
{
|
||||||
int accessType = (int)pPtrs->ExceptionRecord->ExceptionInformation[0];
|
ULONG_PTR access_type = pPtrs->ExceptionRecord->ExceptionInformation[0];
|
||||||
if (accessType == 8) // Rule out DEP
|
if (access_type == 8) // Rule out DEP
|
||||||
{
|
{
|
||||||
return (DWORD)EXCEPTION_CONTINUE_SEARCH;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtual address of the inaccessible data
|
// virtual address of the inaccessible data
|
||||||
uintptr_t badAddress = (uintptr_t)pPtrs->ExceptionRecord->ExceptionInformation[1];
|
uintptr_t fault_address = (uintptr_t)pPtrs->ExceptionRecord->ExceptionInformation[1];
|
||||||
CONTEXT* ctx = pPtrs->ContextRecord;
|
SContext* ctx = pPtrs->ContextRecord;
|
||||||
|
|
||||||
if (JitInterface::HandleFault(badAddress, ctx))
|
if (JitInterface::HandleFault(fault_address, ctx))
|
||||||
{
|
{
|
||||||
return (DWORD)EXCEPTION_CONTINUE_EXECUTION;
|
return EXCEPTION_CONTINUE_EXECUTION;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Let's not prevent debugging.
|
// Let's not prevent debugging.
|
||||||
return (DWORD)EXCEPTION_CONTINUE_SEARCH;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,18 +87,17 @@ static LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs)
|
||||||
|
|
||||||
void InstallExceptionHandler()
|
void InstallExceptionHandler()
|
||||||
{
|
{
|
||||||
// Make sure this is only called once per process execution
|
if (s_veh_handle)
|
||||||
// Instead, could make a Uninstall function, but whatever..
|
|
||||||
static bool handlerInstalled = false;
|
|
||||||
if (handlerInstalled)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
AddVectoredExceptionHandler(TRUE, Handler);
|
s_veh_handle = AddVectoredExceptionHandler(TRUE, Handler);
|
||||||
handlerInstalled = true;
|
ASSERT(s_veh_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UninstallExceptionHandler()
|
void UninstallExceptionHandler()
|
||||||
{
|
{
|
||||||
|
ULONG status = RemoveVectoredExceptionHandler(s_veh_handle);
|
||||||
|
ASSERT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__APPLE__) && !defined(USE_SIGACTION_ON_APPLE)
|
#elif defined(__APPLE__) && !defined(USE_SIGACTION_ON_APPLE)
|
||||||
|
|
|
@ -49,6 +49,17 @@ public:
|
||||||
m_post_unprotect_time;
|
m_post_unprotect_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define ASAN_DISABLE __declspec(no_sanitize_address)
|
||||||
|
#else
|
||||||
|
#define ASAN_DISABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void ASAN_DISABLE perform_invalid_access(void* data)
|
||||||
|
{
|
||||||
|
*(volatile int*)data = 5;
|
||||||
|
}
|
||||||
|
|
||||||
TEST(PageFault, PageFault)
|
TEST(PageFault, PageFault)
|
||||||
{
|
{
|
||||||
EMM::InstallExceptionHandler();
|
EMM::InstallExceptionHandler();
|
||||||
|
@ -61,7 +72,7 @@ TEST(PageFault, PageFault)
|
||||||
pfjit.m_data = data;
|
pfjit.m_data = data;
|
||||||
|
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
auto start = std::chrono::high_resolution_clock::now();
|
||||||
*(volatile int*)data = 5;
|
perform_invalid_access(data);
|
||||||
auto end = std::chrono::high_resolution_clock::now();
|
auto end = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
#define AS_NS(diff) \
|
#define AS_NS(diff) \
|
||||||
|
|
|
@ -133,6 +133,9 @@
|
||||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Condition="'$(Configuration)'=='Debug' And '$(EnableASAN)'=='true'">
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
|
</ClCompile>
|
||||||
<!--ClCompile Release-->
|
<!--ClCompile Release-->
|
||||||
<ClCompile Condition="'$(Configuration)'=='Release'">
|
<ClCompile Condition="'$(Configuration)'=='Release'">
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
|
|
@ -4,6 +4,11 @@
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
|
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
|
||||||
|
<!-- To use ASAN, just uncomment this. For simplicity, you should run VS/windbg/etc
|
||||||
|
(including the built executables themselves) after using vcvarsall or similar to setup
|
||||||
|
environment, as ASAN needs access to libs and executables in the toolchain paths.
|
||||||
|
-->
|
||||||
|
<!--<EnableASAN>true</EnableASAN>-->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
|
Loading…
Reference in New Issue