summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/service.h
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-05-16 07:30:21 +0200
committerGitHub <noreply@github.com>2021-05-16 07:30:21 +0200
commit5a2b15bf75318987d773a2bc69bd6224a28b7939 (patch)
treef213f5b011410022e8e98f7c3905d16d575ed413 /src/core/hle/service/service.h
parentMerge pull request #6289 from ameerj/oob-blit (diff)
parentcommon: tree: Avoid a nullptr dereference. (diff)
downloadyuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.tar
yuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.tar.gz
yuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.tar.bz2
yuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.tar.lz
yuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.tar.xz
yuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.tar.zst
yuzu-5a2b15bf75318987d773a2bc69bd6224a28b7939.zip
Diffstat (limited to 'src/core/hle/service/service.h')
-rw-r--r--src/core/hle/service/service.h35
1 files changed, 30 insertions, 5 deletions
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h
index 884951428..3dfb0740a 100644
--- a/src/core/hle/service/service.h
+++ b/src/core/hle/service/service.h
@@ -21,7 +21,9 @@ class System;
namespace Kernel {
class HLERequestContext;
-}
+class KClientPort;
+class KServerSession;
+} // namespace Kernel
namespace Service {
@@ -64,12 +66,19 @@ public:
/// Creates a port pair and registers this service with the given ServiceManager.
void InstallAsService(SM::ServiceManager& service_manager);
- /// Creates a port pair and registers it on the kernel's global port registry.
- void InstallAsNamedPort(Kernel::KernelCore& kernel);
- /// Invokes a service request routine.
+
+ /// Invokes a service request routine using the HIPC protocol.
void InvokeRequest(Kernel::HLERequestContext& ctx);
+
+ /// Invokes a service request routine using the HIPC protocol.
+ void InvokeRequestTipc(Kernel::HLERequestContext& ctx);
+
+ /// Creates a port pair and registers it on the kernel's global port registry.
+ Kernel::KClientPort& CreatePort(Kernel::KernelCore& kernel);
+
/// Handles a synchronization request for the service.
- ResultCode HandleSyncRequest(Kernel::HLERequestContext& context) override;
+ ResultCode HandleSyncRequest(Kernel::KServerSession& session,
+ Kernel::HLERequestContext& context) override;
protected:
/// Member-function pointer type of SyncRequest handlers.
@@ -102,6 +111,7 @@ private:
~ServiceFrameworkBase() override;
void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n);
+ void RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n);
void ReportUnimplementedFunction(Kernel::HLERequestContext& ctx, const FunctionInfoBase* info);
/// Identifier string used to connect to the service.
@@ -116,6 +126,7 @@ private:
/// Function used to safely up-cast pointers to the derived class before invoking a handler.
InvokerFn* handler_invoker;
boost::container::flat_map<u32, FunctionInfoBase> handlers;
+ boost::container::flat_map<u32, FunctionInfoBase> handlers_tipc;
/// Used to gain exclusive access to the service members, e.g. from CoreTiming thread.
Common::SpinLock lock_service;
@@ -183,6 +194,20 @@ protected:
RegisterHandlersBase(functions, n);
}
+ /// Registers handlers in the service.
+ template <std::size_t N>
+ void RegisterHandlersTipc(const FunctionInfo (&functions)[N]) {
+ RegisterHandlersTipc(functions, N);
+ }
+
+ /**
+ * Registers handlers in the service. Usually prefer using the other RegisterHandlers
+ * overload in order to avoid needing to specify the array size.
+ */
+ void RegisterHandlersTipc(const FunctionInfo* functions, std::size_t n) {
+ RegisterHandlersBaseTipc(functions, n);
+ }
+
private:
/**
* This function is used to allow invocation of pointers to handlers stored in the base class