Merge pull request #12025 from liamwhite/kernel-shutdown-deadlock
core: check for thread dpc before eret
This commit is contained in:
		| @@ -153,6 +153,14 @@ void ARM_Interface::Run() { | |||||||
|         Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; |         Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; | ||||||
|         HaltReason hr{}; |         HaltReason hr{}; | ||||||
|  |  | ||||||
|  |         // If the thread is scheduled for termination, exit the thread. | ||||||
|  |         if (current_thread->HasDpc()) { | ||||||
|  |             if (current_thread->IsTerminationRequested()) { | ||||||
|  |                 current_thread->Exit(); | ||||||
|  |                 UNREACHABLE(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // Notify the debugger and go to sleep if a step was performed |         // Notify the debugger and go to sleep if a step was performed | ||||||
|         // and this thread has been scheduled again. |         // and this thread has been scheduled again. | ||||||
|         if (current_thread->GetStepState() == StepState::StepPerformed) { |         if (current_thread->GetStepState() == StepState::StepPerformed) { | ||||||
| @@ -174,14 +182,6 @@ void ARM_Interface::Run() { | |||||||
|         } |         } | ||||||
|         system.ExitCPUProfile(); |         system.ExitCPUProfile(); | ||||||
|  |  | ||||||
|         // If the thread is scheduled for termination, exit the thread. |  | ||||||
|         if (current_thread->HasDpc()) { |  | ||||||
|             if (current_thread->IsTerminationRequested()) { |  | ||||||
|                 current_thread->Exit(); |  | ||||||
|                 UNREACHABLE(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // Notify the debugger and go to sleep if a breakpoint was hit, |         // Notify the debugger and go to sleep if a breakpoint was hit, | ||||||
|         // or if the thread is unable to continue for any reason. |         // or if the thread is unable to continue for any reason. | ||||||
|         if (True(hr & HaltReason::InstructionBreakpoint) || True(hr & HaltReason::PrefetchAbort)) { |         if (True(hr & HaltReason::InstructionBreakpoint) || True(hr & HaltReason::PrefetchAbort)) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user