SVC: Correct GetThreadPriority, SetThreadPriority, GetThreadCoreMask, SetThreadCoreMask, GetCurrentProcessorNumber
This commit is contained in:
		
							parent
							
								
									49ba563995
								
							
						
					
					
						commit
						589f9cf108
					
				| @ -467,6 +467,14 @@ const Kernel::Scheduler& System::CurrentScheduler() const { | ||||
|     return impl->CurrentPhysicalCore().Scheduler(); | ||||
| } | ||||
| 
 | ||||
| Kernel::PhysicalCore& System::CurrentPhysicalCore() { | ||||
|     return impl->CurrentPhysicalCore(); | ||||
| } | ||||
| 
 | ||||
| const Kernel::PhysicalCore& System::CurrentPhysicalCore() const { | ||||
|     return impl->CurrentPhysicalCore(); | ||||
| } | ||||
| 
 | ||||
| Kernel::Scheduler& System::Scheduler(std::size_t core_index) { | ||||
|     return impl->GetPhysicalCore(core_index).Scheduler(); | ||||
| } | ||||
|  | ||||
| @ -27,6 +27,7 @@ class VfsFilesystem; | ||||
| namespace Kernel { | ||||
| class GlobalScheduler; | ||||
| class KernelCore; | ||||
| class PhysicalCore; | ||||
| class Process; | ||||
| class Scheduler; | ||||
| } // namespace Kernel
 | ||||
| @ -211,6 +212,12 @@ public: | ||||
|     /// Gets the scheduler for the CPU core that is currently running
 | ||||
|     const Kernel::Scheduler& CurrentScheduler() const; | ||||
| 
 | ||||
|     /// Gets the physical core for the CPU core that is currently running
 | ||||
|     Kernel::PhysicalCore& CurrentPhysicalCore(); | ||||
| 
 | ||||
|     /// Gets the physical core for the CPU core that is currently running
 | ||||
|     const Kernel::PhysicalCore& CurrentPhysicalCore() const; | ||||
| 
 | ||||
|     /// Gets a reference to an ARM interface for the CPU core with the specified index
 | ||||
|     ARM_Interface& ArmInterface(std::size_t core_index); | ||||
| 
 | ||||
