From d1f9c750a657ab47d4443230d9fb3e3b9d5d0be1 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 30 May 2018 11:32:46 -0500 Subject: Kernel/Thread: Corrected a typo in an assert about the processor id. --- src/core/hle/kernel/thread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core') diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 46fcdefb8..391d8990f 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -476,7 +476,7 @@ void Thread::ChangeCore(u32 core, u64 mask) { new_processor_id = ideal_core; } - ASSERT(new_processor_id < 4); + ASSERT(*new_processor_id < 4); // Add thread to new core's scheduler auto& next_scheduler = Core::System().GetInstance().Scheduler(*new_processor_id); -- cgit v1.2.3 From 3957b0c34e3060277a182c9ade3f4b69c0b7061c Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 30 May 2018 12:03:19 -0500 Subject: Kernel/SVC: Support special core values -2 and -3 in svcSetThreadCoreMask. Also added some proper error handling. --- src/core/hle/kernel/errors.h | 2 ++ src/core/hle/kernel/svc.cpp | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'src/core') diff --git a/src/core/hle/kernel/errors.h b/src/core/hle/kernel/errors.h index 5be20c878..e1b5430bf 100644 --- a/src/core/hle/kernel/errors.h +++ b/src/core/hle/kernel/errors.h @@ -21,7 +21,9 @@ enum { // Confirmed Switch OS error codes MisalignedAddress = 102, + InvalidProcessorId = 113, InvalidHandle = 114, + InvalidCombination = 116, Timeout = 117, SynchronizationCanceled = 118, TooLarge = 119, 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) } static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) { - NGLOG_TRACE(Kernel_SVC, "called, handle=0x{:08X}, mask=0x{:08X}, core=0x{:X}", thread_handle, + NGLOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, mask=0x{:16X}, core=0x{:X}", thread_handle, mask, core); const SharedPtr thread = g_handle_table.Get(thread_handle); @@ -740,6 +740,31 @@ static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) { return ERR_INVALID_HANDLE; } + if (core == THREADPROCESSORID_DEFAULT) { + ASSERT(thread->owner_process->ideal_processor != THREADPROCESSORID_DEFAULT); + // Set the target CPU to the one specified in the process' exheader. + core = thread->owner_process->ideal_processor; + mask = 1 << core; + } + + if (mask == 0) { + return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidCombination); + } + + /// This value is used to only change the affinity mask without changing the current ideal core. + static constexpr u32 OnlyChangeMask = static_cast(-3); + + if (core == OnlyChangeMask) { + core = thread->ideal_core; + } else if (core >= Core::NUM_CPU_CORES && core != -1) { + return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidProcessorId); + } + + // Error out if the input core isn't enabled in the input mask. + if (core < Core::NUM_CPU_CORES && (mask & (1 << core)) == 0) { + return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidCombination); + } + thread->ChangeCore(core, mask); return RESULT_SUCCESS; -- cgit v1.2.3 From c02d7c8ce7c7b0c80cdeb5b070be2ebd855741ff Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 30 May 2018 13:33:57 -0500 Subject: Kernel/Thread: Corrected a typo that caused the affinity mask to never be changed. --- src/core/hle/kernel/thread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core') diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 391d8990f..0075e4a0f 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -460,13 +460,13 @@ void Thread::UpdatePriority() { void Thread::ChangeCore(u32 core, u64 mask) { ideal_core = core; - mask = mask; + affinity_mask = mask; if (status != THREADSTATUS_READY) { return; } - boost::optional new_processor_id{GetNextProcessorId(mask)}; + boost::optional new_processor_id{GetNextProcessorId(affinity_mask)}; if (!new_processor_id) { new_processor_id = processor_id; -- cgit v1.2.3