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;