summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2018-12-19 19:09:18 -0500
committerLioncash <mathew1800@gmail.com>2018-12-21 07:05:34 -0500
commit27caf7120444d1c34e1c2e322ab97ba9f5275b28 (patch)
treef84ed4a9178786c27ceddf9940e7be6e26f94d51
parent6ff5135521a59cd510ba3ecc8d5ff5d56cdbf08e (diff)
kernel/process_capability: Handle the priority mask and core mask flags
Handles the priority mask and core mask flags to allow building up the masks to determine the usable thread priorities and cores for a kernel process instance.
-rw-r--r--src/core/hle/kernel/process_capability.cpp31
-rw-r--r--src/core/hle/kernel/process_capability.h10
2 files changed, 40 insertions, 1 deletions
diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp
index 8d787547b..9f513b25b 100644
--- a/src/core/hle/kernel/process_capability.cpp
+++ b/src/core/hle/kernel/process_capability.cpp
@@ -205,7 +205,36 @@ void ProcessCapabilities::Clear() {
}
ResultCode ProcessCapabilities::HandlePriorityCoreNumFlags(u32 flags) {
- // TODO: Implement
+ if (priority_mask != 0 || core_mask != 0) {
+ return ERR_INVALID_CAPABILITY_DESCRIPTOR;
+ }
+
+ const u32 core_num_min = (flags >> 16) & 0xFF;
+ const u32 core_num_max = (flags >> 24) & 0xFF;
+ if (core_num_min > core_num_max) {
+ return ERR_INVALID_COMBINATION;
+ }
+
+ const u32 priority_min = (flags >> 10) & 0x3F;
+ const u32 priority_max = (flags >> 4) & 0x3F;
+ if (priority_min > priority_max) {
+ return ERR_INVALID_COMBINATION;
+ }
+
+ // The switch only has 4 usable cores.
+ if (core_num_max >= 4) {
+ return ERR_INVALID_PROCESSOR_ID;
+ }
+
+ const auto make_mask = [](u64 min, u64 max) {
+ const u64 range = max - min + 1;
+ const u64 mask = (1ULL << range) - 1;
+
+ return mask << min;
+ };
+
+ core_mask = make_mask(core_num_min, core_num_max);
+ priority_mask = make_mask(priority_min, priority_max);
return RESULT_SUCCESS;
}
diff --git a/src/core/hle/kernel/process_capability.h b/src/core/hle/kernel/process_capability.h
index 5cff10476..4b27ee8b9 100644
--- a/src/core/hle/kernel/process_capability.h
+++ b/src/core/hle/kernel/process_capability.h
@@ -122,6 +122,16 @@ public:
///
void InitializeForMetadatalessProcess();
+ /// Gets the allowable core mask
+ u64 GetCoreMask() const {
+ return core_mask;
+ }
+
+ /// Gets the allowable priority mask
+ u64 GetPriorityMask() const {
+ return priority_mask;
+ }
+
private:
/// Attempts to parse a given sequence of capability descriptors.
///