diff options
author | bunnei <bunneidev@gmail.com> | 2021-12-30 06:40:38 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2021-12-31 00:50:45 +0100 |
commit | 3a89723d97b8e646cde569030057777813f4371c (patch) | |
tree | c08f00b1ebb21c3652f0e23ab28fe06c4678aa42 /src/core/hle/kernel/k_interrupt_manager.cpp | |
parent | Merge pull request #7635 from bunnei/set-heap-size (diff) | |
download | yuzu-3a89723d97b8e646cde569030057777813f4371c.tar yuzu-3a89723d97b8e646cde569030057777813f4371c.tar.gz yuzu-3a89723d97b8e646cde569030057777813f4371c.tar.bz2 yuzu-3a89723d97b8e646cde569030057777813f4371c.tar.lz yuzu-3a89723d97b8e646cde569030057777813f4371c.tar.xz yuzu-3a89723d97b8e646cde569030057777813f4371c.tar.zst yuzu-3a89723d97b8e646cde569030057777813f4371c.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/kernel/k_interrupt_manager.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_interrupt_manager.cpp b/src/core/hle/kernel/k_interrupt_manager.cpp new file mode 100644 index 000000000..e5dd39751 --- /dev/null +++ b/src/core/hle/kernel/k_interrupt_manager.cpp @@ -0,0 +1,34 @@ +// Copyright 2021 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/kernel/k_interrupt_manager.h" +#include "core/hle/kernel/k_process.h" +#include "core/hle/kernel/k_scheduler.h" +#include "core/hle/kernel/k_thread.h" +#include "core/hle/kernel/kernel.h" + +namespace Kernel::KInterruptManager { + +void HandleInterrupt(KernelCore& kernel, s32 core_id) { + auto* process = kernel.CurrentProcess(); + if (!process) { + return; + } + + auto& scheduler = kernel.Scheduler(core_id); + auto& current_thread = *scheduler.GetCurrentThread(); + + // If the user disable count is set, we may need to pin the current thread. + if (current_thread.GetUserDisableCount() && !process->GetPinnedThread(core_id)) { + KScopedSchedulerLock sl{kernel}; + + // Pin the current thread. + process->PinCurrentThread(core_id); + + // Set the interrupt flag for the thread. + scheduler.GetCurrentThread()->SetInterruptFlag(); + } +} + +} // namespace Kernel::KInterruptManager |