diff options
| author | Fernando S <fsahmkow27@gmail.com> | 2022-01-03 02:01:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-03 02:01:26 +0100 |
| commit | da8e0f6571095e50aa58ec5c4e3a1bd60f90c581 (patch) | |
| tree | 89fba64305ac670d588576d6dab7e4e57709a11a /src/core/hle/kernel/k_interrupt_manager.cpp | |
| parent | 3fa9702952bc90c8ab1a215009a0ee765217459e (diff) | |
| parent | 3a89723d97b8e646cde569030057777813f4371c (diff) | |
Merge pull request #7648 from bunnei/thread-pinning
core: hle: kernel: Implement thread pinning.
Diffstat (limited to 'src/core/hle/kernel/k_interrupt_manager.cpp')
| -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 |
