diff options
| author | 2018-05-02 09:55:14 -0400 | |
|---|---|---|
| committer | 2018-05-02 09:55:14 -0400 | |
| commit | 902182f80cb808d221998ab904a0c8dab93fd440 (patch) | |
| tree | d8add81daca8bc72d5344549528ce4f3953f250f /src/core/hle/kernel | |
| parent | Merge pull request #429 from Subv/ioctl_corruption (diff) | |
| parent | ipc: Add support for PopIpcInterface() method. (diff) | |
| download | yuzu-902182f80cb808d221998ab904a0c8dab93fd440.tar.gz yuzu-902182f80cb808d221998ab904a0c8dab93fd440.tar.xz yuzu-902182f80cb808d221998ab904a0c8dab93fd440.zip | |
Merge pull request #427 from bunnei/domain-inputs
ipc: Add support for PopIpcInterface() method.
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) { |