Skip to content
Permalink
Browse files

Merge pull request #4144 from aldelaro5/debugger-insertInstruction-fix

Invalidate the icache when inserting a nop or a BLR
  • Loading branch information...
phire committed Aug 23, 2016
2 parents 52af077 + cc7aa73 commit 92f165d75693e54285294bb666f33d003d1ab174
@@ -163,6 +163,7 @@ void PPCDebugInterface::ToggleMemCheck(unsigned int address)
void PPCDebugInterface::InsertBLR(unsigned int address, unsigned int value)
{
PowerPC::HostWrite_U32(value, address);
PowerPC::ScheduleInvalidateCacheThreadSafe(address);
}

// =======================================================
@@ -10,6 +10,7 @@
#include "Common/MathUtil.h"

#include "Core/ConfigManager.h"
#include "Core/CoreTiming.h"
#include "Core/HW/CPU.h"
#include "Core/HW/Memmap.h"
#include "Core/HW/SystemTimers.h"
@@ -35,6 +36,12 @@ BreakPoints breakpoints;
MemChecks memchecks;
PPCDebugInterface debug_interface;

static int s_invalidate_cache_thread_safe;
static void InvalidateCacheThreadSafe(u64 userdata, s64 cyclesLate)
{
ppcState.iCache.Invalidate(static_cast<u32>(userdata));
}

u32 CompactCR()
{
u32 new_cr = 0;
@@ -117,6 +124,9 @@ void Init(int cpu_core)
// Changing the rounding mode has a limited effect.
FPURoundMode::SetPrecisionMode(FPURoundMode::PREC_53);

s_invalidate_cache_thread_safe =
CoreTiming::RegisterEvent("invalidateEmulatedCache", InvalidateCacheThreadSafe);

memset(ppcState.sr, 0, sizeof(ppcState.sr));
ppcState.pagetable_base = 0;
ppcState.pagetable_hashmask = 0;
@@ -173,6 +183,15 @@ void Init(int cpu_core)
breakpoints.ClearAllTemporary();
}

void ScheduleInvalidateCacheThreadSafe(u32 address)
{
if (CPU::GetState() == CPU::State::CPU_RUNNING)
CoreTiming::ScheduleEvent(0, s_invalidate_cache_thread_safe, address,
CoreTiming::FromThread::NON_CPU);
else
PowerPC::ppcState.iCache.Invalidate(static_cast<u32>(address));
}

void Shutdown()
{
InjectExternalCPUCore(nullptr);
@@ -138,6 +138,7 @@ extern PPCDebugInterface debug_interface;
void Init(int cpu_core);
void Shutdown();
void DoState(PointerWrap& p);
void ScheduleInvalidateCacheThreadSafe(u32 address);

CoreMode GetMode();
// [NOT THREADSAFE] CPU Thread or CPU::PauseAndLock or CORE_UNINITIALIZED

0 comments on commit 92f165d

Please sign in to comment.
You can’t perform that action at this time.