PowerPC: Allow toggling write-back cache during emulation

Now that PR 10575 is merged, the JIT automatically clears its cache
when this setting is changed, making this reasonable to implement.
This commit is contained in:
JosJuice 2023-09-09 16:19:47 +02:00
parent 899d61bc7d
commit b3bfcc5d7f
4 changed files with 23 additions and 4 deletions

View File

@ -902,7 +902,6 @@ enum class BooleanSetting(
MAIN_OVERRIDE_REGION_SETTINGS,
MAIN_MMU,
MAIN_PAUSE_ON_PANIC,
MAIN_ACCURATE_CPU_CACHE,
MAIN_RAM_OVERRIDE_ENABLE,
MAIN_CUSTOM_RTC_ENABLE,
MAIN_DSP_JIT,

View File

@ -18,6 +18,7 @@
#include "Common/FloatUtils.h"
#include "Common/Logging/Log.h"
#include "Core/CPUThreadConfigCallback.h"
#include "Core/Config/MainSettings.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
@ -262,8 +263,25 @@ CPUCore DefaultCPUCore()
#endif
}
void PowerPCManager::RefreshConfig()
{
const bool old_enable_dcache = m_ppc_state.m_enable_dcache;
m_ppc_state.m_enable_dcache = Config::Get(Config::MAIN_ACCURATE_CPU_CACHE);
if (old_enable_dcache && !m_ppc_state.m_enable_dcache)
{
INFO_LOG_FMT(POWERPC, "Flushing data cache");
m_ppc_state.dCache.FlushAll();
}
}
void PowerPCManager::Init(CPUCore cpu_core)
{
m_registered_config_callback_id =
CPUThreadConfigCallback::AddConfigChangedCallback([this] { RefreshConfig(); });
RefreshConfig();
m_invalidate_cache_thread_safe =
m_system.GetCoreTiming().RegisterEvent("invalidateEmulatedCache", InvalidateCacheThreadSafe);
@ -273,8 +291,6 @@ void PowerPCManager::Init(CPUCore cpu_core)
m_ppc_state.iCache.Init();
m_ppc_state.dCache.Init();
m_ppc_state.m_enable_dcache = Config::Get(Config::MAIN_ACCURATE_CPU_CACHE);
if (Config::Get(Config::MAIN_ENABLE_DEBUGGING))
m_breakpoints.ClearAllTemporary();
}
@ -307,6 +323,7 @@ void PowerPCManager::ScheduleInvalidateCacheThreadSafe(u32 address)
void PowerPCManager::Shutdown()
{
CPUThreadConfigCallback::RemoveConfigChangedCallback(m_registered_config_callback_id);
InjectExternalCPUCore(nullptr);
m_system.GetJitInterface().Shutdown();
m_system.GetInterpreter().Shutdown();

View File

@ -13,6 +13,7 @@
#include "Common/CommonTypes.h"
#include "Core/CPUThreadConfigCallback.h"
#include "Core/Debugger/PPCDebugInterface.h"
#include "Core/PowerPC/BreakPoints.h"
#include "Core/PowerPC/ConditionRegister.h"
@ -297,6 +298,7 @@ private:
void InitializeCPUCore(CPUCore cpu_core);
void ApplyMode();
void ResetRegisters();
void RefreshConfig();
PowerPCState m_ppc_state;
@ -308,6 +310,8 @@ private:
MemChecks m_memchecks;
PPCDebugInterface m_debug_interface;
CPUThreadConfigCallback::ConfigChangedCallbackID m_registered_config_callback_id;
CoreTiming::EventType* m_invalidate_cache_thread_safe = nullptr;
Core::System& m_system;

View File

@ -255,7 +255,6 @@ void AdvancedPane::Update()
m_cpu_emulation_engine_combobox->setEnabled(!running);
m_enable_mmu_checkbox->setEnabled(!running);
m_pause_on_panic_checkbox->setEnabled(!running);
m_accurate_cpu_cache_checkbox->setEnabled(!running);
{
QFont bf = font();