| 
									
										
										
										
											2022-04-23 04:59:50 -04:00
										 |  |  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
 | 
					
						
							|  |  |  | // SPDX-License-Identifier: GPL-2.0-or-later
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | #include <fmt/format.h>
 | 
					
						
							| 
									
										
										
										
											2017-06-08 23:52:30 -07:00
										 |  |  | #include "common/assert.h"
 | 
					
						
							| 
									
										
										
										
											2015-05-06 04:06:12 -03:00
										 |  |  | #include "common/logging/log.h"
 | 
					
						
							| 
									
										
										
										
											2021-04-14 16:07:40 -07:00
										 |  |  | #include "common/settings.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-13 17:49:59 -04:00
										 |  |  | #include "core/core.h"
 | 
					
						
							| 
									
										
										
										
											2017-06-08 23:52:30 -07:00
										 |  |  | #include "core/hle/ipc.h"
 | 
					
						
							| 
									
										
										
										
											2021-04-23 22:04:28 -07:00
										 |  |  | #include "core/hle/kernel/k_process.h"
 | 
					
						
							| 
									
										
										
										
											2021-04-21 21:53:56 -07:00
										 |  |  | #include "core/hle/kernel/k_server_port.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-02 11:58:58 -04:00
										 |  |  | #include "core/hle/kernel/kernel.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-16 21:32:59 -05:00
										 |  |  | #include "core/hle/service/acc/acc.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-14 22:50:04 -04:00
										 |  |  | #include "core/hle/service/am/am.h"
 | 
					
						
							| 
									
										
										
										
											2017-12-28 15:24:05 -05:00
										 |  |  | #include "core/hle/service/aoc/aoc_u.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-14 22:50:04 -04:00
										 |  |  | #include "core/hle/service/apm/apm.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-14 21:29:11 -05:00
										 |  |  | #include "core/hle/service/audio/audio.h"
 | 
					
						
							| 
									
										
										
										
											2021-07-14 00:52:17 -04:00
										 |  |  | #include "core/hle/service/bcat/bcat_module.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-01 15:40:55 -04:00
										 |  |  | #include "core/hle/service/bpc/bpc.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-26 18:00:50 -04:00
										 |  |  | #include "core/hle/service/btdrv/btdrv.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-28 20:59:09 -04:00
										 |  |  | #include "core/hle/service/btm/btm.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-01 16:24:03 -04:00
										 |  |  | #include "core/hle/service/caps/caps.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:04:31 -04:00
										 |  |  | #include "core/hle/service/erpt/erpt.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-25 15:30:50 -04:00
										 |  |  | #include "core/hle/service/es/es.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:15:31 -04:00
										 |  |  | #include "core/hle/service/eupld/eupld.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:55:20 +03:00
										 |  |  | #include "core/hle/service/fatal/fatal.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-31 07:20:42 -04:00
										 |  |  | #include "core/hle/service/fgm/fgm.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:20:12 -08:00
										 |  |  | #include "core/hle/service/filesystem/filesystem.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-19 17:34:02 -05:00
										 |  |  | #include "core/hle/service/friend/friend.h"
 | 
					
						
							| 
									
										
										
										
											2019-06-24 19:26:16 -04:00
										 |  |  | #include "core/hle/service/glue/glue.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-26 09:25:54 -04:00
										 |  |  | #include "core/hle/service/grc/grc.h"
 | 
					
						
							| 
									
										
										
										
											2015-02-26 21:13:08 -05:00
										 |  |  | #include "core/hle/service/hid/hid.h"
 | 
					
						
							| 
									
										
										
										
											2023-02-19 14:42:12 -05:00
										 |  |  | #include "core/hle/service/ipc_helpers.h"
 | 
					
						
							| 
									
										
										
										
											2022-04-06 14:46:21 -04:00
										 |  |  | #include "core/hle/service/jit/jit.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-27 13:48:33 -04:00
										 |  |  | #include "core/hle/service/lbl/lbl.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-26 01:16:08 -04:00
										 |  |  | #include "core/hle/service/ldn/ldn.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-25 22:57:08 -04:00
										 |  |  | #include "core/hle/service/ldr/ldr.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  | #include "core/hle/service/lm/lm.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-02 09:59:08 -04:00
										 |  |  | #include "core/hle/service/mig/mig.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-27 15:39:30 -04:00
										 |  |  | #include "core/hle/service/mii/mii.h"
 | 
					
						
							| 
									
										
										
										
											2018-06-05 12:19:29 +03:00
										 |  |  | #include "core/hle/service/mm/mm_u.h"
 | 
					
						
							| 
									
										
										
										
											2022-02-10 21:55:28 -06:00
										 |  |  | #include "core/hle/service/mnpp/mnpp_app.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-27 17:32:45 -04:00
										 |  |  | #include "core/hle/service/ncm/ncm.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-27 14:32:39 -04:00
										 |  |  | #include "core/hle/service/nfc/nfc.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-29 21:06:51 -04:00
										 |  |  | #include "core/hle/service/nfp/nfp.h"
 | 
					
						
							| 
									
										
										
										
											2023-09-13 22:06:33 -04:00
										 |  |  | #include "core/hle/service/ngc/ngc.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-02 14:31:27 +03:00
										 |  |  | #include "core/hle/service/nifm/nifm.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-26 02:17:15 -04:00
										 |  |  | #include "core/hle/service/nim/nim.h"
 | 
					
						
							| 
									
										
										
										
											2018-10-21 17:01:01 -04:00
										 |  |  | #include "core/hle/service/npns/npns.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-14 22:22:41 -05:00
										 |  |  | #include "core/hle/service/ns/ns.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-07 21:27:58 -05:00
										 |  |  | #include "core/hle/service/nvdrv/nvdrv.h"
 | 
					
						
							| 
									
										
										
										
											2023-02-19 15:05:34 -05:00
										 |  |  | #include "core/hle/service/nvnflinger/hos_binder_driver_server.h"
 | 
					
						
							|  |  |  | #include "core/hle/service/nvnflinger/nvnflinger.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-19 12:35:07 -08:00
										 |  |  | #include "core/hle/service/olsc/olsc.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-31 06:33:38 -04:00
										 |  |  | #include "core/hle/service/pcie/pcie.h"
 | 
					
						
							| 
									
										
										
										
											2021-07-14 00:52:17 -04:00
										 |  |  | #include "core/hle/service/pctl/pctl_module.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-01 15:40:55 -04:00
										 |  |  | #include "core/hle/service/pcv/pcv.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-25 16:37:00 -04:00
										 |  |  | #include "core/hle/service/pm/pm.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-21 22:04:24 -07:00
										 |  |  | #include "core/hle/service/prepo/prepo.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-01 21:59:22 -04:00
										 |  |  | #include "core/hle/service/psc/psc.h"
 | 
					
						
							| 
									
										
										
										
											2022-06-26 18:48:12 -05:00
										 |  |  | #include "core/hle/service/ptm/ptm.h"
 | 
					
						
							| 
									
										
										
										
											2023-12-08 21:10:42 -05:00
										 |  |  | #include "core/hle/service/ro/ro.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-20 23:52:38 -07:00
										 |  |  | #include "core/hle/service/service.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-02 11:49:35 +03:00
										 |  |  | #include "core/hle/service/set/settings.h"
 | 
					
						
							| 
									
										
										
										
											2017-06-05 23:31:59 -07:00
										 |  |  | #include "core/hle/service/sm/sm.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-18 20:35:03 +01:00
										 |  |  | #include "core/hle/service/sockets/sockets.h"
 | 
					
						
							| 
									
										
										
										
											2021-07-14 00:52:17 -04:00
										 |  |  | #include "core/hle/service/spl/spl_module.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-23 09:32:50 +03:00
										 |  |  | #include "core/hle/service/ssl/ssl.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-14 21:42:23 -05:00
										 |  |  | #include "core/hle/service/time/time.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-07 02:41:43 -04:00
										 |  |  | #include "core/hle/service/usb/usb.h"
 | 
					
						
							| 
									
										
										
										
											2018-01-07 21:27:58 -05:00
										 |  |  | #include "core/hle/service/vi/vi.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-17 21:48:08 -04:00
										 |  |  | #include "core/reporter.h"
 | 
					
						
							| 
									
										
										
										
											2015-02-26 21:13:08 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | namespace Service { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 00:05:12 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Creates a function string for logging, complete with the name (or header code, depending | 
					
						
							|  |  |  |  * on what's passed in) the port name, and all the cmd_buff arguments. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | [[maybe_unused]] static std::string MakeFunctionString(std::string_view name, | 
					
						
							|  |  |  |                                                        std::string_view port_name, | 
					
						
							|  |  |  |                                                        const u32* cmd_buff) { | 
					
						
							|  |  |  |     // Number of params == bits 0-5 + bits 6-11
 | 
					
						
							| 
									
										
										
										
											2020-10-20 19:07:39 -07:00
										 |  |  |     int num_params = (cmd_buff[0] & 0x3F) + ((cmd_buff[0] >> 6) & 0x3F); | 
					
						
							| 
									
										
										
										
											2020-09-25 00:05:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::string function_string = fmt::format("function '{}': port={}", name, port_name); | 
					
						
							| 
									
										
										
										
											2020-10-20 19:07:39 -07:00
										 |  |  |     for (int i = 1; i <= num_params; ++i) { | 
					
						
							| 
									
										
										
										
											2020-09-25 00:05:12 -04:00
										 |  |  |         function_string += fmt::format(", cmd_buff[{}]=0x{:X}", i, cmd_buff[i]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return function_string; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-26 15:19:08 -05:00
										 |  |  | ServiceFrameworkBase::ServiceFrameworkBase(Core::System& system_, const char* service_name_, | 
					
						
							| 
									
										
										
										
											2023-02-18 16:26:48 -05:00
										 |  |  |                                            u32 max_sessions_, InvokerFn* handler_invoker_) | 
					
						
							|  |  |  |     : SessionRequestHandler(system_.Kernel(), service_name_), system{system_}, | 
					
						
							| 
									
										
										
										
											2021-06-04 19:26:48 -07:00
										 |  |  |       service_name{service_name_}, max_sessions{max_sessions_}, handler_invoker{handler_invoker_} {} | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-28 18:23:42 -08:00
										 |  |  | ServiceFrameworkBase::~ServiceFrameworkBase() { | 
					
						
							|  |  |  |     // Wait for other threads to release access before destroying
 | 
					
						
							|  |  |  |     const auto guard = LockService(); | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  | void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) { | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  |     handlers.reserve(handlers.size() + n); | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     for (std::size_t i = 0; i < n; ++i) { | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  |         // Usually this array is sorted by id already, so hint to insert at the end
 | 
					
						
							|  |  |  |         handlers.emplace_hint(handlers.cend(), functions[i].expected_header, functions[i]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 16:08:06 -07:00
										 |  |  | void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, | 
					
						
							|  |  |  |                                                     std::size_t n) { | 
					
						
							|  |  |  |     handlers_tipc.reserve(handlers_tipc.size() + n); | 
					
						
							|  |  |  |     for (std::size_t i = 0; i < n; ++i) { | 
					
						
							|  |  |  |         // Usually this array is sorted by id already, so hint to insert at the end
 | 
					
						
							|  |  |  |         handlers_tipc.emplace_hint(handlers_tipc.cend(), functions[i].expected_header, | 
					
						
							|  |  |  |                                    functions[i]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-19 14:42:12 -05:00
										 |  |  | void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, | 
					
						
							| 
									
										
										
										
											2017-10-15 01:24:22 -04:00
										 |  |  |                                                        const FunctionInfoBase* info) { | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |     auto cmd_buf = ctx.CommandBuffer(); | 
					
						
							| 
									
										
										
										
											2017-12-28 15:24:59 -05:00
										 |  |  |     std::string function_name = info == nullptr ? fmt::format("{}", ctx.GetCommand()) : info->name; | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 02:49:58 +08:00
										 |  |  |     fmt::memory_buffer buf; | 
					
						
							| 
									
										
										
										
											2021-06-23 09:59:56 -04:00
										 |  |  |     fmt::format_to(std::back_inserter(buf), "function '{}': port='{}' cmd_buf={{[0]=0x{:X}", | 
					
						
							|  |  |  |                    function_name, service_name, cmd_buf[0]); | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |     for (int i = 1; i <= 8; ++i) { | 
					
						
							| 
									
										
										
										
											2021-06-23 09:59:56 -04:00
										 |  |  |         fmt::format_to(std::back_inserter(buf), ", [{}]=0x{:X}", i, cmd_buf[i]); | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-04-03 02:49:58 +08:00
										 |  |  |     buf.push_back('}'); | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-26 15:19:08 -05:00
										 |  |  |     system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, | 
					
						
							|  |  |  |                                                          service_name); | 
					
						
							| 
									
										
										
										
											2018-12-06 01:40:21 -05:00
										 |  |  |     UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); | 
					
						
							| 
									
										
										
										
											2021-03-12 17:56:02 -05:00
										 |  |  |     if (Settings::values.use_auto_stub) { | 
					
						
							|  |  |  |         LOG_WARNING(Service, "Using auto stub fallback!"); | 
					
						
							|  |  |  |         IPC::ResponseBuilder rb{ctx, 2}; | 
					
						
							| 
									
										
										
										
											2021-05-21 01:05:04 -04:00
										 |  |  |         rb.Push(ResultSuccess); | 
					
						
							| 
									
										
										
										
											2021-03-12 17:56:02 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-19 14:42:12 -05:00
										 |  |  | void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |     auto itr = handlers.find(ctx.GetCommand()); | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  |     const FunctionInfoBase* info = itr == handlers.end() ? nullptr : &itr->second; | 
					
						
							|  |  |  |     if (info == nullptr || info->handler_callback == nullptr) { | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |         return ReportUnimplementedFunction(ctx, info); | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-10 18:00:54 -04:00
										 |  |  |     LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |     handler_invoker(this, info->handler_callback, ctx); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-19 14:42:12 -05:00
										 |  |  | void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) { | 
					
						
							| 
									
										
										
										
											2021-05-10 16:08:06 -07:00
										 |  |  |     boost::container::flat_map<u32, FunctionInfoBase>::iterator itr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     itr = handlers_tipc.find(ctx.GetCommand()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const FunctionInfoBase* info = itr == handlers_tipc.end() ? nullptr : &itr->second; | 
					
						
							|  |  |  |     if (info == nullptr || info->handler_callback == nullptr) { | 
					
						
							|  |  |  |         return ReportUnimplementedFunction(ctx, info); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); | 
					
						
							|  |  |  |     handler_invoker(this, info->handler_callback, ctx); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-25 22:44:19 -05:00
										 |  |  | Result ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& session, | 
					
						
							| 
									
										
										
										
											2023-02-19 14:42:12 -05:00
										 |  |  |                                                HLERequestContext& ctx) { | 
					
						
							| 
									
										
										
										
											2020-12-28 18:23:42 -08:00
										 |  |  |     const auto guard = LockService(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 23:17:45 +03:00
										 |  |  |     Result result = ResultSuccess; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 16:05:37 -07:00
										 |  |  |     switch (ctx.GetCommandType()) { | 
					
						
							|  |  |  |     case IPC::CommandType::Close: | 
					
						
							|  |  |  |     case IPC::CommandType::TIPC_Close: { | 
					
						
							|  |  |  |         IPC::ResponseBuilder rb{ctx, 2}; | 
					
						
							| 
									
										
										
										
											2021-05-21 01:05:04 -04:00
										 |  |  |         rb.Push(ResultSuccess); | 
					
						
							| 
									
										
										
										
											2023-03-06 19:04:12 -05:00
										 |  |  |         result = IPC::ResultSessionClosed; | 
					
						
							| 
									
										
										
										
											2022-07-31 23:17:45 +03:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-17 14:03:52 -07:00
										 |  |  |     case IPC::CommandType::ControlWithContext: | 
					
						
							| 
									
										
										
										
											2017-10-15 01:24:22 -04:00
										 |  |  |     case IPC::CommandType::Control: { | 
					
						
							| 
									
										
										
										
											2021-05-10 16:05:37 -07:00
										 |  |  |         system.ServiceManager().InvokeControlRequest(ctx); | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-17 14:03:52 -07:00
										 |  |  |     case IPC::CommandType::RequestWithContext: | 
					
						
							| 
									
										
										
										
											2017-10-15 01:24:22 -04:00
										 |  |  |     case IPC::CommandType::Request: { | 
					
						
							| 
									
										
										
										
											2021-05-10 16:05:37 -07:00
										 |  |  |         InvokeRequest(ctx); | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2021-05-10 16:08:06 -07:00
										 |  |  |         if (ctx.IsTipc()) { | 
					
						
							|  |  |  |             InvokeRequestTipc(ctx); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 16:05:37 -07:00
										 |  |  |         UNIMPLEMENTED_MSG("command_type={}", ctx.GetCommandType()); | 
					
						
							| 
									
										
										
										
											2022-11-11 04:12:37 -08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-10-14 22:18:42 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-14 17:58:12 -08:00
										 |  |  |     // If emulation was shutdown, we are closing service threads, do not write the response back to
 | 
					
						
							|  |  |  |     // memory that may be shutting down as well.
 | 
					
						
							|  |  |  |     if (system.IsPoweredOn()) { | 
					
						
							| 
									
										
										
										
											2021-05-10 16:05:37 -07:00
										 |  |  |         ctx.WriteToOutgoingCommandBuffer(ctx.GetThread()); | 
					
						
							| 
									
										
										
										
											2020-12-14 17:58:12 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-31 19:30:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 23:17:45 +03:00
										 |  |  |     return result; | 
					
						
							| 
									
										
										
										
											2017-06-06 21:20:52 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 14:31:58 -08:00
										 |  |  | /// Initialize Services
 | 
					
						
							|  |  |  | Services::Services(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) | 
					
						
							| 
									
										
										
										
											2023-02-19 15:05:34 -05:00
										 |  |  |     : hos_binder_driver_server{std::make_unique<Nvnflinger::HosBinderDriverServer>(system)}, | 
					
						
							|  |  |  |       nv_flinger{std::make_unique<Nvnflinger::Nvnflinger>(system, *hos_binder_driver_server)} { | 
					
						
							| 
									
										
										
										
											2020-11-24 14:31:58 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-18 16:26:48 -05:00
										 |  |  |     auto& kernel = system.Kernel(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-19 15:05:34 -05:00
										 |  |  |     // Nvnflinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
 | 
					
						
							| 
									
										
										
										
											2018-01-22 13:40:02 -05:00
										 |  |  |     // here and pass it into the respective InstallInterfaces functions.
 | 
					
						
							| 
									
										
										
										
											2019-09-21 18:43:11 -04:00
										 |  |  |     system.GetFileSystemController().CreateFactories(*system.GetFilesystem(), false); | 
					
						
							| 
									
										
										
										
											2018-01-22 13:40:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-18 16:26:48 -05:00
										 |  |  |     // clang-format off
 | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("audio",      [&] { Audio::LoopProcess(system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("FS",         [&] { FileSystem::LoopProcess(system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("jit",        [&] { JIT::LoopProcess(system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("ldn",        [&] { LDN::LoopProcess(system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("Loader",     [&] { LDR::LoopProcess(system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("nvservices", [&] { Nvidia::LoopProcess(*nv_flinger, system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("bsdsocket",  [&] { Sockets::LoopProcess(system); }).detach(); | 
					
						
							|  |  |  |     kernel.RunOnHostCoreProcess("vi",         [&] { VI::LoopProcess(system, *nv_flinger, *hos_binder_driver_server); }).detach(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("sm",         [&] { SM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("account",    [&] { Account::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("am",         [&] { AM::LoopProcess(*nv_flinger, system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("aoc",        [&] { AOC::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("apm",        [&] { APM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("bcat",       [&] { BCAT::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("bpc",        [&] { BPC::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("btdrv",      [&] { BtDrv::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("btm",        [&] { BTM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("capsrv",     [&] { Capture::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("erpt",       [&] { ERPT::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("es",         [&] { ES::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("eupld",      [&] { EUPLD::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("fatal",      [&] { Fatal::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("fgm",        [&] { FGM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("friends",    [&] { Friend::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("glue",       [&] { Glue::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("grc",        [&] { GRC::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("hid",        [&] { HID::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("lbl",        [&] { LBL::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("LogManager.Prod", [&] { LM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("mig",        [&] { Migration::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("mii",        [&] { Mii::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("mm",         [&] { MM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("mnpp",       [&] { MNPP::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("NCM",        [&] { NCM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("nfc",        [&] { NFC::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("nfp",        [&] { NFP::LoopProcess(system); }); | 
					
						
							| 
									
										
										
										
											2023-09-13 22:06:33 -04:00
										 |  |  |     kernel.RunOnGuestCoreProcess("ngc",        [&] { NGC::LoopProcess(system); }); | 
					
						
							| 
									
										
										
										
											2023-02-18 16:26:48 -05:00
										 |  |  |     kernel.RunOnGuestCoreProcess("nifm",       [&] { NIFM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("nim",        [&] { NIM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("npns",       [&] { NPNS::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("ns",         [&] { NS::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("olsc",       [&] { OLSC::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("pcie",       [&] { PCIe::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("pctl",       [&] { PCTL::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("pcv",        [&] { PCV::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("prepo",      [&] { PlayReport::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("ProcessManager", [&] { PM::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("psc",        [&] { PSC::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("ptm",        [&] { PTM::LoopProcess(system); }); | 
					
						
							| 
									
										
										
										
											2023-12-08 21:10:42 -05:00
										 |  |  |     kernel.RunOnGuestCoreProcess("ro",         [&] { RO::LoopProcess(system); }); | 
					
						
							| 
									
										
										
										
											2023-02-18 16:26:48 -05:00
										 |  |  |     kernel.RunOnGuestCoreProcess("settings",   [&] { Set::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("spl",        [&] { SPL::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("ssl",        [&] { SSL::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("time",       [&] { Time::LoopProcess(system); }); | 
					
						
							|  |  |  |     kernel.RunOnGuestCoreProcess("usb",        [&] { USB::LoopProcess(system); }); | 
					
						
							|  |  |  |     // clang-format on
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 14:31:58 -08:00
										 |  |  | Services::~Services() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 05:45:45 -04:00
										 |  |  | void Services::KillNVNFlinger() { | 
					
						
							|  |  |  |     nv_flinger->ShutdownLayers(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-15 01:24:22 -04:00
										 |  |  | } // namespace Service
 |