diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 9ca298a837..5396c8439b 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -391,9 +391,10 @@ static void CpuThread(const std::optional& savestate_path, bool del static_cast(IDCache::GetEnvForThread()); #endif - const bool fastmem_enabled = Config::Get(Config::MAIN_FASTMEM); - if (fastmem_enabled) - EMM::InstallExceptionHandler(); // Let's run under memory watch + // The JIT need to be able to intercept faults, both for fastmem and for the BLR optimization. + const bool exception_handler = EMM::IsExceptionHandlerSupported(); + if (exception_handler) + EMM::InstallExceptionHandler(); #ifdef USE_MEMORYWATCHER s_memory_watcher = std::make_unique(); @@ -441,7 +442,7 @@ static void CpuThread(const std::optional& savestate_path, bool del s_is_started = false; - if (fastmem_enabled) + if (exception_handler) EMM::UninstallExceptionHandler(); if (GDBStub::IsActive()) diff --git a/Source/Core/Core/PowerPC/JitCommon/JitBase.cpp b/Source/Core/Core/PowerPC/JitCommon/JitBase.cpp index 7cba8c7dfb..bcdafd9725 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitBase.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/JitBase.cpp @@ -18,6 +18,7 @@ #include "Core/Core.h" #include "Core/CoreTiming.h" #include "Core/HW/CPU.h" +#include "Core/MemTools.h" #include "Core/PowerPC/PPCAnalyst.h" #include "Core/PowerPC/PowerPC.h" #include "Core/System.h" @@ -132,7 +133,8 @@ void JitBase::RefreshConfig() analyzer.SetDivByZeroExceptionsEnabled(m_enable_div_by_zero_exceptions); bool any_watchpoints = m_system.GetPowerPC().GetMemChecks().HasAny(); - jo.fastmem = m_fastmem_enabled && jo.fastmem_arena && (m_ppc_state.msr.DR || !any_watchpoints); + jo.fastmem = m_fastmem_enabled && jo.fastmem_arena && (m_ppc_state.msr.DR || !any_watchpoints) && + EMM::IsExceptionHandlerSupported(); jo.memcheck = m_system.IsMMUMode() || m_system.IsPauseOnPanicMode() || any_watchpoints; jo.fp_exceptions = m_enable_float_exceptions; jo.div_by_zero_exceptions = m_enable_div_by_zero_exceptions; @@ -140,7 +142,8 @@ void JitBase::RefreshConfig() void JitBase::InitBLROptimization() { - m_enable_blr_optimization = jo.enableBlocklink && m_fastmem_enabled && !m_enable_debugging; + m_enable_blr_optimization = + jo.enableBlocklink && !m_enable_debugging && EMM::IsExceptionHandlerSupported(); m_cleanup_after_stackfault = false; }