aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/process_capability.cpp
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2018-12-19 20:38:29 -0500
committerLioncash <mathew1800@gmail.com>2018-12-21 07:05:34 -0500
commit1ae0cc696c676489ae82dfebd18a94b35d1512c7 (patch)
tree1631df2daa4691980348f44b0d72ea91a3a0a365 /src/core/hle/kernel/process_capability.cpp
parente638febf50a461d087f2c691ee78a173bcca5782 (diff)
kernel/process_capability: Handle interrupt capability flags
Similar to the service capability flags, however, we currently don't emulate the GIC, so this currently handles all interrupts as being valid for the time being.
Diffstat (limited to 'src/core/hle/kernel/process_capability.cpp')
-rw-r--r--src/core/hle/kernel/process_capability.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp
index 615b354c6a..e98157f9c0 100644
--- a/src/core/hle/kernel/process_capability.cpp
+++ b/src/core/hle/kernel/process_capability.cpp
@@ -278,7 +278,27 @@ ResultCode ProcessCapabilities::HandleMapIOFlags(u32 flags, VMManager& vm_manage
}
ResultCode ProcessCapabilities::HandleInterruptFlags(u32 flags) {
- // TODO: Implement
+ constexpr u32 interrupt_ignore_value = 0x3FF;
+ const u32 interrupt0 = (flags >> 12) & 0x3FF;
+ const u32 interrupt1 = (flags >> 22) & 0x3FF;
+
+ for (u32 interrupt : {interrupt0, interrupt1}) {
+ if (interrupt == interrupt_ignore_value) {
+ continue;
+ }
+
+ // NOTE:
+ // This should be checking a generic interrupt controller value
+ // as part of the calculation, however, given we don't currently
+ // emulate that, it's sufficient to mark every interrupt as defined.
+
+ if (interrupt >= interrupt_capabilities.size()) {
+ return ERR_OUT_OF_RANGE;
+ }
+
+ interrupt_capabilities[interrupt] = true;
+ }
+
return RESULT_SUCCESS;
}