diff options
| author | 2018-10-05 13:41:54 -0400 | |
|---|---|---|
| committer | 2018-10-05 13:41:54 -0400 | |
| commit | e51d715700a35a8f14e5b804b6f7553c9a40888b (patch) | |
| tree | 96917effcab47b089718a90851b2b203717d324a /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #1442 from lioncash/format (diff) | |
| parent | kernel/thread: Make all instance variables private (diff) | |
| download | yuzu-e51d715700a35a8f14e5b804b6f7553c9a40888b.tar.gz yuzu-e51d715700a35a8f14e5b804b6f7553c9a40888b.tar.xz yuzu-e51d715700a35a8f14e5b804b6f7553c9a40888b.zip | |
Merge pull request #1439 from lioncash/thread
kernel/thread: Make all instance variables private
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 121 |
1 files changed, 64 insertions, 57 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 1cdaa740a..6c4af7e47 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -156,7 +156,7 @@ static ResultCode GetThreadId(u32* thread_id, Handle thread_handle) { | |||
| 156 | return ERR_INVALID_HANDLE; | 156 | return ERR_INVALID_HANDLE; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | *thread_id = thread->GetThreadId(); | 159 | *thread_id = thread->GetThreadID(); |
| 160 | return RESULT_SUCCESS; | 160 | return RESULT_SUCCESS; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| @@ -177,7 +177,7 @@ static ResultCode GetProcessId(u32* process_id, Handle process_handle) { | |||
| 177 | /// Default thread wakeup callback for WaitSynchronization | 177 | /// Default thread wakeup callback for WaitSynchronization |
| 178 | static bool DefaultThreadWakeupCallback(ThreadWakeupReason reason, SharedPtr<Thread> thread, | 178 | static bool DefaultThreadWakeupCallback(ThreadWakeupReason reason, SharedPtr<Thread> thread, |
| 179 | SharedPtr<WaitObject> object, std::size_t index) { | 179 | SharedPtr<WaitObject> object, std::size_t index) { |
| 180 | ASSERT(thread->status == ThreadStatus::WaitSynchAny); | 180 | ASSERT(thread->GetStatus() == ThreadStatus::WaitSynchAny); |
| 181 | 181 | ||
| 182 | if (reason == ThreadWakeupReason::Timeout) { | 182 | if (reason == ThreadWakeupReason::Timeout) { |
| 183 | thread->SetWaitSynchronizationResult(RESULT_TIMEOUT); | 183 | thread->SetWaitSynchronizationResult(RESULT_TIMEOUT); |
| @@ -204,10 +204,10 @@ static ResultCode WaitSynchronization(Handle* index, VAddr handles_address, u64 | |||
| 204 | if (handle_count > MaxHandles) | 204 | if (handle_count > MaxHandles) |
| 205 | return ResultCode(ErrorModule::Kernel, ErrCodes::TooLarge); | 205 | return ResultCode(ErrorModule::Kernel, ErrCodes::TooLarge); |
| 206 | 206 | ||
| 207 | auto thread = GetCurrentThread(); | 207 | auto* const thread = GetCurrentThread(); |
| 208 | 208 | ||
| 209 | using ObjectPtr = SharedPtr<WaitObject>; | 209 | using ObjectPtr = Thread::ThreadWaitObjects::value_type; |
| 210 | std::vector<ObjectPtr> objects(handle_count); | 210 | Thread::ThreadWaitObjects objects(handle_count); |
| 211 | auto& kernel = Core::System::GetInstance().Kernel(); | 211 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 212 | 212 | ||
| 213 | for (u64 i = 0; i < handle_count; ++i) { | 213 | for (u64 i = 0; i < handle_count; ++i) { |
| @@ -244,14 +244,14 @@ static ResultCode WaitSynchronization(Handle* index, VAddr handles_address, u64 | |||
| 244 | for (auto& object : objects) | 244 | for (auto& object : objects) |
| 245 | object->AddWaitingThread(thread); | 245 | object->AddWaitingThread(thread); |
| 246 | 246 | ||
| 247 | thread->wait_objects = std::move(objects); | 247 | thread->SetWaitObjects(std::move(objects)); |
| 248 | thread->status = ThreadStatus::WaitSynchAny; | 248 | thread->SetStatus(ThreadStatus::WaitSynchAny); |
| 249 | 249 | ||
| 250 | // Create an event to wake the thread up after the specified nanosecond delay has passed | 250 | // Create an event to wake the thread up after the specified nanosecond delay has passed |
| 251 | thread->WakeAfterDelay(nano_seconds); | 251 | thread->WakeAfterDelay(nano_seconds); |
| 252 | thread->wakeup_callback = DefaultThreadWakeupCallback; | 252 | thread->SetWakeupCallback(DefaultThreadWakeupCallback); |
| 253 | 253 | ||
| 254 | Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule(); | 254 | Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule(); |
| 255 | 255 | ||
| 256 | return RESULT_TIMEOUT; | 256 | return RESULT_TIMEOUT; |
| 257 | } | 257 | } |
| @@ -266,7 +266,7 @@ static ResultCode CancelSynchronization(Handle thread_handle) { | |||
| 266 | return ERR_INVALID_HANDLE; | 266 | return ERR_INVALID_HANDLE; |
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | ASSERT(thread->status == ThreadStatus::WaitSynchAny); | 269 | ASSERT(thread->GetStatus() == ThreadStatus::WaitSynchAny); |
| 270 | thread->SetWaitSynchronizationResult( | 270 | thread->SetWaitSynchronizationResult( |
| 271 | ResultCode(ErrorModule::Kernel, ErrCodes::SynchronizationCanceled)); | 271 | ResultCode(ErrorModule::Kernel, ErrCodes::SynchronizationCanceled)); |
| 272 | thread->ResumeFromWait(); | 272 | thread->ResumeFromWait(); |
| @@ -425,7 +425,7 @@ static ResultCode GetThreadContext(VAddr thread_context, Handle handle) { | |||
| 425 | } | 425 | } |
| 426 | 426 | ||
| 427 | const auto current_process = Core::CurrentProcess(); | 427 | const auto current_process = Core::CurrentProcess(); |
| 428 | if (thread->owner_process != current_process) { | 428 | if (thread->GetOwnerProcess() != current_process) { |
| 429 | return ERR_INVALID_HANDLE; | 429 | return ERR_INVALID_HANDLE; |
| 430 | } | 430 | } |
| 431 | 431 | ||
| @@ -433,7 +433,7 @@ static ResultCode GetThreadContext(VAddr thread_context, Handle handle) { | |||
| 433 | return ERR_ALREADY_REGISTERED; | 433 | return ERR_ALREADY_REGISTERED; |
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | Core::ARM_Interface::ThreadContext ctx = thread->context; | 436 | Core::ARM_Interface::ThreadContext ctx = thread->GetContext(); |
| 437 | // Mask away mode bits, interrupt bits, IL bit, and other reserved bits. | 437 | // Mask away mode bits, interrupt bits, IL bit, and other reserved bits. |
| 438 | ctx.pstate &= 0xFF0FFE20; | 438 | ctx.pstate &= 0xFF0FFE20; |
| 439 | 439 | ||
| @@ -479,14 +479,14 @@ static ResultCode SetThreadPriority(Handle handle, u32 priority) { | |||
| 479 | 479 | ||
| 480 | thread->SetPriority(priority); | 480 | thread->SetPriority(priority); |
| 481 | 481 | ||
| 482 | Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule(); | 482 | Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule(); |
| 483 | return RESULT_SUCCESS; | 483 | return RESULT_SUCCESS; |
| 484 | } | 484 | } |
| 485 | 485 | ||
| 486 | /// Get which CPU core is executing the current thread | 486 | /// Get which CPU core is executing the current thread |
| 487 | static u32 GetCurrentProcessorNumber() { | 487 | static u32 GetCurrentProcessorNumber() { |
| 488 | LOG_TRACE(Kernel_SVC, "called"); | 488 | LOG_TRACE(Kernel_SVC, "called"); |
| 489 | return GetCurrentThread()->processor_id; | 489 | return GetCurrentThread()->GetProcessorID(); |
| 490 | } | 490 | } |
| 491 | 491 | ||
| 492 | static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size, | 492 | static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size, |
| @@ -622,10 +622,14 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V | |||
| 622 | CASCADE_RESULT(SharedPtr<Thread> thread, | 622 | CASCADE_RESULT(SharedPtr<Thread> thread, |
| 623 | Thread::Create(kernel, name, entry_point, priority, arg, processor_id, stack_top, | 623 | Thread::Create(kernel, name, entry_point, priority, arg, processor_id, stack_top, |
| 624 | Core::CurrentProcess())); | 624 | Core::CurrentProcess())); |
| 625 | CASCADE_RESULT(thread->guest_handle, kernel.HandleTable().Create(thread)); | 625 | const auto new_guest_handle = kernel.HandleTable().Create(thread); |
| 626 | *out_handle = thread->guest_handle; | 626 | if (new_guest_handle.Failed()) { |
| 627 | return new_guest_handle.Code(); | ||
| 628 | } | ||
| 629 | thread->SetGuestHandle(*new_guest_handle); | ||
| 630 | *out_handle = *new_guest_handle; | ||
| 627 | 631 | ||
| 628 | Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule(); | 632 | Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule(); |
| 629 | 633 | ||
| 630 | LOG_TRACE(Kernel_SVC, | 634 | LOG_TRACE(Kernel_SVC, |
| 631 | "called entrypoint=0x{:08X} ({}), arg=0x{:08X}, stacktop=0x{:08X}, " | 635 | "called entrypoint=0x{:08X} ({}), arg=0x{:08X}, stacktop=0x{:08X}, " |
| @@ -645,10 +649,10 @@ static ResultCode StartThread(Handle thread_handle) { | |||
| 645 | return ERR_INVALID_HANDLE; | 649 | return ERR_INVALID_HANDLE; |
| 646 | } | 650 | } |
| 647 | 651 | ||
| 648 | ASSERT(thread->status == ThreadStatus::Dormant); | 652 | ASSERT(thread->GetStatus() == ThreadStatus::Dormant); |
| 649 | 653 | ||
| 650 | thread->ResumeFromWait(); | 654 | thread->ResumeFromWait(); |
| 651 | Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule(); | 655 | Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule(); |
| 652 | 656 | ||
| 653 | return RESULT_SUCCESS; | 657 | return RESULT_SUCCESS; |
| 654 | } | 658 | } |
| @@ -694,17 +698,17 @@ static ResultCode WaitProcessWideKeyAtomic(VAddr mutex_addr, VAddr condition_var | |||
| 694 | CASCADE_CODE(Mutex::Release(mutex_addr)); | 698 | CASCADE_CODE(Mutex::Release(mutex_addr)); |
| 695 | 699 | ||
| 696 | SharedPtr<Thread> current_thread = GetCurrentThread(); | 700 | SharedPtr<Thread> current_thread = GetCurrentThread(); |
| 697 | current_thread->condvar_wait_address = condition_variable_addr; | 701 | current_thread->SetCondVarWaitAddress(condition_variable_addr); |
| 698 | current_thread->mutex_wait_address = mutex_addr; | 702 | current_thread->SetMutexWaitAddress(mutex_addr); |
| 699 | current_thread->wait_handle = thread_handle; | 703 | current_thread->SetWaitHandle(thread_handle); |
| 700 | current_thread->status = ThreadStatus::WaitMutex; | 704 | current_thread->SetStatus(ThreadStatus::WaitMutex); |
| 701 | current_thread->wakeup_callback = nullptr; | 705 | current_thread->InvalidateWakeupCallback(); |
| 702 | 706 | ||
| 703 | current_thread->WakeAfterDelay(nano_seconds); | 707 | current_thread->WakeAfterDelay(nano_seconds); |
| 704 | 708 | ||
| 705 | // Note: Deliberately don't attempt to inherit the lock owner's priority. | 709 | // Note: Deliberately don't attempt to inherit the lock owner's priority. |
| 706 | 710 | ||
| 707 | Core::System::GetInstance().CpuCore(current_thread->processor_id).PrepareReschedule(); | 711 | Core::System::GetInstance().CpuCore(current_thread->GetProcessorID()).PrepareReschedule(); |
| 708 | return RESULT_SUCCESS; | 712 | return RESULT_SUCCESS; |
| 709 | } | 713 | } |
| 710 | 714 | ||
| @@ -713,14 +717,14 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 713 | LOG_TRACE(Kernel_SVC, "called, condition_variable_addr=0x{:X}, target=0x{:08X}", | 717 | LOG_TRACE(Kernel_SVC, "called, condition_variable_addr=0x{:X}, target=0x{:08X}", |
| 714 | condition_variable_addr, target); | 718 | condition_variable_addr, target); |
| 715 | 719 | ||
| 716 | auto RetrieveWaitingThreads = [](std::size_t core_index, | 720 | const auto RetrieveWaitingThreads = [](std::size_t core_index, |
| 717 | std::vector<SharedPtr<Thread>>& waiting_threads, | 721 | std::vector<SharedPtr<Thread>>& waiting_threads, |
| 718 | VAddr condvar_addr) { | 722 | VAddr condvar_addr) { |
| 719 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); | 723 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); |
| 720 | auto& thread_list = scheduler->GetThreadList(); | 724 | const auto& thread_list = scheduler->GetThreadList(); |
| 721 | 725 | ||
| 722 | for (auto& thread : thread_list) { | 726 | for (const auto& thread : thread_list) { |
| 723 | if (thread->condvar_wait_address == condvar_addr) | 727 | if (thread->GetCondVarWaitAddress() == condvar_addr) |
| 724 | waiting_threads.push_back(thread); | 728 | waiting_threads.push_back(thread); |
| 725 | } | 729 | } |
| 726 | }; | 730 | }; |
| @@ -734,7 +738,7 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 734 | // Sort them by priority, such that the highest priority ones come first. | 738 | // Sort them by priority, such that the highest priority ones come first. |
| 735 | std::sort(waiting_threads.begin(), waiting_threads.end(), | 739 | std::sort(waiting_threads.begin(), waiting_threads.end(), |
| 736 | [](const SharedPtr<Thread>& lhs, const SharedPtr<Thread>& rhs) { | 740 | [](const SharedPtr<Thread>& lhs, const SharedPtr<Thread>& rhs) { |
| 737 | return lhs->current_priority < rhs->current_priority; | 741 | return lhs->GetPriority() < rhs->GetPriority(); |
| 738 | }); | 742 | }); |
| 739 | 743 | ||
| 740 | // Only process up to 'target' threads, unless 'target' is -1, in which case process | 744 | // Only process up to 'target' threads, unless 'target' is -1, in which case process |
| @@ -750,7 +754,7 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 750 | for (std::size_t index = 0; index < last; ++index) { | 754 | for (std::size_t index = 0; index < last; ++index) { |
| 751 | auto& thread = waiting_threads[index]; | 755 | auto& thread = waiting_threads[index]; |
| 752 | 756 | ||
| 753 | ASSERT(thread->condvar_wait_address == condition_variable_addr); | 757 | ASSERT(thread->GetCondVarWaitAddress() == condition_variable_addr); |
| 754 | 758 | ||
| 755 | std::size_t current_core = Core::System::GetInstance().CurrentCoreIndex(); | 759 | std::size_t current_core = Core::System::GetInstance().CurrentCoreIndex(); |
| 756 | 760 | ||
| @@ -759,42 +763,43 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 759 | // Atomically read the value of the mutex. | 763 | // Atomically read the value of the mutex. |
| 760 | u32 mutex_val = 0; | 764 | u32 mutex_val = 0; |
| 761 | do { | 765 | do { |
| 762 | monitor.SetExclusive(current_core, thread->mutex_wait_address); | 766 | monitor.SetExclusive(current_core, thread->GetMutexWaitAddress()); |
| 763 | 767 | ||
| 764 | // If the mutex is not yet acquired, acquire it. | 768 | // If the mutex is not yet acquired, acquire it. |
| 765 | mutex_val = Memory::Read32(thread->mutex_wait_address); | 769 | mutex_val = Memory::Read32(thread->GetMutexWaitAddress()); |
| 766 | 770 | ||
| 767 | if (mutex_val != 0) { | 771 | if (mutex_val != 0) { |
| 768 | monitor.ClearExclusive(); | 772 | monitor.ClearExclusive(); |
| 769 | break; | 773 | break; |
| 770 | } | 774 | } |
| 771 | } while (!monitor.ExclusiveWrite32(current_core, thread->mutex_wait_address, | 775 | } while (!monitor.ExclusiveWrite32(current_core, thread->GetMutexWaitAddress(), |
| 772 | thread->wait_handle)); | 776 | thread->GetWaitHandle())); |
| 773 | 777 | ||
| 774 | if (mutex_val == 0) { | 778 | if (mutex_val == 0) { |
| 775 | // We were able to acquire the mutex, resume this thread. | 779 | // We were able to acquire the mutex, resume this thread. |
| 776 | ASSERT(thread->status == ThreadStatus::WaitMutex); | 780 | ASSERT(thread->GetStatus() == ThreadStatus::WaitMutex); |
| 777 | thread->ResumeFromWait(); | 781 | thread->ResumeFromWait(); |
| 778 | 782 | ||
| 779 | auto lock_owner = thread->lock_owner; | 783 | auto* const lock_owner = thread->GetLockOwner(); |
| 780 | if (lock_owner) | 784 | if (lock_owner != nullptr) { |
| 781 | lock_owner->RemoveMutexWaiter(thread); | 785 | lock_owner->RemoveMutexWaiter(thread); |
| 786 | } | ||
| 782 | 787 | ||
| 783 | thread->lock_owner = nullptr; | 788 | thread->SetLockOwner(nullptr); |
| 784 | thread->mutex_wait_address = 0; | 789 | thread->SetMutexWaitAddress(0); |
| 785 | thread->condvar_wait_address = 0; | 790 | thread->SetCondVarWaitAddress(0); |
| 786 | thread->wait_handle = 0; | 791 | thread->SetWaitHandle(0); |
| 787 | } else { | 792 | } else { |
| 788 | // Atomically signal that the mutex now has a waiting thread. | 793 | // Atomically signal that the mutex now has a waiting thread. |
| 789 | do { | 794 | do { |
| 790 | monitor.SetExclusive(current_core, thread->mutex_wait_address); | 795 | monitor.SetExclusive(current_core, thread->GetMutexWaitAddress()); |
| 791 | 796 | ||
| 792 | // Ensure that the mutex value is still what we expect. | 797 | // Ensure that the mutex value is still what we expect. |
| 793 | u32 value = Memory::Read32(thread->mutex_wait_address); | 798 | u32 value = Memory::Read32(thread->GetMutexWaitAddress()); |
| 794 | // TODO(Subv): When this happens, the kernel just clears the exclusive state and | 799 | // TODO(Subv): When this happens, the kernel just clears the exclusive state and |
| 795 | // retries the initial read for this thread. | 800 | // retries the initial read for this thread. |
| 796 | ASSERT_MSG(mutex_val == value, "Unhandled synchronization primitive case"); | 801 | ASSERT_MSG(mutex_val == value, "Unhandled synchronization primitive case"); |
| 797 | } while (!monitor.ExclusiveWrite32(current_core, thread->mutex_wait_address, | 802 | } while (!monitor.ExclusiveWrite32(current_core, thread->GetMutexWaitAddress(), |
| 798 | mutex_val | Mutex::MutexHasWaitersFlag)); | 803 | mutex_val | Mutex::MutexHasWaitersFlag)); |
| 799 | 804 | ||
| 800 | // The mutex is already owned by some other thread, make this thread wait on it. | 805 | // The mutex is already owned by some other thread, make this thread wait on it. |
| @@ -802,12 +807,12 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 802 | Handle owner_handle = static_cast<Handle>(mutex_val & Mutex::MutexOwnerMask); | 807 | Handle owner_handle = static_cast<Handle>(mutex_val & Mutex::MutexOwnerMask); |
| 803 | auto owner = kernel.HandleTable().Get<Thread>(owner_handle); | 808 | auto owner = kernel.HandleTable().Get<Thread>(owner_handle); |
| 804 | ASSERT(owner); | 809 | ASSERT(owner); |
| 805 | ASSERT(thread->status == ThreadStatus::WaitMutex); | 810 | ASSERT(thread->GetStatus() == ThreadStatus::WaitMutex); |
| 806 | thread->wakeup_callback = nullptr; | 811 | thread->InvalidateWakeupCallback(); |
| 807 | 812 | ||
| 808 | owner->AddMutexWaiter(thread); | 813 | owner->AddMutexWaiter(thread); |
| 809 | 814 | ||
| 810 | Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule(); | 815 | Core::System::GetInstance().CpuCore(thread->GetProcessorID()).PrepareReschedule(); |
| 811 | } | 816 | } |
| 812 | } | 817 | } |
| 813 | 818 | ||
| @@ -913,8 +918,8 @@ static ResultCode GetThreadCoreMask(Handle thread_handle, u32* core, u64* mask) | |||
| 913 | return ERR_INVALID_HANDLE; | 918 | return ERR_INVALID_HANDLE; |
| 914 | } | 919 | } |
| 915 | 920 | ||
| 916 | *core = thread->ideal_core; | 921 | *core = thread->GetIdealCore(); |
| 917 | *mask = thread->affinity_mask; | 922 | *mask = thread->GetAffinityMask(); |
| 918 | 923 | ||
| 919 | return RESULT_SUCCESS; | 924 | return RESULT_SUCCESS; |
| 920 | } | 925 | } |
| @@ -930,11 +935,13 @@ static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) { | |||
| 930 | } | 935 | } |
| 931 | 936 | ||
| 932 | if (core == static_cast<u32>(THREADPROCESSORID_DEFAULT)) { | 937 | if (core == static_cast<u32>(THREADPROCESSORID_DEFAULT)) { |
| 933 | ASSERT(thread->owner_process->GetDefaultProcessorID() != | 938 | const u8 default_processor_id = thread->GetOwnerProcess()->GetDefaultProcessorID(); |
| 934 | static_cast<u8>(THREADPROCESSORID_DEFAULT)); | 939 | |
| 940 | ASSERT(default_processor_id != static_cast<u8>(THREADPROCESSORID_DEFAULT)); | ||
| 941 | |||
| 935 | // Set the target CPU to the one specified in the process' exheader. | 942 | // Set the target CPU to the one specified in the process' exheader. |
| 936 | core = thread->owner_process->GetDefaultProcessorID(); | 943 | core = default_processor_id; |
| 937 | mask = 1ull << core; | 944 | mask = 1ULL << core; |
| 938 | } | 945 | } |
| 939 | 946 | ||
| 940 | if (mask == 0) { | 947 | if (mask == 0) { |
| @@ -945,7 +952,7 @@ static ResultCode SetThreadCoreMask(Handle thread_handle, u32 core, u64 mask) { | |||
| 945 | static constexpr u32 OnlyChangeMask = static_cast<u32>(-3); | 952 | static constexpr u32 OnlyChangeMask = static_cast<u32>(-3); |
| 946 | 953 | ||
| 947 | if (core == OnlyChangeMask) { | 954 | if (core == OnlyChangeMask) { |
| 948 | core = thread->ideal_core; | 955 | core = thread->GetIdealCore(); |
| 949 | } else if (core >= Core::NUM_CPU_CORES && core != static_cast<u32>(-1)) { | 956 | } else if (core >= Core::NUM_CPU_CORES && core != static_cast<u32>(-1)) { |
| 950 | return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidProcessorId); | 957 | return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidProcessorId); |
| 951 | } | 958 | } |