summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_interrupt_manager.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-12-30 06:40:38 +0100
committerbunnei <bunneidev@gmail.com>2021-12-31 00:50:45 +0100
commit3a89723d97b8e646cde569030057777813f4371c (patch)
treec08f00b1ebb21c3652f0e23ab28fe06c4678aa42 /src/core/hle/kernel/k_interrupt_manager.cpp
parentMerge pull request #7635 from bunnei/set-heap-size (diff)
downloadyuzu-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.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