From 543dc05008ba274b55d80cf7050beb2d47a07088 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Tue, 21 Oct 2025 18:01:05 +1000 Subject: [PATCH] am: Implement missing ILibraryAppletCreator and ILibraryAppletAccessor commands Adds support for newer firmware commands: - ILibraryAppletCreator::CreateLibraryAppletEx (cmd 3) - Added in firmware 20.0.0+ Takes an additional thread_id parameter compared to CreateLibraryApplet - ILibraryAppletAccessor::Unknown90 (cmd 90) - Unknown command from newer firmware Stubbed with generic parameter logging Fixes assertion: Unknown / unimplemented function '3': port='ILibraryAppletCreator' Fixes assertion: Unknown / unimplemented function '90': port='ILibraryAppletAccessor' Signed-off-by: Zephyron --- .../am/service/library_applet_accessor.cpp | 10 +++++++ .../am/service/library_applet_accessor.h | 2 ++ .../am/service/library_applet_creator.cpp | 29 +++++++++++++++++++ .../am/service/library_applet_creator.h | 4 +++ 4 files changed, 45 insertions(+) diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp index cda8c3eb8..afacc1d6d 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_accessor.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/am/applet_data_broker.h" @@ -25,6 +26,7 @@ ILibraryAppletAccessor::ILibraryAppletAccessor(Core::System& system_, {30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"}, {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"}, {60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero"}, + {90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90"}, {100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"}, {101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"}, {102, nullptr, "PushExtraStorage"}, @@ -138,6 +140,14 @@ Result ILibraryAppletAccessor::GetIndirectLayerConsumerHandle(Out out_handl R_SUCCEED(); } +Result ILibraryAppletAccessor::Unknown90(s64 param_1, s64 param_2) { + LOG_WARNING(Service_AM, "(STUBBED) called, param_1={} param_2={}", param_1, param_2); + + // Unknown function added in newer firmware + // Stubbed for now + R_SUCCEED(); +} + void ILibraryAppletAccessor::FrontendExecute() { if (m_applet->frontend) { m_applet->frontend->Initialize(); diff --git a/src/core/hle/service/am/service/library_applet_accessor.h b/src/core/hle/service/am/service/library_applet_accessor.h index 36712821a..e1f9672be 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.h +++ b/src/core/hle/service/am/service/library_applet_accessor.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -33,6 +34,7 @@ private: Result GetPopOutDataEvent(OutCopyHandle out_event); Result GetPopInteractiveOutDataEvent(OutCopyHandle out_event); Result GetIndirectLayerConsumerHandle(Out out_handle); + Result Unknown90(s64 param_1, s64 param_2); void FrontendExecute(); void FrontendExecuteInteractive(); diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index 3ffb03bc9..aa66ebb4a 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/settings.h" @@ -171,6 +172,7 @@ ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, {1, nullptr, "TerminateAllLibraryApplets"}, {2, nullptr, "AreAnyLibraryAppletsLeft"}, + {3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"}, {10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"}, {11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"}, {12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"}, @@ -206,6 +208,33 @@ Result ILibraryAppletCreator::CreateLibraryApplet( R_SUCCEED(); } +Result ILibraryAppletCreator::CreateLibraryAppletEx( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode, u64 thread_id) { + LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={:016X}", applet_id, + library_applet_mode, thread_id); + + // The thread_id parameter is not used in the current implementation + std::shared_ptr library_applet; + if (ShouldCreateGuestApplet(applet_id)) { + library_applet = + CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + library_applet = + CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); + R_THROW(ResultUnknown); + } + + // Applet is created, can now be launched. + m_applet->library_applet_launchable_event.Signal(); + *out_library_applet_accessor = library_applet; + R_SUCCEED(); +} + Result ILibraryAppletCreator::CreateStorage(Out> out_storage, s64 size) { LOG_DEBUG(Service_AM, "called, size={}", size); diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h index a10a76982..80e793ae4 100644 --- a/src/core/hle/service/am/service/library_applet_creator.h +++ b/src/core/hle/service/am/service/library_applet_creator.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -24,6 +25,9 @@ private: Result CreateLibraryApplet( Out> out_library_applet_accessor, AppletId applet_id, LibraryAppletMode library_applet_mode); + Result CreateLibraryAppletEx( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode, u64 thread_id); Result CreateStorage(Out> out_storage, s64 size); Result CreateTransferMemoryStorage( Out> out_storage, bool is_writable, s64 size,