From 3356eddcbaf152cfd5b849d523db704d8368300e Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Wed, 7 Apr 2021 01:30:36 -0700 Subject: [PATCH] kern: update kernel waiter management rules --- libraries/libmesosphere/source/kern_k_process.cpp | 2 +- libraries/libmesosphere/source/kern_k_thread.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/libmesosphere/source/kern_k_process.cpp b/libraries/libmesosphere/source/kern_k_process.cpp index 9b888f56e..79e2acbd9 100644 --- a/libraries/libmesosphere/source/kern_k_process.cpp +++ b/libraries/libmesosphere/source/kern_k_process.cpp @@ -744,7 +744,7 @@ namespace ams::kern { } /* Otherwise, wait for us to not have an exception thread. */ - cur_thread->SetAddressKey(address_key); + cur_thread->SetAddressKey(address_key | 1); m_exception_thread->AddWaiter(cur_thread); if (cur_thread->GetState() == KThread::ThreadState_Runnable) { cur_thread->SetState(KThread::ThreadState_Waiting); diff --git a/libraries/libmesosphere/source/kern_k_thread.cpp b/libraries/libmesosphere/source/kern_k_thread.cpp index 00220923b..c25b9b121 100644 --- a/libraries/libmesosphere/source/kern_k_thread.cpp +++ b/libraries/libmesosphere/source/kern_k_thread.cpp @@ -23,7 +23,7 @@ namespace ams::kern { constexpr bool IsKernelAddressKey(KProcessAddress key) { const uintptr_t key_uptr = GetInteger(key); - return KernelVirtualAddressSpaceBase <= key_uptr && key_uptr <= KernelVirtualAddressSpaceLast; + return KernelVirtualAddressSpaceBase <= key_uptr && key_uptr <= KernelVirtualAddressSpaceLast && (key_uptr & 1) == 0; } void InitializeKernelStack(uintptr_t stack_top) { @@ -996,6 +996,7 @@ namespace ams::kern { /* Keep track of how many kernel waiters we have. */ if (IsKernelAddressKey(thread->GetAddressKey())) { MESOSPHERE_ABORT_UNLESS((m_num_kernel_waiters++) >= 0); + KScheduler::SetSchedulerUpdateNeeded(); } /* Insert the waiter. */ @@ -1010,6 +1011,7 @@ namespace ams::kern { /* Keep track of how many kernel waiters we have. */ if (IsKernelAddressKey(thread->GetAddressKey())) { MESOSPHERE_ABORT_UNLESS((m_num_kernel_waiters--) > 0); + KScheduler::SetSchedulerUpdateNeeded(); } /* Remove the waiter. */ @@ -1088,6 +1090,7 @@ namespace ams::kern { /* Keep track of how many kernel waiters we have. */ if (IsKernelAddressKey(thread->GetAddressKey())) { MESOSPHERE_ABORT_UNLESS((m_num_kernel_waiters--) > 0); + KScheduler::SetSchedulerUpdateNeeded(); } it = m_waiter_list.erase(it);