summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 0811a16b8..ec3601e8b 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -732,7 +732,7 @@ static ResultCode GetThreadCoreMask(Handle thread_handle, u32* core, u64* mask)
732} 732}
733 733
734static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) { 734static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) {
735 NGLOG_TRACE(Kernel_SVC, "called, handle=0x{:08X}, mask=0x{:08X}, core=0x{:X}", thread_handle, 735 NGLOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, mask=0x{:16X}, core=0x{:X}", thread_handle,
736 mask, core); 736 mask, core);
737 737
738 const SharedPtr<Thread> thread = g_handle_table.Get<Thread>(thread_handle); 738 const SharedPtr<Thread> thread = g_handle_table.Get<Thread>(thread_handle);
@@ -740,6 +740,31 @@ static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) {
740 return ERR_INVALID_HANDLE; 740 return ERR_INVALID_HANDLE;
741 } 741 }
742 742
743 if (core == THREADPROCESSORID_DEFAULT) {
744 ASSERT(thread->owner_process->ideal_processor != THREADPROCESSORID_DEFAULT);
745 // Set the target CPU to the one specified in the process' exheader.
746 core = thread->owner_process->ideal_processor;
747 mask = 1 << core;
748 }
749
750 if (mask == 0) {
751 return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidCombination);
752 }
753
754 /// This value is used to only change the affinity mask without changing the current ideal core.
755 static constexpr u32 OnlyChangeMask = static_cast<u32>(-3);
756
757 if (core == OnlyChangeMask) {
758 core = thread->ideal_core;
759 } else if (core >= Core::NUM_CPU_CORES && core != -1) {
760 return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidProcessorId);
761 }
762
763 // Error out if the input core isn't enabled in the input mask.
764 if (core < Core::NUM_CPU_CORES && (mask & (1 << core)) == 0) {
765 return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidCombination);
766 }
767
743 thread->ChangeCore(core, mask); 768 thread->ChangeCore(core, mask);
744 769
745 return RESULT_SUCCESS; 770 return RESULT_SUCCESS;