summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/service.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-05-11 01:08:06 +0200
committerbunnei <bunneidev@gmail.com>2021-05-11 05:34:38 +0200
commit21671d05a362f98cd24dcc520a3da163e349fe07 (patch)
tree904d17169565cb12c4dd7ac8c640d136803ae686 /src/core/hle/service/service.cpp
parenthle: service: Implement IPC::CommandType::Close. (diff)
downloadyuzu-21671d05a362f98cd24dcc520a3da163e349fe07.tar
yuzu-21671d05a362f98cd24dcc520a3da163e349fe07.tar.gz
yuzu-21671d05a362f98cd24dcc520a3da163e349fe07.tar.bz2
yuzu-21671d05a362f98cd24dcc520a3da163e349fe07.tar.lz
yuzu-21671d05a362f98cd24dcc520a3da163e349fe07.tar.xz
yuzu-21671d05a362f98cd24dcc520a3da163e349fe07.tar.zst
yuzu-21671d05a362f98cd24dcc520a3da163e349fe07.zip
Diffstat (limited to 'src/core/hle/service/service.cpp')
-rw-r--r--src/core/hle/service/service.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index e36c35a86..2c9b2ce6d 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -133,6 +133,16 @@ void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* function
}
}
+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]);
+ }
+}
+
void ServiceFrameworkBase::ReportUnimplementedFunction(Kernel::HLERequestContext& ctx,
const FunctionInfoBase* info) {
auto cmd_buf = ctx.CommandBuffer();
@@ -167,6 +177,20 @@ void ServiceFrameworkBase::InvokeRequest(Kernel::HLERequestContext& ctx) {
handler_invoker(this, info->handler_callback, ctx);
}
+void ServiceFrameworkBase::InvokeRequestTipc(Kernel::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) {
+ return ReportUnimplementedFunction(ctx, info);
+ }
+
+ LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
+ handler_invoker(this, info->handler_callback, ctx);
+}
+
ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& session,
Kernel::HLERequestContext& ctx) {
const auto guard = LockService();
@@ -190,6 +214,11 @@ ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& sessi
break;
}
default:
+ if (ctx.IsTipc()) {
+ InvokeRequestTipc(ctx);
+ break;
+ }
+
UNIMPLEMENTED_MSG("command_type={}", ctx.GetCommandType());
}