diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/ipc.h | 10 | ||||
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 19 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 8 |
4 files changed, 29 insertions, 10 deletions
diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h index 4dc8937c3..4c21f5024 100644 --- a/src/core/hle/ipc.h +++ b/src/core/hle/ipc.h | |||
| @@ -143,7 +143,7 @@ struct DataPayloadHeader { | |||
| 143 | }; | 143 | }; |
| 144 | static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect"); | 144 | static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect"); |
| 145 | 145 | ||
| 146 | struct DomainMessageHeader { | 146 | struct DomainRequestMessageHeader { |
| 147 | union { | 147 | union { |
| 148 | BitField<0, 8, u32_le> command; | 148 | BitField<0, 8, u32_le> command; |
| 149 | BitField<16, 16, u32_le> size; | 149 | BitField<16, 16, u32_le> size; |
| @@ -151,7 +151,13 @@ struct DomainMessageHeader { | |||
| 151 | u32_le object_id; | 151 | u32_le object_id; |
| 152 | INSERT_PADDING_WORDS(2); | 152 | INSERT_PADDING_WORDS(2); |
| 153 | }; | 153 | }; |
| 154 | static_assert(sizeof(DomainMessageHeader) == 16, "DomainMessageHeader size is incorrect"); | 154 | static_assert(sizeof(DomainRequestMessageHeader) == 16, "DomainRequestMessageHeader size is incorrect"); |
| 155 | |||
| 156 | struct DomainResponseMessageHeader { | ||
| 157 | u32_le num_objects; | ||
| 158 | INSERT_PADDING_WORDS(3); | ||
| 159 | }; | ||
| 160 | static_assert(sizeof(DomainResponseMessageHeader) == 16, "DomainResponseMessageHeader size is incorrect"); | ||
| 155 | 161 | ||
| 156 | enum DescriptorType : u32 { | 162 | enum DescriptorType : u32 { |
| 157 | // Buffer related desciptors types (mask : 0x0F) | 163 | // Buffer related desciptors types (mask : 0x0F) |
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index 28a2b8545..705943e6b 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h | |||
| @@ -58,14 +58,20 @@ public: | |||
| 58 | RequestBuilder(u32* command_buffer) : RequestHelperBase(command_buffer) {} | 58 | RequestBuilder(u32* command_buffer) : RequestHelperBase(command_buffer) {} |
| 59 | 59 | ||
| 60 | RequestBuilder(Kernel::HLERequestContext& context, unsigned normal_params_size, | 60 | RequestBuilder(Kernel::HLERequestContext& context, unsigned normal_params_size, |
| 61 | u32 num_handles_to_copy = 0, u32 num_handles_to_move = 0) | 61 | u32 num_handles_to_copy = 0, u32 num_handles_to_move = 0, u32 num_domain_objects = 0) |
| 62 | : RequestHelperBase(context) { | 62 | : RequestHelperBase(context) { |
| 63 | memset(cmdbuf, 0, 64); | 63 | memset(cmdbuf, 0, 64); |
| 64 | 64 | ||
| 65 | context.ClearIncomingObjects(); | 65 | context.ClearIncomingObjects(); |
| 66 | 66 | ||
| 67 | IPC::CommandHeader header{}; | 67 | IPC::CommandHeader header{}; |
| 68 | header.data_size.Assign(normal_params_size * sizeof(u32)); | 68 | |
| 69 | // The entire size of the raw data section in u32 units, including the 16 bytes of mandatory padding. | ||
| 70 | u32 raw_data_size = sizeof(IPC::DataPayloadHeader) / 4 + 4 + normal_params_size; | ||
| 71 | if (context.IsDomain()) | ||
| 72 | raw_data_size += sizeof(DomainResponseMessageHeader) / 4 + num_domain_objects; | ||
| 73 | |||
| 74 | header.data_size.Assign(raw_data_size); | ||
| 69 | if (num_handles_to_copy || num_handles_to_move) { | 75 | if (num_handles_to_copy || num_handles_to_move) { |
| 70 | header.enable_handle_descriptor.Assign(1); | 76 | header.enable_handle_descriptor.Assign(1); |
| 71 | } | 77 | } |
| @@ -82,7 +88,9 @@ public: | |||
| 82 | AlignWithPadding(); | 88 | AlignWithPadding(); |
| 83 | 89 | ||
| 84 | if (context.IsDomain()) { | 90 | if (context.IsDomain()) { |
| 85 | PushRaw(IPC::DomainMessageHeader{}); | 91 | IPC::DomainResponseMessageHeader domain_header{}; |
| 92 | domain_header.num_objects = num_domain_objects; | ||
| 93 | PushRaw(domain_header); | ||
| 86 | } | 94 | } |
| 87 | 95 | ||
| 88 | IPC::DataPayloadHeader data_payload_header{}; | 96 | IPC::DataPayloadHeader data_payload_header{}; |
| @@ -93,9 +101,10 @@ public: | |||
| 93 | template <class T> | 101 | template <class T> |
| 94 | void PushIpcInterface() { | 102 | void PushIpcInterface() { |
| 95 | auto& request_handlers = context->Domain()->request_handlers; | 103 | auto& request_handlers = context->Domain()->request_handlers; |
| 96 | request_handlers.push_back(std::move(std::make_shared<T>()->shared_from_this())); | 104 | request_handlers.emplace_back(std::make_shared<T>()); |
| 97 | Push(RESULT_SUCCESS); | 105 | Push(RESULT_SUCCESS); |
| 98 | AlignWithPadding(); | 106 | Push<u32>(0); // The error code is the lower word of an u64, so we fill the rest with 0. |
| 107 | // Now push the id of the newly-added object. | ||
| 99 | Push<u32>(static_cast<u32>(request_handlers.size())); | 108 | Push<u32>(static_cast<u32>(request_handlers.size())); |
| 100 | } | 109 | } |
| 101 | 110 | ||
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 85dd80159..e784d59cc 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -95,7 +95,7 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) { | |||
| 95 | // If this is an incoming message, only CommandType "Request" has a domain header | 95 | // If this is an incoming message, only CommandType "Request" has a domain header |
| 96 | // All outgoing domain messages have the domain header | 96 | // All outgoing domain messages have the domain header |
| 97 | domain_message_header = | 97 | domain_message_header = |
| 98 | std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); | 98 | std::make_unique<IPC::DomainRequestMessageHeader>(rp.PopRaw<IPC::DomainRequestMessageHeader>()); |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | data_payload_header = | 101 | data_payload_header = |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 7de13b36b..b5649931d 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -154,7 +154,11 @@ public: | |||
| 154 | return buffer_x_desciptors; | 154 | return buffer_x_desciptors; |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | const std::unique_ptr<IPC::DomainMessageHeader>& GetDomainMessageHeader() const { | 157 | const std::vector<IPC::BufferDescriptorABW>& BufferDescriptorA() const { |
| 158 | return buffer_a_desciptors; | ||
| 159 | } | ||
| 160 | |||
| 161 | const std::unique_ptr<IPC::DomainRequestMessageHeader>& GetDomainMessageHeader() const { | ||
| 158 | return domain_message_header; | 162 | return domain_message_header; |
| 159 | } | 163 | } |
| 160 | 164 | ||
| @@ -172,7 +176,7 @@ private: | |||
| 172 | std::unique_ptr<IPC::CommandHeader> command_header; | 176 | std::unique_ptr<IPC::CommandHeader> command_header; |
| 173 | std::unique_ptr<IPC::HandleDescriptorHeader> handle_descriptor_header; | 177 | std::unique_ptr<IPC::HandleDescriptorHeader> handle_descriptor_header; |
| 174 | std::unique_ptr<IPC::DataPayloadHeader> data_payload_header; | 178 | std::unique_ptr<IPC::DataPayloadHeader> data_payload_header; |
| 175 | std::unique_ptr<IPC::DomainMessageHeader> domain_message_header; | 179 | std::unique_ptr<IPC::DomainRequestMessageHeader> domain_message_header; |
| 176 | std::vector<IPC::BufferDescriptorX> buffer_x_desciptors; | 180 | std::vector<IPC::BufferDescriptorX> buffer_x_desciptors; |
| 177 | std::vector<IPC::BufferDescriptorABW> buffer_a_desciptors; | 181 | std::vector<IPC::BufferDescriptorABW> buffer_a_desciptors; |
| 178 | std::vector<IPC::BufferDescriptorABW> buffer_b_desciptors; | 182 | std::vector<IPC::BufferDescriptorABW> buffer_b_desciptors; |