From c95ad020fb529d47f9c3106a53553bec955c1586 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 11 Sep 2026 15:29:52 +0200 Subject: [PATCH 1/5] [gpu] Fix infinite hangup/freezes at shutdown/reset (#4395) Thread may be destroyed at dtor(), but it hasn't fully shut down, so before notify shutdown, request immediate stop (effective immediately). Like the issue was that the thread didn't want to stop running, thus it would hang, it would also reference objects which were being destroyed without waiting for them to actually be destroyed So it would reference invalid data This PR tells the thread: "hey, STOP now, and DESTROY yourself" So all of that should be avoided Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4395 Reviewed-by: Maufeat Reviewed-by: MaranBr --- src/video_core/gpu.cpp | 9 +++++---- src/video_core/gpu_thread.cpp | 7 +++++++ src/video_core/gpu_thread.h | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index a2e87b260a..9901cf4262 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -55,8 +55,8 @@ constexpr u64 GpuClockMultiplier(Settings::GpuClock clock) { struct GPU::Impl { explicit Impl(Core::System& system_, bool is_async_, bool use_nvdec_) - : gpu_thread{system_} - , system{system_} + : system{system_} + , gpu_thread{system_} , use_nvdec{use_nvdec_} , shader_notify() , is_async{is_async_} @@ -182,6 +182,7 @@ struct GPU::Impl { } void NotifyShutdown() { + gpu_thread.NotifyShutdown(); std::unique_lock lk{sync_mutex}; shutting_down.store(true, std::memory_order::relaxed); sync_cv.notify_all(); @@ -301,12 +302,12 @@ struct GPU::Impl { return out; } + Core::System& system; + // Destruction of thread must be done before all (non trivial) // previous members has been destroyed VideoCommon::GPUThread::ThreadManager gpu_thread; - Core::System& system; - std::unique_ptr renderer; const bool use_nvdec; diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 2acf9ac458..a01375e7be 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -114,4 +114,11 @@ u64 ThreadManager::PushCommand(CommandData&& command_data, bool block, bool is_a return fence; } +void ThreadManager::NotifyShutdown() { + if (thread.joinable()) { + thread.request_stop(); + thread.join(); + } +} + } // namespace VideoCommon::GPUThread diff --git a/src/video_core/gpu_thread.h b/src/video_core/gpu_thread.h index 4c3fadce15..631a680db4 100644 --- a/src/video_core/gpu_thread.h +++ b/src/video_core/gpu_thread.h @@ -125,6 +125,8 @@ public: void TickGPU(bool is_async); + void NotifyShutdown(); + private: /// Pushes a command to be executed by the GPU thread u64 PushCommand(CommandData&& command_data, bool block, bool is_async); From 301da63a15de8cfbe752ac44784db9b58cdd2d87 Mon Sep 17 00:00:00 2001 From: xbzk Date: Fri, 11 Sep 2026 21:38:12 +0200 Subject: [PATCH 2/5] [audio] hint openslES as audio driver on android to fix mute screen recording issue (#4397) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- After audio backend migration some android devices screen captures became mute. Liz instructed to enable openSL ES via some SDL hint. Found the proper one in https://wiki.libsdl.org/SDL3/SDL_HINT_AUDIO_DRIVER. Added it restricted to android. UPDATE: Got myself wondering how things work on SDL after using that hint, and checked that one must provide a list of drivers "opensles,aaudio,..." to be attempted. Afraid of some devices failing on openSL ES, and to avoid hand providing entire list, i've added fallback logic so entire SDL's driver list can be tried just in case. Default list in https://github.com/libsdl-org/SDL/blob/release-3.4.14/src/audio/SDL_audio.c. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4397 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/audio_core/sink/sdl3_sink.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/audio_core/sink/sdl3_sink.cpp b/src/audio_core/sink/sdl3_sink.cpp index 4816b17259..69558eabec 100644 --- a/src/audio_core/sink/sdl3_sink.cpp +++ b/src/audio_core/sink/sdl3_sink.cpp @@ -28,10 +28,18 @@ namespace { // // Keep in sync with cubeb_sink.cpp name. SDL_SetHint("SDL_AUDIO_DEVICE_APP_NAME", "yuzu Latency Getter"); +#ifdef __ANDROID__ + SDL_SetHintWithPriority(SDL_HINT_AUDIO_DRIVER, "openslES", SDL_HINT_OVERRIDE); if (!SDL_InitSubSystem(SDL_INIT_AUDIO)) { + LOG_WARNING(Audio_Sink, "OpenSL ES audio initialization failed: {}; retrying default drivers", SDL_GetError()); + SDL_ResetHint(SDL_HINT_AUDIO_DRIVER); + } +#endif + if (!SDL_WasInit(SDL_INIT_AUDIO) && !SDL_InitSubSystem(SDL_INIT_AUDIO)) { LOG_CRITICAL(Audio_Sink, "SDL_InitSubSystem audio failed: {}", SDL_GetError()); return false; } + LOG_INFO(Audio_Sink, "SDL audio driver: {}", SDL_GetCurrentAudioDriver()); } return true; } From 8a22f1845b8b7ec19fbb518b696513e36d42b317 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 11 Sep 2026 21:38:52 +0200 Subject: [PATCH 3/5] [hle] Enforce max_sessions, add bpc:ams service (#4394) As per switchbrew, as per atmosphere, and some poking around. bpc:ams stubbed for now. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4394 Reviewed-by: Maufeat Reviewed-by: MaranBr --- src/audio_core/audio_render_manager.cpp | 19 +++++----- src/core/hle/service/audio/audio.cpp | 34 +++++++++--------- src/core/hle/service/bcat/bcat.cpp | 30 +++++++--------- src/core/hle/service/bpc/bpc.cpp | 24 ++++++++++--- .../hle/service/filesystem/filesystem.cpp | 6 ++-- src/core/hle/service/glue/arp.cpp | 35 ++++++++----------- src/core/hle/service/glue/glue.cpp | 4 +-- src/core/hle/service/grc/grc.cpp | 4 +-- src/core/hle/service/ldr/ldr.cpp | 9 +++-- src/core/hle/service/ngc/ngc.cpp | 6 ++-- src/core/hle/service/nifm/nifm.cpp | 9 ++--- src/core/hle/service/ns/ns.cpp | 18 +++++----- src/core/hle/service/pm/pm.cpp | 8 ++--- src/core/hle/service/ro/ro.cpp | 6 ++-- src/core/hle/service/set/settings.cpp | 14 ++++---- src/core/hle/service/sm/sm.cpp | 7 ++-- src/core/hle/service/sockets/sockets.cpp | 14 ++++---- src/core/hle/service/usb/usb.cpp | 8 ++--- src/core/hle/service/wlan/wlan.cpp | 16 ++++----- 19 files changed, 138 insertions(+), 133 deletions(-) diff --git a/src/audio_core/audio_render_manager.cpp b/src/audio_core/audio_render_manager.cpp index 3c53e3afde..8c4e74c4be 100644 --- a/src/audio_core/audio_render_manager.cpp +++ b/src/audio_core/audio_render_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,9 @@ namespace AudioCore::Renderer { Manager::Manager(Core::System& system_) - : system{system_}, system_manager{std::make_unique(system)} { + : system{system_} + , system_manager{std::make_unique(system)} +{ std::iota(session_ids.begin(), session_ids.end(), 0); } @@ -38,14 +43,12 @@ Result Manager::GetWorkBufferSize(const AudioRendererParameterInternal& params, s32 Manager::GetSessionId() { std::scoped_lock l{session_lock}; - auto session_id{session_ids[session_count]}; - - if (session_id == -1) { - return -1; + ASSERT(session_count <= session_ids.size()); + auto const session_id = session_ids[session_count]; + if (session_id >= 0) { + session_ids[session_count] = -1; + session_count++; } - - session_ids[session_count] = -1; - session_count++; return session_id; } diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index c433283304..6caf794caa 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -185,26 +185,26 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("aud:a", std::make_shared(system)); - server_manager->RegisterNamedService("aud:d", std::make_shared(system)); + server_manager->RegisterNamedService("aud:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("aud:d", std::make_shared(system), 30); - server_manager->RegisterNamedService("audout:d", std::make_shared(system)); - server_manager->RegisterNamedService("audin:d", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:d", std::make_shared(system)); - server_manager->RegisterNamedService("audren:d", std::make_shared(system)); + server_manager->RegisterNamedService("audout:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audin:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audrec:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:d", std::make_shared(system), 30); - server_manager->RegisterNamedService("audin:u", std::make_shared(system)); - server_manager->RegisterNamedService("audin:a", std::make_shared(system)); - server_manager->RegisterNamedService("audout:u", std::make_shared(system)); - server_manager->RegisterNamedService("audout:a", std::make_shared(system)); - server_manager->RegisterNamedService("auddev", std::make_shared(system)); + server_manager->RegisterNamedService("audin:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audin:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("audout:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audout:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("auddev", std::make_shared(system), 30); // Depends on audout:u and audin:u on ctor! - server_manager->RegisterNamedService("audctl", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:a", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:u", std::make_shared(system)); - server_manager->RegisterNamedService("audren:u", std::make_shared(system)); - server_manager->RegisterNamedService("audren:a", std::make_shared(system)); - server_manager->RegisterNamedService("hwopus", std::make_shared(system)); + server_manager->RegisterNamedService("audctl", std::make_shared(system), 30); + server_manager->RegisterNamedService("audrec:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("audrec:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("hwopus", std::make_shared(system), 25); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/bcat/bcat.cpp b/src/core/hle/service/bcat/bcat.cpp index ea8b15998d..bf9e054a49 100644 --- a/src/core/hle/service/bcat/bcat.cpp +++ b/src/core/hle/service/bcat/bcat.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,25 +15,16 @@ namespace Service::BCAT { void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("bcat:a", - std::make_shared(system, "bcat:a")); - server_manager->RegisterNamedService("bcat:m", - std::make_shared(system, "bcat:m")); - server_manager->RegisterNamedService("bcat:u", - std::make_shared(system, "bcat:u")); - server_manager->RegisterNamedService("bcat:s", - std::make_shared(system, "bcat:s")); + server_manager->RegisterNamedService("bcat:a", std::make_shared(system, "bcat:a"), 32); + server_manager->RegisterNamedService("bcat:m", std::make_shared(system, "bcat:m"), 32); + server_manager->RegisterNamedService("bcat:u", std::make_shared(system, "bcat:u"), 32); + server_manager->RegisterNamedService("bcat:s", std::make_shared(system, "bcat:s"), 32); - server_manager->RegisterNamedService( - "news:a", std::make_shared(system, 0xffffffff, "news:a")); - server_manager->RegisterNamedService( - "news:p", std::make_shared(system, 0x1, "news:p")); - server_manager->RegisterNamedService( - "news:c", std::make_shared(system, 0x2, "news:c")); - server_manager->RegisterNamedService( - "news:v", std::make_shared(system, 0x4, "news:v")); - server_manager->RegisterNamedService( - "news:m", std::make_shared(system, 0xd, "news:m")); + server_manager->RegisterNamedService("news:a", std::make_shared(system, 0xffffffff, "news:a"), 32); + server_manager->RegisterNamedService("news:p", std::make_shared(system, 0x1, "news:p"), 32); + server_manager->RegisterNamedService("news:c", std::make_shared(system, 0x2, "news:c"), 32); + server_manager->RegisterNamedService("news:v", std::make_shared(system, 0x4, "news:v"), 32); + server_manager->RegisterNamedService("news:m", std::make_shared(system, 0xd, "news:m"), 32); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp index 6fd7001821..6f2e00b22b 100644 --- a/src/core/hle/service/bpc/bpc.cpp +++ b/src/core/hle/service/bpc/bpc.cpp @@ -101,14 +101,28 @@ public: } }; +class BPC_AMS final : public ServiceFramework { +public: + explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} { + // clang-format off + static const FunctionInfo functions[] = { + {65000, nullptr, "RebootToFatalError"}, + {65001, nullptr, "SetRebootPayload"}, + }; + // clang-format on + RegisterHandlers(functions); + } +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("bpc", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:r", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:c", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:b", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:w", std::make_shared(system)); + server_manager->RegisterNamedService("bpc", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:r", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:c", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:b", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:w", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:ams", std::make_shared(system), 4); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 38d2f1735c..925af7b371 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -804,9 +804,9 @@ void LoopProcess(Core::System& system) { const auto FileSystemProxyFactory = [&] { return std::make_shared(system); }; - server_manager->RegisterNamedService("fsp-ldr", std::make_shared(system)); - server_manager->RegisterNamedService("fsp-pr", std::make_shared(system)); - server_manager->RegisterNamedService("fsp-srv", std::move(FileSystemProxyFactory)); + server_manager->RegisterNamedService("fsp-ldr", std::make_shared(system), 61); + server_manager->RegisterNamedService("fsp-pr", std::make_shared(system), 61); + server_manager->RegisterNamedService("fsp-srv", std::move(FileSystemProxyFactory), 61); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp index b5dfbe9c60..7eda57ddc3 100644 --- a/src/core/hle/service/glue/arp.cpp +++ b/src/core/hle/service/glue/arp.cpp @@ -36,18 +36,18 @@ std::optional GetTitleIDForProcessID(Core::System& system, u64 process_id) ARP_R::ARP_R(Core::System& system_, const ARPManager& manager_) : ServiceFramework{system_, "arp:r"}, manager{manager_} { // clang-format off - static const FunctionInfo functions[] = { - {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, - {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, - {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, - {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, - {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, - {5, nullptr, "ListApplicationInstanceId"}, - {6, nullptr, "GetMicroApplicationInstanceId"}, - {7, nullptr, "GetApplicationCertificate"}, - {9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, - {9999, nullptr, "GetPreomiaApplicationControlProperty"}, - }; + static const FunctionInfo functions[] = { + {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, + {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, + {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, + {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, + {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, + {5, nullptr, "ListApplicationInstanceId"}, + {6, nullptr, "GetMicroApplicationInstanceId"}, + {7, nullptr, "GetApplicationCertificate"}, + {9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, + {9999, nullptr, "GetPreomiaApplicationControlProperty"}, + }; // clang-format on RegisterHandlers(functions); @@ -191,8 +191,7 @@ private: } if (issued) { - LOG_ERROR(Service_ARP, - "Attempted to issue registrar, but registrar is already issued!"); + LOG_ERROR(Service_ARP, "Attempted to issue registrar, but registrar is already issued!"); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(Glue::ResultAlreadyBound); return; @@ -209,9 +208,7 @@ private: LOG_DEBUG(Service_ARP, "called"); if (issued) { - LOG_ERROR( - Service_ARP, - "Attempted to set application launch property, but registrar is already issued!"); + LOG_ERROR(Service_ARP, "Attempted to set application launch property, but registrar is already issued!"); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(Glue::ResultAlreadyBound); return; @@ -228,9 +225,7 @@ private: LOG_DEBUG(Service_ARP, "called"); if (issued) { - LOG_ERROR( - Service_ARP, - "Attempted to set application control property, but registrar is already issued!"); + LOG_ERROR(Service_ARP, "Attempted to set application control property, but registrar is already issued!"); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(Glue::ResultAlreadyBound); return; diff --git a/src/core/hle/service/glue/glue.cpp b/src/core/hle/service/glue/glue.cpp index 46d078d00b..f267060ef4 100644 --- a/src/core/hle/service/glue/glue.cpp +++ b/src/core/hle/service/glue/glue.cpp @@ -22,8 +22,8 @@ void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); // ARP - server_manager->RegisterNamedService("arp:r", std::make_shared(system, system.GetARPManager())); - server_manager->RegisterNamedService("arp:w", std::make_shared(system, system.GetARPManager())); + server_manager->RegisterNamedService("arp:r", std::make_shared(system, system.GetARPManager()), 16); + server_manager->RegisterNamedService("arp:w", std::make_shared(system, system.GetARPManager()), 8); // BackGround Task Controller server_manager->RegisterNamedService("bgtc:t", std::make_shared(system)); diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp index b3d39a6294..e8e901662d 100644 --- a/src/core/hle/service/grc/grc.cpp +++ b/src/core/hle/service/grc/grc.cpp @@ -46,8 +46,8 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("grc:c", std::make_shared(system)); - server_manager->RegisterNamedService("grc:d", std::make_shared(system)); + server_manager->RegisterNamedService("grc:c", std::make_shared(system), 4); + server_manager->RegisterNamedService("grc:d", std::make_shared(system), 4); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index ba58b3a093..db4d51b49d 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -56,9 +59,9 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ldr:dmnt", std::make_shared(system)); - server_manager->RegisterNamedService("ldr:pm", std::make_shared(system)); - server_manager->RegisterNamedService("ldr:shel", std::make_shared(system)); + server_manager->RegisterNamedService("ldr:dmnt", std::make_shared(system), 3); + server_manager->RegisterNamedService("ldr:pm", std::make_shared(system), 1); + server_manager->RegisterNamedService("ldr:shel", std::make_shared(system), 3); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp index 0af4a7bd0e..06310145e5 100644 --- a/src/core/hle/service/ngc/ngc.cpp +++ b/src/core/hle/service/ngc/ngc.cpp @@ -169,9 +169,9 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ngct:u", std::make_shared(system)); - server_manager->RegisterNamedService("ngct:s", std::make_shared(system)); - server_manager->RegisterNamedService("ngc:u", std::make_shared(system)); + server_manager->RegisterNamedService("ngct:u", std::make_shared(system), 4); + server_manager->RegisterNamedService("ngct:s", std::make_shared(system), 4); + server_manager->RegisterNamedService("ngc:u", std::make_shared(system), 4); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 898b9ecfb2..efada9b807 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -1144,12 +1144,9 @@ private: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("nifm:a", - std::make_shared("nifm:a", system)); - server_manager->RegisterNamedService("nifm:s", - std::make_shared("nifm:s", system)); - server_manager->RegisterNamedService("nifm:u", - std::make_shared("nifm:u", system)); + server_manager->RegisterNamedService("nifm:a", std::make_shared("nifm:a", system), 2); + server_manager->RegisterNamedService("nifm:s", std::make_shared("nifm:s", system), 16); + server_manager->RegisterNamedService("nifm:u", std::make_shared("nifm:u", system), 5); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index 4e3915f684..fe057422ce 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp @@ -81,16 +81,16 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ns:am2", std::make_shared(system, "ns:am2")); - server_manager->RegisterNamedService("ns:ec", std::make_shared(system, "ns:ec")); - server_manager->RegisterNamedService("ns:rid", std::make_shared(system, "ns:rid")); - server_manager->RegisterNamedService("ns:rt", std::make_shared(system, "ns:rt")); - server_manager->RegisterNamedService("ns:web", std::make_shared(system, "ns:web")); - server_manager->RegisterNamedService("ns:ro", std::make_shared(system, "ns:ro")); + server_manager->RegisterNamedService("ns:am2", std::make_shared(system, "ns:am2"), 5); + server_manager->RegisterNamedService("ns:ec", std::make_shared(system, "ns:ec"), 5); + server_manager->RegisterNamedService("ns:rid", std::make_shared(system, "ns:rid"), 5); + server_manager->RegisterNamedService("ns:rt", std::make_shared(system, "ns:rt"), 5); + server_manager->RegisterNamedService("ns:web", std::make_shared(system, "ns:web"), 5); + server_manager->RegisterNamedService("ns:ro", std::make_shared(system, "ns:ro"), 5); - server_manager->RegisterNamedService("ns:dev", std::make_shared(system)); - server_manager->RegisterNamedService("ns:su", std::make_shared(system)); - server_manager->RegisterNamedService("ns:vm", std::make_shared(system)); + server_manager->RegisterNamedService("ns:dev", std::make_shared(system), 5); + server_manager->RegisterNamedService("ns:su", std::make_shared(system), 5); + server_manager->RegisterNamedService("ns:vm", std::make_shared(system), 5); server_manager->RegisterNamedService("pdm:ntfy", std::make_shared(system)); server_manager->RegisterNamedService("pdm:qry", std::make_shared(system)); diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp index 97efb1a361..ff7053b690 100644 --- a/src/core/hle/service/pm/pm.cpp +++ b/src/core/hle/service/pm/pm.cpp @@ -252,10 +252,10 @@ private: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("pm:bm", std::make_shared(system)); - server_manager->RegisterNamedService("pm:dmnt", std::make_shared(system)); - server_manager->RegisterNamedService("pm:info", std::make_shared(system)); - server_manager->RegisterNamedService("pm:shell", std::make_shared(system)); + server_manager->RegisterNamedService("pm:bm", std::make_shared(system), 4); // Nx = 4, Ams = 8 + server_manager->RegisterNamedService("pm:dmnt", std::make_shared(system), 16); + server_manager->RegisterNamedService("pm:shell", std::make_shared(system), 3); //Nx = 3, AMS = 8 + server_manager->RegisterNamedService("pm:info", std::make_shared(system), 25); //48-(4+16+3) ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 922fc10440..13de9f96c8 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -593,9 +593,9 @@ void LoopProcess(Core::System& system) { return std::make_shared(system, "ldr:ro", ro, NrrKind::User); }; - server_manager->RegisterNamedService("ldr:ro", std::move(RoInterfaceFactoryForUser)); - server_manager->RegisterNamedService("ro:1", std::make_shared(system, "ro:1", ro, NrrKind::JitPlugin)); - server_manager->RegisterNamedService("ro:dmnt", std::make_shared(system)); + server_manager->RegisterNamedService("ldr:ro", std::move(RoInterfaceFactoryForUser), 2); + server_manager->RegisterNamedService("ro:1", std::make_shared(system, "ro:1", ro, NrrKind::JitPlugin), 2); + server_manager->RegisterNamedService("ro:dmnt", std::make_shared(system), 2); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/set/settings.cpp b/src/core/hle/service/set/settings.cpp index 73d021ff4d..407332b9b7 100644 --- a/src/core/hle/service/set/settings.cpp +++ b/src/core/hle/service/set/settings.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,13 +16,10 @@ namespace Service::Set { void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("set", std::make_shared(system)); - server_manager->RegisterNamedService("set:cal", - std::make_shared(system)); - server_manager->RegisterNamedService("set:fd", - std::make_shared(system)); - server_manager->RegisterNamedService("set:sys", - std::make_shared(system)); + server_manager->RegisterNamedService("set", std::make_shared(system), 60); + server_manager->RegisterNamedService("set:cal", std::make_shared(system), 60); + server_manager->RegisterNamedService("set:fd", std::make_shared(system), 60); + server_manager->RegisterNamedService("set:sys", std::make_shared(system), 60); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 45d2a14d62..c75c5437df 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -53,8 +53,7 @@ static Result ValidateServiceName(const std::string& name) { return ResultSuccess; } -Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, std::string name, - u32 max_sessions, SessionRequestHandlerFactory handler) { +Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, std::string name, u32 max_sessions, SessionRequestHandlerFactory handler) { R_TRY(ValidateServiceName(name)); std::scoped_lock lk{lock}; @@ -64,7 +63,7 @@ Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, st } auto* port = Kernel::KPort::Create(kernel); - port->Initialize(kernel, ServerSessionCountMax, false, 0); + port->Initialize(kernel, max_sessions, false, 0); // Register the port. Kernel::KPort::Register(kernel, port); @@ -264,7 +263,7 @@ void SM::AtmosphereHasService(HLERequestContext& ctx) { } SM::SM(ServiceManager& service_manager_, Core::System& system_) - : ServiceFramework{system_, "sm:", 4} + : ServiceFramework{system_, "sm:", 64} , service_manager{service_manager_} , kernel{system_.Kernel()} { diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index e14617ddd8..e96d7c5638 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -64,17 +64,17 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ethc:c", std::make_shared(system)); - server_manager->RegisterNamedService("ethc:i", std::make_shared(system)); - server_manager->RegisterNamedService("bsd:s", std::make_shared(system, "bsd:s", false)); - server_manager->RegisterNamedService("bsd:u", std::make_shared(system, "bsd:u", true)); - server_manager->RegisterNamedService("bsd:a", std::make_shared(system, "bsd:a", true)); - server_manager->RegisterNamedService("bsd:nu", std::make_shared(system)); + server_manager->RegisterNamedService("ethc:c", std::make_shared(system), 5); + server_manager->RegisterNamedService("ethc:i", std::make_shared(system), 5); + server_manager->RegisterNamedService("bsd:s", std::make_shared(system, "bsd:s", false), 0x7E); + server_manager->RegisterNamedService("bsd:u", std::make_shared(system, "bsd:u", true), 0x0f); + server_manager->RegisterNamedService("bsd:a", std::make_shared(system, "bsd:a", true), 0x17); + server_manager->RegisterNamedService("bsd:nu", std::make_shared(system), 4); server_manager->RegisterNamedService("bsdcfg", std::make_shared(system, "bsdcfg")); server_manager->RegisterNamedService("ifcfg", std::make_shared(system, "ifcfg")); server_manager->RegisterNamedService("nsd:a", std::make_shared(system, "nsd:a")); server_manager->RegisterNamedService("nsd:u", std::make_shared(system, "nsd:u")); - server_manager->RegisterNamedService("sfdnsres", std::make_shared(system)); + server_manager->RegisterNamedService("sfdnsres", std::make_shared(system), 30); server_manager->RegisterNamedService("dns:priv", std::make_shared(system)); server_manager->RegisterNamedService("eth:nd", std::make_shared(system)); diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp index 179d1f7097..ff2a377172 100644 --- a/src/core/hle/service/usb/usb.cpp +++ b/src/core/hle/service/usb/usb.cpp @@ -265,17 +265,17 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("usb:ds", std::make_shared(system)); server_manager->RegisterNamedService("usb:hs", std::make_shared(system)); - server_manager->RegisterNamedService("usb:pd", std::make_shared(system)); - server_manager->RegisterNamedService("usb:pd:c", std::make_shared(system)); + server_manager->RegisterNamedService("usb:pd", std::make_shared(system), 6); + server_manager->RegisterNamedService("usb:pd:c", std::make_shared(system), 4); server_manager->RegisterNamedService("usb:pd:m", std::make_shared(system)); - server_manager->RegisterNamedService("usb:pm", std::make_shared(system)); + server_manager->RegisterNamedService("usb:pm", std::make_shared(system), 5); // +7.0.0 if (FirmwareManager::GetFirmwareVersion(system).first.major >= 7) { server_manager->RegisterNamedService("usb:qdb", std::make_shared(system)); } // +8.0.0 if (FirmwareManager::GetFirmwareVersion(system).first.major >= 8) { - server_manager->RegisterNamedService("usb:obsv", std::make_shared(system)); + server_manager->RegisterNamedService("usb:obsv", std::make_shared(system), 2); } ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp index 7f118c62ba..bcd357d57a 100644 --- a/src/core/hle/service/wlan/wlan.cpp +++ b/src/core/hle/service/wlan/wlan.cpp @@ -246,14 +246,14 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("wlan:lcl", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:lg", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:lga", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:sg", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:soc", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:dtc", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:p", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:nd", std::make_shared(system)); + server_manager->RegisterNamedService("wlan:lcl", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:lg", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:lga", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:sg", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:soc", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:dtc", std::make_shared(system), 4); + server_manager->RegisterNamedService("wlan:p", std::make_shared(system), 30); + server_manager->RegisterNamedService("wlan:nd", std::make_shared(system), 5); ServerManager::RunServer(std::move(server_manager)); } From 65cd822bed026345e741ba7d4d00adcd11737332 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sat, 12 Sep 2026 02:19:48 +0300 Subject: [PATCH 4/5] [dynarmic] use UBFX + CBNZ instead of TBNZ for marked bit --- src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp index 1f758a190a..302a475a78 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp @@ -274,8 +274,8 @@ std::pair InlinePageTableEmitVAddrLookup(oaknut::Cod code.LDR(Xscratch0, Xpagetable, Xscratch0); if (ctx.conf.page_table_marked_bit) { - // check for marked bit - code.TBNZ(Xscratch0, *ctx.conf.page_table_marked_bit, *fallback); + code.UBFX(Xscratch1, Xscratch0, *ctx.conf.page_table_marked_bit, 1); + code.CBNZ(Xscratch1, *fallback); } if (ctx.conf.page_table_pointer_mask != 0) { From c4ac07c392a1e0797dbb92300d965a746ba5dd04 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sat, 12 Sep 2026 03:24:00 +0300 Subject: [PATCH 5/5] [am] Bruno FIX OVERLAY 2.0 --- .../hle/service/am/display_layer_manager.cpp | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/core/hle/service/am/display_layer_manager.cpp b/src/core/hle/service/am/display_layer_manager.cpp index 494e8a132b..cd9e26e899 100644 --- a/src/core/hle/service/am/display_layer_manager.cpp +++ b/src/core/hle/service/am/display_layer_manager.cpp @@ -73,16 +73,20 @@ Result DisplayLayerManager::CreateManagedDisplayLayer(u64* out_layer_id) { R_TRY(m_manager_display_service->CreateManagedLayer( out_layer_id, 0, display_id, Service::AppletResourceUserId{m_process->GetProcessId()})); + m_manager_display_service->SetLayerVisibility(m_visible, *out_layer_id); + (void)m_display_service->GetContainer()->SetLayerStackMask(*out_layer_id, + this->GetLayerStackMask()); + if (m_applet_id != AppletId::Application) { (void)m_manager_display_service->SetLayerBlending(m_blending_enabled, *out_layer_id); if (m_applet_id == AppletId::OverlayDisplay) { - (void)m_manager_display_service->SetLayerZIndex(-1, *out_layer_id); - (void)m_display_service->GetContainer()->SetLayerIsOverlay(*out_layer_id, true); + (void)m_manager_display_service->SetLayerZIndex(Overlay, *out_layer_id); } else { - (void)m_manager_display_service->SetLayerZIndex(1, *out_layer_id); + (void)m_manager_display_service->SetLayerZIndex(Foreground, *out_layer_id); } } - (void)m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true); + + m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true); m_managed_display_layers.emplace(*out_layer_id); R_SUCCEED(); @@ -122,14 +126,16 @@ Result DisplayLayerManager::IsSystemBufferSharingEnabled() { // Ensure the overlay layer is visible m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id); - m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id); - s32 initial_z = 1; - (void)m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true); + (void)m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id); + s32 initial_z = Foreground; if (m_applet_id == AppletId::OverlayDisplay) { - initial_z = -1; + initial_z = Overlay; + (void)m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id); (void)m_display_service->GetContainer()->SetLayerIsOverlay(m_system_shared_layer_id, true); } m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id); + m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true); + m_managed_display_layers.emplace(m_system_shared_layer_id); R_SUCCEED(); }