Browse Source

hle_ipc: Parse out buffer X/A/B/B descriptors from incoming command buffer.

bunnei 8 years ago
parent
commit
b283cf7348
2 changed files with 19 additions and 14 deletions
  1. 11 14
      src/core/hle/kernel/hle_ipc.cpp
  2. 8 0
      src/core/hle/kernel/hle_ipc.h

+ 11 - 14
src/core/hle/kernel/hle_ipc.cpp

@@ -66,28 +66,25 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) {
         rp.Skip(handle_descriptor_header->num_handles_to_move, false);
         rp.Skip(handle_descriptor_header->num_handles_to_move, false);
     }
     }
 
 
-    // Padding to align to 16 bytes
-    rp.AlignWithPadding();
-
-    if (command_header->num_buf_x_descriptors) {
-        UNIMPLEMENTED();
+    for (int i = 0; i < command_header->num_buf_x_descriptors; ++i) {
+        buffer_x_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorX>());
     }
     }
-    if (command_header->num_buf_a_descriptors) {
-        UNIMPLEMENTED();
+    for (int i = 0; i < command_header->num_buf_a_descriptors; ++i) {
+        buffer_a_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>());
     }
     }
-    if (command_header->num_buf_b_descriptors) {
-        UNIMPLEMENTED();
+    for (int i = 0; i < command_header->num_buf_b_descriptors; ++i) {
+        buffer_b_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>());
     }
     }
-    if (command_header->num_buf_w_descriptors) {
-        UNIMPLEMENTED();
+    for (int i = 0; i < command_header->num_buf_w_descriptors; ++i) {
+        buffer_w_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>());
     }
     }
     if (command_header->buf_c_descriptor_flags !=
     if (command_header->buf_c_descriptor_flags !=
         IPC::CommandHeader::BufferDescriptorCFlag::Disabled) {
         IPC::CommandHeader::BufferDescriptorCFlag::Disabled) {
         UNIMPLEMENTED();
         UNIMPLEMENTED();
     }
     }
 
 
-    if (incoming && Session()->IsDomain()) {
-        domain_message_header = std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>());
+    // Padding to align to 16 bytes
+    rp.AlignWithPadding();
     }
     }
 
 
     data_payload_header =
     data_payload_header =
@@ -123,7 +120,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P
                                                            HandleTable& dst_table) {
                                                            HandleTable& dst_table) {
     ParseCommandBuffer(&cmd_buf[0], false);
     ParseCommandBuffer(&cmd_buf[0], false);
     size_t untranslated_size = data_payload_offset + command_header->data_size;
     size_t untranslated_size = data_payload_offset + command_header->data_size;
-    std::copy_n(cmd_buf.begin(), untranslated_size, dst_cmdbuf);
+    std::copy_n(cmd_buf.begin(), 64, dst_cmdbuf);
 
 
     if (command_header->enable_handle_descriptor) {
     if (command_header->enable_handle_descriptor) {
         size_t command_size = untranslated_size + handle_descriptor_header->num_handles_to_copy +
         size_t command_size = untranslated_size + handle_descriptor_header->num_handles_to_copy +

+ 8 - 0
src/core/hle/kernel/hle_ipc.h

@@ -140,6 +140,10 @@ public:
         return data_payload_offset;
         return data_payload_offset;
     }
     }
 
 
+    const std::vector<IPC::BufferDescriptorX>& BufferDescriptorX() const {
+        return buffer_x_desciptors;
+    }
+
 private:
 private:
     std::array<u32, IPC::COMMAND_BUFFER_LENGTH> cmd_buf;
     std::array<u32, IPC::COMMAND_BUFFER_LENGTH> cmd_buf;
     SharedPtr<ServerSession> session;
     SharedPtr<ServerSession> session;
@@ -150,6 +154,10 @@ private:
     std::unique_ptr<IPC::HandleDescriptorHeader> handle_descriptor_header;
     std::unique_ptr<IPC::HandleDescriptorHeader> handle_descriptor_header;
     std::unique_ptr<IPC::DataPayloadHeader> data_payload_header;
     std::unique_ptr<IPC::DataPayloadHeader> data_payload_header;
     std::unique_ptr<IPC::DomainMessageHeader> domain_message_header;
     std::unique_ptr<IPC::DomainMessageHeader> domain_message_header;
+    std::vector<IPC::BufferDescriptorX> buffer_x_desciptors;
+    std::vector<IPC::BufferDescriptorABW> buffer_a_desciptors;
+    std::vector<IPC::BufferDescriptorABW> buffer_b_desciptors;
+    std::vector<IPC::BufferDescriptorABW> buffer_w_desciptors;
 
 
     unsigned data_payload_offset{};
     unsigned data_payload_offset{};
     u32_le command{};
     u32_le command{};