aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/k_condition_variable.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-11-16 22:15:09 +0100
committercrueter <crueter@eden-emu.dev>2025-11-16 22:15:09 +0100
commit7d239df065dc344c29d8c277835db9fef81e37d9 (patch)
tree92437492c70197a5abfa3ae8ad260bbd0bc43667 /src/core/hle/kernel/k_condition_variable.cpp
parentb6908131969b3977e071d6737f2a102a0354224d (diff)
[hle, kernel] Add support for FW21 and kernel changes (#3004)
- Adapts kernel changes from atmosphere for firmware 21.0.0. - Fixes launch error of firmware 21.0.0 applets. - Adds new commands for `prepo` (New `SaveSystemReport` & `SaveSystemReportWithUser`). - Adds new commands for `IReadOnlyApplicationControlDataInterface` (cmd 19; incomplete!) - Adds `{12010, nullptr, "SetButtonConfigLeft"},` undocumented IHidServer. - Adds new commands for `ngc:u` (`Mask2` and `Check2`) - Adds new commands for system settings server (GetHttpAuthConfig) for webapplet - Removes incompatible firmware popup warning. Signed-off-by: lizzie lizzie@eden-emu.dev Co-authored by: maufeat sahyno1996@gmail.com Co-authored-by: crueter <crueter@eden-emu.dev> Co-authored-by: JPikachu <jpikachu.eden@gmail.com> Co-authored-by: Maufeat <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3004 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/core/hle/kernel/k_condition_variable.cpp')
-rw-r--r--src/core/hle/kernel/k_condition_variable.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/core/hle/kernel/k_condition_variable.cpp b/src/core/hle/kernel/k_condition_variable.cpp
index 94ea3527ab..1a7431df07 100644
--- a/src/core/hle/kernel/k_condition_variable.cpp
+++ b/src/core/hle/kernel/k_condition_variable.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -23,8 +26,8 @@ bool ReadFromUser(KernelCore& kernel, u32* out, KProcessAddress address) {
return true;
}
-bool WriteToUser(KernelCore& kernel, KProcessAddress address, const u32* p) {
- GetCurrentMemory(kernel).Write32(GetInteger(address), *p);
+bool WriteToUser(KernelCore& kernel, KProcessAddress address, u32 val) {
+ GetCurrentMemory(kernel).Write32(GetInteger(address), val);
return true;
}
@@ -133,7 +136,7 @@ Result KConditionVariable::SignalToAddress(KernelCore& kernel, KProcessAddress a
// Write the value to userspace.
Result result{ResultSuccess};
- if (WriteToUser(kernel, addr, std::addressof(next_value))) [[likely]] {
+ if (WriteToUser(kernel, addr, next_value)) {
result = ResultSuccess;
} else {
result = ResultInvalidCurrentMemory;
@@ -207,13 +210,13 @@ void KConditionVariable::SignalImpl(KThread* thread) {
// TODO(bunnei): We should call CanAccessAtomic(..) here.
can_access = true;
- if (can_access) [[likely]] {
+ if (can_access) {
UpdateLockAtomic(m_kernel, std::addressof(prev_tag), address, own_tag,
Svc::HandleWaitMask);
}
}
- if (can_access) [[likely]] {
+ if (can_access) {
if (prev_tag == Svc::InvalidHandle) {
// If nobody held the lock previously, we're all good.
thread->EndWait(ResultSuccess);
@@ -225,7 +228,7 @@ void KConditionVariable::SignalImpl(KThread* thread) {
static_cast<Handle>(prev_tag & ~Svc::HandleWaitMask))
.ReleasePointerUnsafe();
- if (owner_thread) [[likely]] {
+ if (owner_thread) {
// Add the thread as a waiter on the owner.
owner_thread->AddWaiter(thread);
owner_thread->Close();
@@ -261,8 +264,8 @@ void KConditionVariable::Signal(u64 cv_key, s32 count) {
// If we have no waiters, clear the has waiter flag.
if (it == m_tree.end() || it->GetConditionVariableKey() != cv_key) {
- const u32 has_waiter_flag{};
- WriteToUser(m_kernel, cv_key, std::addressof(has_waiter_flag));
+ constexpr u32 HasNoWaiterFlag = 0;
+ WriteToUser(m_kernel, cv_key, HasNoWaiterFlag);
}
}
}
@@ -305,13 +308,13 @@ Result KConditionVariable::Wait(KProcessAddress addr, u64 key, u32 value, s64 ti
// Write to the cv key.
{
- const u32 has_waiter_flag = 1;
- WriteToUser(m_kernel, key, std::addressof(has_waiter_flag));
+ constexpr u32 HasWaiterFlag = 1;
+ WriteToUser(m_kernel, key, HasWaiterFlag);
std::atomic_thread_fence(std::memory_order_seq_cst);
}
// Write the value to userspace.
- if (!WriteToUser(m_kernel, addr, std::addressof(next_value))) {
+ if (!WriteToUser(m_kernel, addr, next_value)) {
slp.CancelSleep();
R_THROW(ResultInvalidCurrentMemory);
}