summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt4
-rw-r--r--src/core/hle/service/am/library_applet_creator.h26
-rw-r--r--src/core/hle/service/am/service/application_proxy.cpp2
-rw-r--r--src/core/hle/service/am/service/library_applet_creator.cpp (renamed from src/core/hle/service/am/library_applet_creator.cpp)138
-rw-r--r--src/core/hle/service/am/service/library_applet_creator.h35
-rw-r--r--src/core/hle/service/am/service/library_applet_proxy.cpp2
-rw-r--r--src/core/hle/service/am/service/system_applet_proxy.cpp2
7 files changed, 88 insertions, 121 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index d763663e6..4f31e9c17 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -429,8 +429,6 @@ add_library(core STATIC
429 hle/service/am/hid_registration.h 429 hle/service/am/hid_registration.h
430 hle/service/am/idle.cpp 430 hle/service/am/idle.cpp
431 hle/service/am/idle.h 431 hle/service/am/idle.h
432 hle/service/am/library_applet_creator.cpp
433 hle/service/am/library_applet_creator.h
434 hle/service/am/library_applet_self_accessor.cpp 432 hle/service/am/library_applet_self_accessor.cpp
435 hle/service/am/library_applet_self_accessor.h 433 hle/service/am/library_applet_self_accessor.h
436 hle/service/am/library_applet_storage.cpp 434 hle/service/am/library_applet_storage.cpp
@@ -473,6 +471,8 @@ add_library(core STATIC
473 hle/service/am/service/home_menu_functions.h 471 hle/service/am/service/home_menu_functions.h
474 hle/service/am/service/library_applet_accessor.cpp 472 hle/service/am/service/library_applet_accessor.cpp
475 hle/service/am/service/library_applet_accessor.h 473 hle/service/am/service/library_applet_accessor.h
474 hle/service/am/service/library_applet_creator.cpp
475 hle/service/am/service/library_applet_creator.h
476 hle/service/am/service/library_applet_proxy.cpp 476 hle/service/am/service/library_applet_proxy.cpp
477 hle/service/am/service/library_applet_proxy.h 477 hle/service/am/service/library_applet_proxy.h
478 hle/service/am/service/system_applet_proxy.cpp 478 hle/service/am/service/system_applet_proxy.cpp
diff --git a/src/core/hle/service/am/library_applet_creator.h b/src/core/hle/service/am/library_applet_creator.h
deleted file mode 100644
index 551f287bd..000000000
--- a/src/core/hle/service/am/library_applet_creator.h
+++ /dev/null
@@ -1,26 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/service.h"
7
8namespace Service::AM {
9
10struct Applet;
11
12class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
13public:
14 explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet_);
15 ~ILibraryAppletCreator() override;
16
17private:
18 void CreateLibraryApplet(HLERequestContext& ctx);
19 void CreateStorage(HLERequestContext& ctx);
20 void CreateTransferMemoryStorage(HLERequestContext& ctx);
21 void CreateHandleStorage(HLERequestContext& ctx);
22
23 const std::shared_ptr<Applet> applet;
24};
25
26} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy.cpp b/src/core/hle/service/am/service/application_proxy.cpp
index 445f9b158..26a818f14 100644
--- a/src/core/hle/service/am/service/application_proxy.cpp
+++ b/src/core/hle/service/am/service/application_proxy.cpp
@@ -1,7 +1,6 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/am/library_applet_creator.h"
5#include "core/hle/service/am/library_applet_self_accessor.h" 4#include "core/hle/service/am/library_applet_self_accessor.h"
6#include "core/hle/service/am/process_winding_controller.h" 5#include "core/hle/service/am/process_winding_controller.h"
7#include "core/hle/service/am/self_controller.h" 6#include "core/hle/service/am/self_controller.h"
@@ -12,6 +11,7 @@
12#include "core/hle/service/am/service/common_state_getter.h" 11#include "core/hle/service/am/service/common_state_getter.h"
13#include "core/hle/service/am/service/debug_functions.h" 12#include "core/hle/service/am/service/debug_functions.h"
14#include "core/hle/service/am/service/display_controller.h" 13#include "core/hle/service/am/service/display_controller.h"
14#include "core/hle/service/am/service/library_applet_creator.h"
15#include "core/hle/service/am/window_controller.h" 15#include "core/hle/service/am/window_controller.h"
16#include "core/hle/service/cmif_serialization.h" 16#include "core/hle/service/cmif_serialization.h"
17 17
diff --git a/src/core/hle/service/am/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp
index bc2e18e38..4d905549c 100644
--- a/src/core/hle/service/am/library_applet_creator.cpp
+++ b/src/core/hle/service/am/service/library_applet_creator.cpp
@@ -6,11 +6,11 @@
6#include "core/hle/service/am/applet_data_broker.h" 6#include "core/hle/service/am/applet_data_broker.h"
7#include "core/hle/service/am/applet_manager.h" 7#include "core/hle/service/am/applet_manager.h"
8#include "core/hle/service/am/frontend/applets.h" 8#include "core/hle/service/am/frontend/applets.h"
9#include "core/hle/service/am/library_applet_creator.h"
10#include "core/hle/service/am/library_applet_storage.h" 9#include "core/hle/service/am/library_applet_storage.h"
11#include "core/hle/service/am/service/library_applet_accessor.h" 10#include "core/hle/service/am/service/library_applet_accessor.h"
11#include "core/hle/service/am/service/library_applet_creator.h"
12#include "core/hle/service/am/storage.h" 12#include "core/hle/service/am/storage.h"
13#include "core/hle/service/ipc_helpers.h" 13#include "core/hle/service/cmif_serialization.h"
14#include "core/hle/service/sm/sm.h" 14#include "core/hle/service/sm/sm.h"
15 15
16namespace Service::AM { 16namespace Service::AM {
@@ -172,139 +172,97 @@ std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& syste
172 172
173} // namespace 173} // namespace
174 174
175ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet_) 175ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet)
176 : ServiceFramework{system_, "ILibraryAppletCreator"}, applet{std::move(applet_)} { 176 : ServiceFramework{system_, "ILibraryAppletCreator"}, m_applet{std::move(applet)} {
177 static const FunctionInfo functions[] = { 177 static const FunctionInfo functions[] = {
178 {0, &ILibraryAppletCreator::CreateLibraryApplet, "CreateLibraryApplet"}, 178 {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"},
179 {1, nullptr, "TerminateAllLibraryApplets"}, 179 {1, nullptr, "TerminateAllLibraryApplets"},
180 {2, nullptr, "AreAnyLibraryAppletsLeft"}, 180 {2, nullptr, "AreAnyLibraryAppletsLeft"},
181 {10, &ILibraryAppletCreator::CreateStorage, "CreateStorage"}, 181 {10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"},
182 {11, &ILibraryAppletCreator::CreateTransferMemoryStorage, "CreateTransferMemoryStorage"}, 182 {11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"},
183 {12, &ILibraryAppletCreator::CreateHandleStorage, "CreateHandleStorage"}, 183 {12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"},
184 }; 184 };
185 RegisterHandlers(functions); 185 RegisterHandlers(functions);
186} 186}
187 187
188ILibraryAppletCreator::~ILibraryAppletCreator() = default; 188ILibraryAppletCreator::~ILibraryAppletCreator() = default;
189 189
190void ILibraryAppletCreator::CreateLibraryApplet(HLERequestContext& ctx) { 190Result ILibraryAppletCreator::CreateLibraryApplet(
191 IPC::RequestParser rp{ctx}; 191 Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
192 192 LibraryAppletMode library_applet_mode) {
193 const auto applet_id = rp.PopRaw<AppletId>(); 193 LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id,
194 const auto applet_mode = rp.PopRaw<LibraryAppletMode>(); 194 library_applet_mode);
195
196 LOG_DEBUG(Service_AM, "called with applet_id={:08X}, applet_mode={:08X}", applet_id,
197 applet_mode);
198 195
199 std::shared_ptr<ILibraryAppletAccessor> library_applet; 196 std::shared_ptr<ILibraryAppletAccessor> library_applet;
200 if (ShouldCreateGuestApplet(applet_id)) { 197 if (ShouldCreateGuestApplet(applet_id)) {
201 library_applet = CreateGuestApplet(system, applet, applet_id, applet_mode); 198 library_applet = CreateGuestApplet(system, m_applet, applet_id, library_applet_mode);
202 } 199 }
203 if (!library_applet) { 200 if (!library_applet) {
204 library_applet = CreateFrontendApplet(system, applet, applet_id, applet_mode); 201 library_applet = CreateFrontendApplet(system, m_applet, applet_id, library_applet_mode);
205 } 202 }
206 if (!library_applet) { 203 if (!library_applet) {
207 LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); 204 LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
208 205 R_THROW(ResultUnknown);
209 IPC::ResponseBuilder rb{ctx, 2};
210 rb.Push(ResultUnknown);
211 return;
212 } 206 }
213 207
214 // Applet is created, can now be launched. 208 // Applet is created, can now be launched.
215 applet->library_applet_launchable_event.Signal(); 209 m_applet->library_applet_launchable_event.Signal();
216 210 *out_library_applet_accessor = library_applet;
217 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 211 R_SUCCEED();
218 rb.Push(ResultSuccess);
219 rb.PushIpcInterface<ILibraryAppletAccessor>(library_applet);
220} 212}
221 213
222void ILibraryAppletCreator::CreateStorage(HLERequestContext& ctx) { 214Result ILibraryAppletCreator::CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size) {
223 IPC::RequestParser rp{ctx};
224
225 const s64 size{rp.Pop<s64>()};
226
227 LOG_DEBUG(Service_AM, "called, size={}", size); 215 LOG_DEBUG(Service_AM, "called, size={}", size);
228 216
229 if (size <= 0) { 217 if (size <= 0) {
230 LOG_ERROR(Service_AM, "size is less than or equal to 0"); 218 LOG_ERROR(Service_AM, "size is less than or equal to 0");
231 IPC::ResponseBuilder rb{ctx, 2}; 219 R_THROW(ResultUnknown);
232 rb.Push(ResultUnknown);
233 return;
234 } 220 }
235 221
236 std::vector<u8> data(size); 222 *out_storage = std::make_shared<IStorage>(system, AM::CreateStorage(std::vector<u8>(size)));
237 223 R_SUCCEED();
238 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
239 rb.Push(ResultSuccess);
240 rb.PushIpcInterface<IStorage>(system, AM::CreateStorage(std::move(data)));
241} 224}
242 225
243void ILibraryAppletCreator::CreateTransferMemoryStorage(HLERequestContext& ctx) { 226Result ILibraryAppletCreator::CreateTransferMemoryStorage(
244 IPC::RequestParser rp{ctx}; 227 Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
245 228 InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
246 struct Parameters { 229 LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size);
247 bool is_writable;
248 s64 size;
249 };
250 230
251 const auto params{rp.PopRaw<Parameters>()}; 231 if (size <= 0) {
252 const auto handle{ctx.GetCopyHandle(0)};
253
254 LOG_DEBUG(Service_AM, "called, is_writable={}, size={}, handle={:08X}", params.is_writable,
255 params.size, handle);
256
257 if (params.size <= 0) {
258 LOG_ERROR(Service_AM, "size is less than or equal to 0"); 232 LOG_ERROR(Service_AM, "size is less than or equal to 0");
259 IPC::ResponseBuilder rb{ctx, 2}; 233 R_THROW(ResultUnknown);
260 rb.Push(ResultUnknown);
261 return;
262 } 234 }
263 235
264 auto transfer_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(handle); 236 if (!transfer_memory_handle) {
265 237 LOG_ERROR(Service_AM, "transfer_memory_handle is null");
266 if (transfer_mem.IsNull()) { 238 R_THROW(ResultUnknown);
267 LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle);
268 IPC::ResponseBuilder rb{ctx, 2};
269 rb.Push(ResultUnknown);
270 return;
271 } 239 }
272 240
273 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 241 *out_storage = std::make_shared<IStorage>(
274 rb.Push(ResultSuccess); 242 system, AM::CreateTransferMemoryStorage(transfer_memory_handle->GetOwner()->GetMemory(),
275 rb.PushIpcInterface<IStorage>( 243 transfer_memory_handle.Get(), is_writable, size));
276 system, AM::CreateTransferMemoryStorage(ctx.GetMemory(), transfer_mem.GetPointerUnsafe(), 244 R_SUCCEED();
277 params.is_writable, params.size));
278} 245}
279 246
280void ILibraryAppletCreator::CreateHandleStorage(HLERequestContext& ctx) { 247Result ILibraryAppletCreator::CreateHandleStorage(
281 IPC::RequestParser rp{ctx}; 248 Out<SharedPointer<IStorage>> out_storage, s64 size,
282 249 InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
283 const s64 size{rp.Pop<s64>()}; 250 LOG_DEBUG(Service_AM, "called, size={}", size);
284 const auto handle{ctx.GetCopyHandle(0)};
285
286 LOG_DEBUG(Service_AM, "called, size={}, handle={:08X}", size, handle);
287 251
288 if (size <= 0) { 252 if (size <= 0) {
289 LOG_ERROR(Service_AM, "size is less than or equal to 0"); 253 LOG_ERROR(Service_AM, "size is less than or equal to 0");
290 IPC::ResponseBuilder rb{ctx, 2}; 254 R_THROW(ResultUnknown);
291 rb.Push(ResultUnknown);
292 return;
293 } 255 }
294 256
295 auto transfer_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(handle); 257 if (!transfer_memory_handle) {
296 258 LOG_ERROR(Service_AM, "transfer_memory_handle is null");
297 if (transfer_mem.IsNull()) { 259 R_THROW(ResultUnknown);
298 LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle);
299 IPC::ResponseBuilder rb{ctx, 2};
300 rb.Push(ResultUnknown);
301 return;
302 } 260 }
303 261
304 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 262 *out_storage = std::make_shared<IStorage>(
305 rb.Push(ResultSuccess); 263 system, AM::CreateHandleStorage(transfer_memory_handle->GetOwner()->GetMemory(),
306 rb.PushIpcInterface<IStorage>( 264 transfer_memory_handle.Get(), size));
307 system, AM::CreateHandleStorage(ctx.GetMemory(), transfer_mem.GetPointerUnsafe(), size)); 265 R_SUCCEED();
308} 266}
309 267
310} // namespace Service::AM 268} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h
new file mode 100644
index 000000000..fe6d40eb3
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_creator.h
@@ -0,0 +1,35 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/am/am_types.h"
7#include "core/hle/service/cmif_types.h"
8#include "core/hle/service/service.h"
9
10namespace Service::AM {
11
12struct Applet;
13class ILibraryAppletAccessor;
14class IStorage;
15
16class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
17public:
18 explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet);
19 ~ILibraryAppletCreator() override;
20
21private:
22 Result CreateLibraryApplet(
23 Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
24 LibraryAppletMode library_applet_mode);
25 Result CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size);
26 Result CreateTransferMemoryStorage(
27 Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
28 InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
29 Result CreateHandleStorage(Out<SharedPointer<IStorage>> out_storage, s64 size,
30 InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
31
32 const std::shared_ptr<Applet> m_applet;
33};
34
35} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_proxy.cpp b/src/core/hle/service/am/service/library_applet_proxy.cpp
index cf1a34db2..f1a13a331 100644
--- a/src/core/hle/service/am/service/library_applet_proxy.cpp
+++ b/src/core/hle/service/am/service/library_applet_proxy.cpp
@@ -1,7 +1,6 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/am/library_applet_creator.h"
5#include "core/hle/service/am/library_applet_self_accessor.h" 4#include "core/hle/service/am/library_applet_self_accessor.h"
6#include "core/hle/service/am/process_winding_controller.h" 5#include "core/hle/service/am/process_winding_controller.h"
7#include "core/hle/service/am/self_controller.h" 6#include "core/hle/service/am/self_controller.h"
@@ -12,6 +11,7 @@
12#include "core/hle/service/am/service/display_controller.h" 11#include "core/hle/service/am/service/display_controller.h"
13#include "core/hle/service/am/service/global_state_controller.h" 12#include "core/hle/service/am/service/global_state_controller.h"
14#include "core/hle/service/am/service/home_menu_functions.h" 13#include "core/hle/service/am/service/home_menu_functions.h"
14#include "core/hle/service/am/service/library_applet_creator.h"
15#include "core/hle/service/am/service/library_applet_proxy.h" 15#include "core/hle/service/am/service/library_applet_proxy.h"
16#include "core/hle/service/am/window_controller.h" 16#include "core/hle/service/am/window_controller.h"
17#include "core/hle/service/cmif_serialization.h" 17#include "core/hle/service/cmif_serialization.h"
diff --git a/src/core/hle/service/am/service/system_applet_proxy.cpp b/src/core/hle/service/am/service/system_applet_proxy.cpp
index 8fa852cfa..59d5b2a23 100644
--- a/src/core/hle/service/am/service/system_applet_proxy.cpp
+++ b/src/core/hle/service/am/service/system_applet_proxy.cpp
@@ -2,7 +2,6 @@
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/service/am/application_creator.h" 4#include "core/hle/service/am/application_creator.h"
5#include "core/hle/service/am/library_applet_creator.h"
6#include "core/hle/service/am/library_applet_self_accessor.h" 5#include "core/hle/service/am/library_applet_self_accessor.h"
7#include "core/hle/service/am/process_winding_controller.h" 6#include "core/hle/service/am/process_winding_controller.h"
8#include "core/hle/service/am/self_controller.h" 7#include "core/hle/service/am/self_controller.h"
@@ -13,6 +12,7 @@
13#include "core/hle/service/am/service/display_controller.h" 12#include "core/hle/service/am/service/display_controller.h"
14#include "core/hle/service/am/service/global_state_controller.h" 13#include "core/hle/service/am/service/global_state_controller.h"
15#include "core/hle/service/am/service/home_menu_functions.h" 14#include "core/hle/service/am/service/home_menu_functions.h"
15#include "core/hle/service/am/service/library_applet_creator.h"
16#include "core/hle/service/am/service/system_applet_proxy.h" 16#include "core/hle/service/am/service/system_applet_proxy.h"
17#include "core/hle/service/am/window_controller.h" 17#include "core/hle/service/am/window_controller.h"
18#include "core/hle/service/cmif_serialization.h" 18#include "core/hle/service/cmif_serialization.h"