3
0
Fork 0
forked from suyu/suyu

core: hle: kernel: k_interrupt_manager: HandleInterrupt should not depend on current process.

This commit is contained in:
bunnei 2022-10-02 02:06:13 -07:00
parent 8d4e026d05
commit 79bcb38321

View file

@ -11,25 +11,22 @@
namespace Kernel::KInterruptManager { namespace Kernel::KInterruptManager {
void HandleInterrupt(KernelCore& kernel, s32 core_id) { void HandleInterrupt(KernelCore& kernel, s32 core_id) {
auto* process = kernel.CurrentProcess();
if (!process) {
return;
}
// Acknowledge the interrupt. // Acknowledge the interrupt.
kernel.PhysicalCore(core_id).ClearInterrupt(); kernel.PhysicalCore(core_id).ClearInterrupt();
auto& current_thread = GetCurrentThread(kernel); auto& current_thread = GetCurrentThread(kernel);
// If the user disable count is set, we may need to pin the current thread. if (auto* process = kernel.CurrentProcess(); process) {
if (current_thread.GetUserDisableCount() && !process->GetPinnedThread(core_id)) { // If the user disable count is set, we may need to pin the current thread.
KScopedSchedulerLock sl{kernel}; if (current_thread.GetUserDisableCount() && !process->GetPinnedThread(core_id)) {
KScopedSchedulerLock sl{kernel};
// Pin the current thread. // Pin the current thread.
process->PinCurrentThread(core_id); process->PinCurrentThread(core_id);
// Set the interrupt flag for the thread. // Set the interrupt flag for the thread.
GetCurrentThread(kernel).SetInterruptFlag(); GetCurrentThread(kernel).SetInterruptFlag();
}
} }
// Request interrupt scheduling. // Request interrupt scheduling.