diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 3 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 6d4ed7648..376263eac 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -202,6 +202,16 @@ public: | |||
| 202 | domain_objects.emplace_back(std::move(object)); | 202 | domain_objects.emplace_back(std::move(object)); |
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | template <typename T> | ||
| 206 | std::shared_ptr<T> GetDomainRequestHandler(size_t index) const { | ||
| 207 | return std::static_pointer_cast<T>(domain_request_handlers[index]); | ||
| 208 | } | ||
| 209 | |||
| 210 | void SetDomainRequestHandlers( | ||
| 211 | const std::vector<std::shared_ptr<SessionRequestHandler>>& handlers) { | ||
| 212 | domain_request_handlers = handlers; | ||
| 213 | } | ||
| 214 | |||
| 205 | /// Clears the list of objects so that no lingering objects are written accidentally to the | 215 | /// Clears the list of objects so that no lingering objects are written accidentally to the |
| 206 | /// response buffer. | 216 | /// response buffer. |
| 207 | void ClearIncomingObjects() { | 217 | void ClearIncomingObjects() { |
| @@ -245,6 +255,8 @@ private: | |||
| 245 | unsigned data_payload_offset{}; | 255 | unsigned data_payload_offset{}; |
| 246 | unsigned buffer_c_offset{}; | 256 | unsigned buffer_c_offset{}; |
| 247 | u32_le command{}; | 257 | u32_le command{}; |
| 258 | |||
| 259 | std::vector<std::shared_ptr<SessionRequestHandler>> domain_request_handlers; | ||
| 248 | }; | 260 | }; |
| 249 | 261 | ||
| 250 | } // namespace Kernel | 262 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index b1f8e771c..ed33c8600 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -61,6 +61,9 @@ void ServerSession::Acquire(Thread* thread) { | |||
| 61 | ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& context) { | 61 | ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& context) { |
| 62 | auto& domain_message_header = context.GetDomainMessageHeader(); | 62 | auto& domain_message_header = context.GetDomainMessageHeader(); |
| 63 | if (domain_message_header) { | 63 | if (domain_message_header) { |
| 64 | // Set domain handlers in HLE context, used for domain objects (IPC interfaces) as inputs | ||
| 65 | context.SetDomainRequestHandlers(domain_request_handlers); | ||
| 66 | |||
| 64 | // If there is a DomainMessageHeader, then this is CommandType "Request" | 67 | // If there is a DomainMessageHeader, then this is CommandType "Request" |
| 65 | const u32 object_id{context.GetDomainMessageHeader()->object_id}; | 68 | const u32 object_id{context.GetDomainMessageHeader()->object_id}; |
| 66 | switch (domain_message_header->command) { | 69 | switch (domain_message_header->command) { |