[nce] handles duplicate NCE interrupts (#4530)

- [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
- [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md).
- [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.

-------------------
Another crash observed in Ender Magnolia: A deadlock caused between CPUCore_0/GPU/GPUFencingThread.

CPUCore_0 waits for GPU work inside the NCE fault handler
GPU waits for the syncpoint mutex
GPUFencingThread holds that mutex while waiting for CPUCore_0 NCE interrupt lock

The fix makes duplicate interrupts return before acquiring the lock, while the first request keeps its original behavior.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4530
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
This commit is contained in:
xbzk
2026-10-26 17:24:45 +01:00
committed by crueter
parent 0e11fe8b5e
commit 5239cbe2a7
+2 -2
View File
@@ -369,8 +369,8 @@ void ArmNce::SetContext(const Kernel::Svc::ThreadContext& ctx) {
}
void ArmNce::SignalInterrupt(Kernel::KThread* thread) {
// Add break loop condition.
m_guest_ctx.esr_el1.fetch_or(static_cast<u64>(HaltReason::BreakLoop));
constexpr u64 break_loop = static_cast<u64>(HaltReason::BreakLoop);
if ((m_guest_ctx.esr_el1.fetch_or(break_loop) & break_loop) != 0) return;
auto* params = &thread->GetNativeExecutionParameters();
LockThreadParameters(params);