|
@@ -1219,12 +1219,6 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
|
|
|
"threadpriority=0x{:08X}, processorid=0x{:08X} : created handle=0x{:08X}",
|
|
"threadpriority=0x{:08X}, processorid=0x{:08X} : created handle=0x{:08X}",
|
|
|
entry_point, arg, stack_top, priority, processor_id, *out_handle);
|
|
entry_point, arg, stack_top, priority, processor_id, *out_handle);
|
|
|
|
|
|
|
|
- if (priority > THREADPRIO_LOWEST) {
|
|
|
|
|
- LOG_ERROR(Kernel_SVC, "An invalid priority was specified, expected {} but got {}",
|
|
|
|
|
- THREADPRIO_LOWEST, priority);
|
|
|
|
|
- return ERR_INVALID_THREAD_PRIORITY;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
auto* const current_process = Core::CurrentProcess();
|
|
auto* const current_process = Core::CurrentProcess();
|
|
|
|
|
|
|
|
if (processor_id == THREADPROCESSORID_IDEAL) {
|
|
if (processor_id == THREADPROCESSORID_IDEAL) {
|
|
@@ -1238,6 +1232,23 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
|
|
|
return ERR_INVALID_PROCESSOR_ID;
|
|
return ERR_INVALID_PROCESSOR_ID;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ const u64 core_mask = current_process->GetCoreMask();
|
|
|
|
|
+ if ((core_mask | (1ULL << processor_id)) != core_mask) {
|
|
|
|
|
+ LOG_ERROR(Kernel_SVC, "Invalid thread core specified ({})", processor_id);
|
|
|
|
|
+ return ERR_INVALID_PROCESSOR_ID;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (priority > THREADPRIO_LOWEST) {
|
|
|
|
|
+ LOG_ERROR(Kernel_SVC, "An invalid priority was specified, expected {} but got {}",
|
|
|
|
|
+ THREADPRIO_LOWEST, priority);
|
|
|
|
|
+ return ERR_INVALID_THREAD_PRIORITY;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (((1ULL << priority) & current_process->GetPriorityMask()) == 0) {
|
|
|
|
|
+ LOG_ERROR(Kernel_SVC, "Invalid thread priority specified ({})", priority);
|
|
|
|
|
+ return ERR_INVALID_THREAD_PRIORITY;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const std::string name = fmt::format("thread-{:X}", entry_point);
|
|
const std::string name = fmt::format("thread-{:X}", entry_point);
|
|
|
auto& kernel = Core::System::GetInstance().Kernel();
|
|
auto& kernel = Core::System::GetInstance().Kernel();
|
|
|
CASCADE_RESULT(SharedPtr<Thread> thread,
|
|
CASCADE_RESULT(SharedPtr<Thread> thread,
|