|
|
@@ -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;
|
|
|
}
|
|
|
|