From b283cf734807e63e4bbee1a085553cb653648944 Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 18 Oct 2017 21:38:01 -0400 Subject: hle_ipc: Parse out buffer X/A/B/B descriptors from incoming command buffer. --- src/core/hle/kernel/hle_ipc.cpp | 25 +++++++++++-------------- src/core/hle/kernel/hle_ipc.h | 8 ++++++++ 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'src/core') diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 35cac68f1..fc05c44b4 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/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); } - // 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()); } - 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()); } - 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()); } - 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()); } if (command_header->buf_c_descriptor_flags != IPC::CommandHeader::BufferDescriptorCFlag::Disabled) { UNIMPLEMENTED(); } - if (incoming && Session()->IsDomain()) { - domain_message_header = std::make_unique(rp.PopRaw()); + // Padding to align to 16 bytes + rp.AlignWithPadding(); } data_payload_header = @@ -123,7 +120,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P HandleTable& dst_table) { ParseCommandBuffer(&cmd_buf[0], false); 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) { size_t command_size = untranslated_size + handle_descriptor_header->num_handles_to_copy + diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 17baffc06..b58e57b14 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h @@ -140,6 +140,10 @@ public: return data_payload_offset; } + const std::vector& BufferDescriptorX() const { + return buffer_x_desciptors; + } + private: std::array cmd_buf; SharedPtr session; @@ -150,6 +154,10 @@ private: std::unique_ptr handle_descriptor_header; std::unique_ptr data_payload_header; std::unique_ptr domain_message_header; + std::vector buffer_x_desciptors; + std::vector buffer_a_desciptors; + std::vector buffer_b_desciptors; + std::vector buffer_w_desciptors; unsigned data_payload_offset{}; u32_le command{}; -- cgit v1.2.3