diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/k_condition_variable.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_light_lock.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_memory_layout.h | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.h | 22 |
5 files changed, 29 insertions, 11 deletions
diff --git a/src/core/hle/kernel/k_condition_variable.cpp b/src/core/hle/kernel/k_condition_variable.cpp index 124149697..0c6b20db3 100644 --- a/src/core/hle/kernel/k_condition_variable.cpp +++ b/src/core/hle/kernel/k_condition_variable.cpp | |||
| @@ -171,7 +171,7 @@ Result KConditionVariable::WaitForAddress(Handle handle, VAddr addr, u32 value) | |||
| 171 | R_UNLESS(owner_thread != nullptr, ResultInvalidHandle); | 171 | R_UNLESS(owner_thread != nullptr, ResultInvalidHandle); |
| 172 | 172 | ||
| 173 | // Update the lock. | 173 | // Update the lock. |
| 174 | cur_thread->SetAddressKey(addr, value); | 174 | cur_thread->SetUserAddressKey(addr, value); |
| 175 | owner_thread->AddWaiter(cur_thread); | 175 | owner_thread->AddWaiter(cur_thread); |
| 176 | 176 | ||
| 177 | // Begin waiting. | 177 | // Begin waiting. |
diff --git a/src/core/hle/kernel/k_light_lock.cpp b/src/core/hle/kernel/k_light_lock.cpp index 43185320d..d791acbe3 100644 --- a/src/core/hle/kernel/k_light_lock.cpp +++ b/src/core/hle/kernel/k_light_lock.cpp | |||
| @@ -68,7 +68,7 @@ bool KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) { | |||
| 68 | 68 | ||
| 69 | // Add the current thread as a waiter on the owner. | 69 | // Add the current thread as a waiter on the owner. |
| 70 | KThread* owner_thread = reinterpret_cast<KThread*>(_owner & ~1ULL); | 70 | KThread* owner_thread = reinterpret_cast<KThread*>(_owner & ~1ULL); |
| 71 | cur_thread->SetAddressKey(reinterpret_cast<uintptr_t>(std::addressof(tag))); | 71 | cur_thread->SetKernelAddressKey(reinterpret_cast<uintptr_t>(std::addressof(tag))); |
| 72 | owner_thread->AddWaiter(cur_thread); | 72 | owner_thread->AddWaiter(cur_thread); |
| 73 | 73 | ||
| 74 | // Begin waiting to hold the lock. | 74 | // Begin waiting to hold the lock. |
diff --git a/src/core/hle/kernel/k_memory_layout.h b/src/core/hle/kernel/k_memory_layout.h index fd6e1d3e6..17fa1a6ed 100644 --- a/src/core/hle/kernel/k_memory_layout.h +++ b/src/core/hle/kernel/k_memory_layout.h | |||
| @@ -67,9 +67,9 @@ constexpr size_t KernelPageBufferAdditionalSize = 0x33C000; | |||
| 67 | constexpr std::size_t KernelResourceSize = KernelPageTableHeapSize + KernelInitialPageHeapSize + | 67 | constexpr std::size_t KernelResourceSize = KernelPageTableHeapSize + KernelInitialPageHeapSize + |
| 68 | KernelSlabHeapSize + KernelPageBufferHeapSize; | 68 | KernelSlabHeapSize + KernelPageBufferHeapSize; |
| 69 | 69 | ||
| 70 | constexpr bool IsKernelAddressKey(VAddr key) { | 70 | //! NB: Use KThread::GetAddressKeyIsKernel(). |
| 71 | return KernelVirtualAddressSpaceBase <= key && key <= KernelVirtualAddressSpaceLast; | 71 | //! See explanation for deviation of GetAddressKey. |
| 72 | } | 72 | bool IsKernelAddressKey(VAddr key) = delete; |
| 73 | 73 | ||
| 74 | constexpr bool IsKernelAddress(VAddr address) { | 74 | constexpr bool IsKernelAddress(VAddr address) { |
| 75 | return KernelVirtualAddressSpaceBase <= address && address < KernelVirtualAddressSpaceEnd; | 75 | return KernelVirtualAddressSpaceBase <= address && address < KernelVirtualAddressSpaceEnd; |
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 7c7c2459c..84ff3c64b 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp | |||
| @@ -330,7 +330,7 @@ void KThread::Finalize() { | |||
| 330 | KThread* const waiter = std::addressof(*it); | 330 | KThread* const waiter = std::addressof(*it); |
| 331 | 331 | ||
| 332 | // The thread shouldn't be a kernel waiter. | 332 | // The thread shouldn't be a kernel waiter. |
| 333 | ASSERT(!IsKernelAddressKey(waiter->GetAddressKey())); | 333 | ASSERT(!waiter->GetAddressKeyIsKernel()); |
| 334 | 334 | ||
| 335 | // Clear the lock owner. | 335 | // Clear the lock owner. |
| 336 | waiter->SetLockOwner(nullptr); | 336 | waiter->SetLockOwner(nullptr); |
| @@ -884,7 +884,7 @@ void KThread::AddWaiterImpl(KThread* thread) { | |||
| 884 | } | 884 | } |
| 885 | 885 | ||
| 886 | // Keep track of how many kernel waiters we have. | 886 | // Keep track of how many kernel waiters we have. |
| 887 | if (IsKernelAddressKey(thread->GetAddressKey())) { | 887 | if (thread->GetAddressKeyIsKernel()) { |
| 888 | ASSERT((num_kernel_waiters++) >= 0); | 888 | ASSERT((num_kernel_waiters++) >= 0); |
| 889 | KScheduler::SetSchedulerUpdateNeeded(kernel); | 889 | KScheduler::SetSchedulerUpdateNeeded(kernel); |
| 890 | } | 890 | } |
| @@ -898,7 +898,7 @@ void KThread::RemoveWaiterImpl(KThread* thread) { | |||
| 898 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); | 898 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); |
| 899 | 899 | ||
| 900 | // Keep track of how many kernel waiters we have. | 900 | // Keep track of how many kernel waiters we have. |
| 901 | if (IsKernelAddressKey(thread->GetAddressKey())) { | 901 | if (thread->GetAddressKeyIsKernel()) { |
| 902 | ASSERT((num_kernel_waiters--) > 0); | 902 | ASSERT((num_kernel_waiters--) > 0); |
| 903 | KScheduler::SetSchedulerUpdateNeeded(kernel); | 903 | KScheduler::SetSchedulerUpdateNeeded(kernel); |
| 904 | } | 904 | } |
| @@ -974,7 +974,7 @@ KThread* KThread::RemoveWaiterByKey(s32* out_num_waiters, VAddr key) { | |||
| 974 | KThread* thread = std::addressof(*it); | 974 | KThread* thread = std::addressof(*it); |
| 975 | 975 | ||
| 976 | // Keep track of how many kernel waiters we have. | 976 | // Keep track of how many kernel waiters we have. |
| 977 | if (IsKernelAddressKey(thread->GetAddressKey())) { | 977 | if (thread->GetAddressKeyIsKernel()) { |
| 978 | ASSERT((num_kernel_waiters--) > 0); | 978 | ASSERT((num_kernel_waiters--) > 0); |
| 979 | KScheduler::SetSchedulerUpdateNeeded(kernel); | 979 | KScheduler::SetSchedulerUpdateNeeded(kernel); |
| 980 | } | 980 | } |
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index 083f4962d..9d771de0e 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h | |||
| @@ -605,13 +605,30 @@ public: | |||
| 605 | return address_key_value; | 605 | return address_key_value; |
| 606 | } | 606 | } |
| 607 | 607 | ||
| 608 | void SetAddressKey(VAddr key) { | 608 | [[nodiscard]] bool GetAddressKeyIsKernel() const { |
| 609 | return address_key_is_kernel; | ||
| 610 | } | ||
| 611 | |||
| 612 | //! NB: intentional deviation from official kernel. | ||
| 613 | // | ||
| 614 | // Separate SetAddressKey into user and kernel versions | ||
| 615 | // to cope with arbitrary host pointers making their way | ||
| 616 | // into things. | ||
| 617 | |||
| 618 | void SetUserAddressKey(VAddr key) { | ||
| 609 | address_key = key; | 619 | address_key = key; |
| 620 | address_key_is_kernel = false; | ||
| 610 | } | 621 | } |
| 611 | 622 | ||
| 612 | void SetAddressKey(VAddr key, u32 val) { | 623 | void SetUserAddressKey(VAddr key, u32 val) { |
| 613 | address_key = key; | 624 | address_key = key; |
| 614 | address_key_value = val; | 625 | address_key_value = val; |
| 626 | address_key_is_kernel = false; | ||
| 627 | } | ||
| 628 | |||
| 629 | void SetKernelAddressKey(VAddr key) { | ||
| 630 | address_key = key; | ||
| 631 | address_key_is_kernel = true; | ||
| 615 | } | 632 | } |
| 616 | 633 | ||
| 617 | void ClearWaitQueue() { | 634 | void ClearWaitQueue() { |
| @@ -770,6 +787,7 @@ private: | |||
| 770 | bool debug_attached{}; | 787 | bool debug_attached{}; |
| 771 | s8 priority_inheritance_count{}; | 788 | s8 priority_inheritance_count{}; |
| 772 | bool resource_limit_release_hint{}; | 789 | bool resource_limit_release_hint{}; |
| 790 | bool address_key_is_kernel{}; | ||
| 773 | StackParameters stack_parameters{}; | 791 | StackParameters stack_parameters{}; |
| 774 | Common::SpinLock context_guard{}; | 792 | Common::SpinLock context_guard{}; |
| 775 | 793 | ||