diff --git a/Core/HLE/sceKernelInterrupt.h b/Core/HLE/sceKernelInterrupt.h index 7c0ef381ce..8532c1e4df 100644 --- a/Core/HLE/sceKernelInterrupt.h +++ b/Core/HLE/sceKernelInterrupt.h @@ -128,6 +128,7 @@ private: std::map<int, SubIntrHandler> subIntrHandlers; }; +bool __InterruptsEnabled(); bool __IsInInterrupt(); void __InterruptsInit(); void __InterruptsDoState(PointerWrap &p); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 064ef98c8f..1d7dcb8709 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1283,7 +1283,7 @@ Thread *__KernelNextThread() { void __KernelReSchedule(const char *reason) { // cancel rescheduling when in interrupt or callback, otherwise everything will be fucked up - if (__IsInInterrupt() || __KernelInCallback()) + if (__IsInInterrupt() || __KernelInCallback() || !__InterruptsEnabled()) { reason = "In Interrupt Or Callback"; return; @@ -1298,7 +1298,7 @@ void __KernelReSchedule(const char *reason) // Execute any pending events while we're doing scheduling. CoreTiming::AdvanceQuick(); - if (__IsInInterrupt() || __KernelInCallback()) + if (__IsInInterrupt() || __KernelInCallback() || !__InterruptsEnabled()) { reason = "In Interrupt Or Callback"; return;