diff options
Diffstat (limited to 'src/core/hle/kernel/physical_core.cpp')
| -rw-r--r-- | src/core/hle/kernel/physical_core.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/core/hle/kernel/physical_core.cpp b/src/core/hle/kernel/physical_core.cpp index 04f0010688..77cdab76d7 100644 --- a/src/core/hle/kernel/physical_core.cpp +++ b/src/core/hle/kernel/physical_core.cpp @@ -103,12 +103,26 @@ void PhysicalCore::RunThread(Kernel::KThread* thread) { const bool data_abort = True(hr & Core::HaltReason::DataAbort); const bool interrupt = True(hr & Core::HaltReason::BreakLoop); + bool may_abort = true; // Ignore aborting virtual functions (for debugging) + if (prefetch_abort && ::Settings::values.vtable_bouncing) { + auto& lock = m_kernel.GlobalSchedulerContext().SchedulerLock(); + lock.Lock(); + Kernel::Svc::ThreadContext ctx; + interface->GetContext(ctx); + LOG_WARNING(Core_ARM, "vtable bouncing {:016X}", ctx.lr); + ctx.pc = ctx.lr; + ctx.r[0] = 0; + interface->SetContext(ctx); + lock.Unlock(); + may_abort = false; + } + // Since scheduling may occur here, we cannot use any cached // state after returning from calls we make. // Notify the debugger and go to sleep if a breakpoint was hit, // or if the thread is unable to continue for any reason. - if (breakpoint || prefetch_abort) { + if (breakpoint || (prefetch_abort && may_abort)) { if (breakpoint) { interface->RewindBreakpointInstruction(); } |
