aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/service/service.cpp
diff options
context:
space:
mode:
authorMaufeat <sahyno1996@gmail.com>2025-12-18 21:46:00 +0100
committercrueter <crueter@eden-emu.dev>2025-12-18 21:46:00 +0100
commit1d869e8495c56ac82e2767b993ce0587197faa01 (patch)
tree6e483d097e8ff1e3531d01f992bfadd96b7dc7e8 /src/core/hle/service/service.cpp
parent959f72297ded8520547604af6bf2807779cdb0b4 (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.cpp58
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);