diff options
| author | Maufeat <sahyno1996@gmail.com> | 2025-12-18 21:46:00 +0100 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2025-12-18 21:46:00 +0100 |
| commit | 1d869e8495c56ac82e2767b993ce0587197faa01 (patch) | |
| tree | 6e483d097e8ff1e3531d01f992bfadd96b7dc7e8 /src/core/hle/service/service.cpp | |
| parent | 959f72297ded8520547604af6bf2807779cdb0b4 (diff) | |
[hle] stubbed extra services from (parental controls and stuff) fw21 (#3175)
Adds more Firmware 20+ related service commands.
Renames existing service commands according to switchbrew docs,
Unstubs new parental service stuff.
Signed-off-by: lizzie lizzie@eden-emu.dev
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3175
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Co-authored-by: Maufeat <sahyno1996@gmail.com>
Co-committed-by: Maufeat <sahyno1996@gmail.com>
Diffstat (limited to 'src/core/hle/service/service.cpp')
| -rw-r--r-- | src/core/hle/service/service.cpp | 58 |
1 files changed, 22 insertions, 36 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index d70dc2978f..43f8e150d4 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -18,49 +18,43 @@ namespace Service { -/** - * 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) { +/// @brief 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 int num_params = (cmd_buff[0] & 0x3F) + ((cmd_buff[0] >> 6) & 0x3F); std::string function_string = fmt::format("function '{}': port={}", name, port_name); - for (int i = 1; i <= num_params; ++i) { + + for (int i = 1; i <= num_params; ++i) function_string += fmt::format(", cmd_buff[{}]={:#X}", i, cmd_buff[i]); - } + return function_string; } ServiceFrameworkBase::ServiceFrameworkBase(Core::System& system_, const char* service_name_, u32 max_sessions_, InvokerFn* handler_invoker_) : SessionRequestHandler(system_.Kernel(), service_name_), system{system_}, - service_name{service_name_}, max_sessions{max_sessions_}, handler_invoker{handler_invoker_} {} + service_name{service_name_}, handler_invoker{handler_invoker_}, max_sessions{max_sessions_} {} ServiceFrameworkBase::~ServiceFrameworkBase() { // Wait for other threads to release access before destroying - const auto guard = LockService(); + const auto guard = ServiceFrameworkBase::LockService(); } void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) { + // Usually this array is sorted by id already, so hint to insert at the end handlers.reserve(handlers.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 + for (std::size_t i = 0; i < n; ++i) handlers.emplace_hint(handlers.cend(), functions[i].expected_header, functions[i]); - } } -void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, - std::size_t n) { +void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n) { + // Usually this array is sorted by id already, so hint to insert at the end 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 + for (std::size_t i = 0; i < n; ++i) handlers_tipc.emplace_hint(handlers_tipc.cend(), functions[i].expected_header, functions[i]); - } } void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, @@ -69,15 +63,12 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, std::string function_name = info == nullptr ? "<unknown>" : info->name; fmt::memory_buffer buf; - fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#X}", - ctx.GetCommand(), function_name, service_name, cmd_buf[0]); - for (int i = 1; i <= 8; ++i) { + fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#X}", ctx.GetCommand(), function_name, service_name, cmd_buf[0]); + for (int i = 1; i <= 8; ++i) fmt::format_to(std::back_inserter(buf), ", [{}]={:#X}", i, cmd_buf[i]); - } buf.push_back('}'); - system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, - service_name); + system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name); UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); if (Settings::values.use_auto_stub) { LOG_WARNING(Service, "Using auto stub fallback!"); @@ -87,25 +78,20 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, } void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { - auto itr = handlers.find(ctx.GetCommand()); - const FunctionInfoBase* info = itr == handlers.end() ? nullptr : &itr->second; - if (info == nullptr || info->handler_callback == nullptr) { + auto it = handlers.find(ctx.GetCommand()); + FunctionInfoBase const* info = it == handlers.end() ? nullptr : &it->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); } void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) { - 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) { + auto it = handlers_tipc.find(ctx.GetCommand()); + FunctionInfoBase const* info = it == handlers_tipc.end() ? nullptr : &it->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); |