|  | ||||
| @ -27,6 +27,7 @@ | ||||
| #include "core/hle/kernel/memory/memory_block.h" | ||||
| #include "core/hle/kernel/memory/page_table.h" | ||||
| #include "core/hle/kernel/mutex.h" | ||||
| #include "core/hle/kernel/physical_core.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/resource_limit.h" | ||||
| @ -1071,6 +1072,7 @@ static ResultCode GetThreadPriority(Core::System& system, u32* priority, Handle | ||||
|     const auto& handle_table = system.Kernel().CurrentProcess()->GetHandleTable(); | ||||
|     const std::shared_ptr<Thread> thread = handle_table.Get<Thread>(handle); | ||||
|     if (!thread) { | ||||
|         *priority = 0; | ||||
|         LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}", handle); | ||||
|         return ERR_INVALID_HANDLE; | ||||
|     } | ||||
| @ -1105,14 +1107,13 @@ static ResultCode SetThreadPriority(Core::System& system, Handle handle, u32 pri | ||||
| 
 | ||||
|     thread->SetPriority(priority); | ||||
| 
 | ||||
|     system.PrepareReschedule(thread->GetProcessorID()); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| /// Get which CPU core is executing the current thread
 | ||||
| static u32 GetCurrentProcessorNumber(Core::System& system) { | ||||
|     LOG_TRACE(Kernel_SVC, "called"); | ||||
|     return system.CurrentScheduler().GetCurrentThread()->GetProcessorID(); | ||||
|     return static_cast<u32>(system.CurrentPhysicalCore().CoreIndex()); | ||||
| } | ||||
| 
 | ||||
| static ResultCode MapSharedMemory(Core::System& system, Handle shared_memory_handle, VAddr addr, | ||||
| @ -1430,8 +1431,8 @@ static ResultCode CreateThread(Core::System& system, Handle* out_handle, VAddr e | ||||
| 
 | ||||
|     ThreadType type = THREADTYPE_USER; | ||||
|     CASCADE_RESULT(std::shared_ptr<Thread> thread, | ||||
|                    Thread::Create(system, type, "", entry_point, priority, arg, processor_id, stack_top, | ||||
|                                   current_process)); | ||||
|                    Thread::Create(system, type, "", entry_point, priority, arg, processor_id, | ||||
|                                   stack_top, current_process)); | ||||
| 
 | ||||
|     const auto new_thread_handle = current_process->GetHandleTable().Create(thread); | ||||
|     if (new_thread_handle.Failed()) { | ||||
| @ -1804,6 +1805,8 @@ static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle, | ||||
|     if (!thread) { | ||||
|         LOG_ERROR(Kernel_SVC, "Thread handle does not exist, thread_handle=0x{:08X}", | ||||
|                   thread_handle); | ||||
|         *core = 0; | ||||
|         *mask = 0; | ||||
|         return ERR_INVALID_HANDLE; | ||||
|     } | ||||
| 
 | ||||
| @ -1866,11 +1869,7 @@ static ResultCode SetThreadCoreMask(Core::System& system, Handle thread_handle, | ||||
|         return ERR_INVALID_HANDLE; | ||||
|     } | ||||
| 
 | ||||
|     system.PrepareReschedule(thread->GetProcessorID()); | ||||
|     thread->ChangeCore(core, affinity_mask); | ||||
|     system.PrepareReschedule(thread->GetProcessorID()); | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
|     return thread->SetCoreAndAffinityMask(core, affinity_mask); | ||||
| } | ||||
| 
 | ||||
| static ResultCode CreateEvent(Core::System& system, Handle* write_handle, Handle* read_handle) { | ||||
|  | ||||
| @ -250,6 +250,7 @@ ResultVal<std::shared_ptr<Thread>> Thread::Create(Core::System& system, ThreadTy | ||||
| } | ||||
| 
 | ||||
| void Thread::SetPriority(u32 priority) { | ||||
|     SchedulerLock lock(kernel); | ||||
|     ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST, | ||||
|                "Invalid priority value."); | ||||
|     nominal_priority = priority; | ||||
| @ -383,10 +384,6 @@ void Thread::UpdatePriority() { | ||||
|     lock_owner->UpdatePriority(); | ||||
| } | ||||
| 
 | ||||
| void Thread::ChangeCore(u32 core, u64 mask) { | ||||
|     SetCoreAndAffinityMask(core, mask); | ||||
| } | ||||
| 
 | ||||
| bool Thread::AllSynchronizationObjectsReady() const { | ||||
|     return std::none_of(wait_objects.begin(), wait_objects.end(), | ||||
|                         [this](const std::shared_ptr<SynchronizationObject>& object) { | ||||
| @ -467,6 +464,7 @@ void Thread::SetCurrentPriority(u32 new_priority) { | ||||
| } | ||||
| 
 | ||||
| ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) { | ||||
|     SchedulerLock lock(kernel); | ||||
|     const auto HighestSetCore = [](u64 mask, u32 max_cores) { | ||||
|         for (s32 core = static_cast<s32>(max_cores - 1); core >= 0; core--) { | ||||
|             if (((mask >> core) & 1) != 0) { | ||||
|  | ||||
| @ -221,7 +221,7 @@ public: | ||||
|     void UpdatePriority(); | ||||
| 
 | ||||
|     /// Changes the core that the thread is running or scheduled to run on.
 | ||||
|     void ChangeCore(u32 core, u64 mask); | ||||
|     ResultCode SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Gets the thread's thread ID | ||||
| @ -522,7 +522,6 @@ private: | ||||
| 
 | ||||
|     void SetSchedulingStatus(ThreadSchedStatus new_status); | ||||
|     void SetCurrentPriority(u32 new_priority); | ||||
|     ResultCode SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask); | ||||
| 
 | ||||
|     void AdjustSchedulingOnAffinity(u64 old_affinity_mask, s32 old_core); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fernando Sahmkow
						Fernando Sahmkow