aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/k_thread.h
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2023-02-23 20:32:03 -0500
committerLiam <byteslice@airmail.cc>2023-03-01 10:42:45 -0500
commit97f7f7bad59cdd42bf5f504089e5cecd441da3ce (patch)
tree1d7489c0bda11fb4e99e0a6d1acea4d4406861d4 /src/core/hle/kernel/k_thread.h
parentc4ba088a5df13ff4b4d8853216231d690f2c79c0 (diff)
kernel: be more careful about kernel address keys
Diffstat (limited to 'src/core/hle/kernel/k_thread.h')
-rw-r--r--src/core/hle/kernel/k_thread.h14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h
index e09dcbea0..bd125f5f1 100644
--- a/src/core/hle/kernel/k_thread.h
+++ b/src/core/hle/kernel/k_thread.h
@@ -595,7 +595,13 @@ public:
[[nodiscard]] Result GetThreadContext3(std::vector<u8>& out);
- [[nodiscard]] KThread* RemoveWaiterByKey(bool* out_has_waiters, VAddr key);
+ [[nodiscard]] KThread* RemoveUserWaiterByKey(bool* out_has_waiters, VAddr key) {
+ return this->RemoveWaiterByKey(out_has_waiters, key, false);
+ }
+
+ [[nodiscard]] KThread* RemoveKernelWaiterByKey(bool* out_has_waiters, VAddr key) {
+ return this->RemoveWaiterByKey(out_has_waiters, key, true);
+ }
[[nodiscard]] VAddr GetAddressKey() const {
return address_key;
@@ -666,6 +672,9 @@ public:
}
private:
+ [[nodiscard]] KThread* RemoveWaiterByKey(bool* out_has_waiters, VAddr key,
+ bool is_kernel_address_key);
+
static constexpr size_t PriorityInheritanceCountMax = 10;
union SyncObjectBuffer {
std::array<KSynchronizationObject*, Svc::ArgumentHandleCountMax> sync_objects{};
@@ -850,7 +859,7 @@ public:
}
void AddHeldLock(LockWithPriorityInheritanceInfo* lock_info);
- LockWithPriorityInheritanceInfo* FindHeldLock(VAddr address_key);
+ LockWithPriorityInheritanceInfo* FindHeldLock(VAddr address_key, bool is_kernel_address_key);
private:
using LockWithPriorityInheritanceInfoList =
@@ -926,6 +935,7 @@ public:
condvar_key = cv_key;
address_key = address;
address_key_value = value;
+ is_kernel_address_key = false;
}
void ClearConditionVariable() {