summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/ipc.h10
-rw-r--r--src/core/hle/ipc_helpers.h19
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.h8
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};
144static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect"); 144static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect");
145 145
146struct DomainMessageHeader { 146struct 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};
154static_assert(sizeof(DomainMessageHeader) == 16, "DomainMessageHeader size is incorrect"); 154static_assert(sizeof(DomainRequestMessageHeader) == 16, "DomainRequestMessageHeader size is incorrect");
155
156struct DomainResponseMessageHeader {
157 u32_le num_objects;
158 INSERT_PADDING_WORDS(3);
159};
160static_assert(sizeof(DomainResponseMessageHeader) == 16, "DomainResponseMessageHeader size is incorrect");
155 161
156enum DescriptorType : u32 { 162enum 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;