aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/k_interrupt_manager.cpp
diff options
context:
space:
mode:
authorFernando S <fsahmkow27@gmail.com>2022-01-03 02:01:26 +0100
committerGitHub <noreply@github.com>2022-01-03 02:01:26 +0100
commitda8e0f6571095e50aa58ec5c4e3a1bd60f90c581 (patch)
tree89fba64305ac670d588576d6dab7e4e57709a11a /src/core/hle/kernel/k_interrupt_manager.cpp
parent3fa9702952bc90c8ab1a215009a0ee765217459e (diff)
parent3a89723d97b8e646cde569030057777813f4371c (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.cpp34
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