diff options
| author | 2017-10-18 21:38:01 -0400 | |
|---|---|---|
| committer | 2017-10-18 21:38:01 -0400 | |
| commit | b283cf734807e63e4bbee1a085553cb653648944 (patch) | |
| tree | a098b2d72e435f6f3661a2c4aae15574e49b7b41 /src | |
| parent | service: Add CreatePort function (that does not register/install). (diff) | |
| download | yuzu-b283cf734807e63e4bbee1a085553cb653648944.tar.gz yuzu-b283cf734807e63e4bbee1a085553cb653648944.tar.xz yuzu-b283cf734807e63e4bbee1a085553cb653648944.zip | |
hle_ipc: Parse out buffer X/A/B/B descriptors from incoming command buffer.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 8 |
2 files changed, 19 insertions, 14 deletions
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) { | |||
| 66 | rp.Skip(handle_descriptor_header->num_handles_to_move, false); | 66 | rp.Skip(handle_descriptor_header->num_handles_to_move, false); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | // Padding to align to 16 bytes | 69 | for (int i = 0; i < command_header->num_buf_x_descriptors; ++i) { |
| 70 | rp.AlignWithPadding(); | 70 | buffer_x_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorX>()); |
| 71 | |||
| 72 | if (command_header->num_buf_x_descriptors) { | ||
| 73 | UNIMPLEMENTED(); | ||
| 74 | } | 71 | } |
| 75 | if (command_header->num_buf_a_descriptors) { | 72 | for (int i = 0; i < command_header->num_buf_a_descriptors; ++i) { |
| 76 | UNIMPLEMENTED(); | 73 | buffer_a_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>()); |
| 77 | } | 74 | } |
| 78 | if (command_header->num_buf_b_descriptors) { | 75 | for (int i = 0; i < command_header->num_buf_b_descriptors; ++i) { |
| 79 | UNIMPLEMENTED(); | 76 | buffer_b_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>()); |
| 80 | } | 77 | } |
| 81 | if (command_header->num_buf_w_descriptors) { | 78 | for (int i = 0; i < command_header->num_buf_w_descriptors; ++i) { |
| 82 | UNIMPLEMENTED(); | 79 | buffer_w_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>()); |
| 83 | } | 80 | } |
| 84 | if (command_header->buf_c_descriptor_flags != | 81 | if (command_header->buf_c_descriptor_flags != |
| 85 | IPC::CommandHeader::BufferDescriptorCFlag::Disabled) { | 82 | IPC::CommandHeader::BufferDescriptorCFlag::Disabled) { |
| 86 | UNIMPLEMENTED(); | 83 | UNIMPLEMENTED(); |
| 87 | } | 84 | } |
| 88 | 85 | ||
| 89 | if (incoming && Session()->IsDomain()) { | 86 | // Padding to align to 16 bytes |
| 90 | domain_message_header = std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); | 87 | rp.AlignWithPadding(); |
| 91 | } | 88 | } |
| 92 | 89 | ||
| 93 | data_payload_header = | 90 | data_payload_header = |
| @@ -123,7 +120,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P | |||
| 123 | HandleTable& dst_table) { | 120 | HandleTable& dst_table) { |
| 124 | ParseCommandBuffer(&cmd_buf[0], false); | 121 | ParseCommandBuffer(&cmd_buf[0], false); |
| 125 | size_t untranslated_size = data_payload_offset + command_header->data_size; | 122 | size_t untranslated_size = data_payload_offset + command_header->data_size; |
| 126 | std::copy_n(cmd_buf.begin(), untranslated_size, dst_cmdbuf); | 123 | std::copy_n(cmd_buf.begin(), 64, dst_cmdbuf); |
| 127 | 124 | ||
| 128 | if (command_header->enable_handle_descriptor) { | 125 | if (command_header->enable_handle_descriptor) { |
| 129 | size_t command_size = untranslated_size + handle_descriptor_header->num_handles_to_copy + | 126 | 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: | |||
| 140 | return data_payload_offset; | 140 | return data_payload_offset; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | const std::vector<IPC::BufferDescriptorX>& BufferDescriptorX() const { | ||
| 144 | return buffer_x_desciptors; | ||
| 145 | } | ||
| 146 | |||
| 143 | private: | 147 | private: |
| 144 | std::array<u32, IPC::COMMAND_BUFFER_LENGTH> cmd_buf; | 148 | std::array<u32, IPC::COMMAND_BUFFER_LENGTH> cmd_buf; |
| 145 | SharedPtr<ServerSession> session; | 149 | SharedPtr<ServerSession> session; |
| @@ -150,6 +154,10 @@ private: | |||
| 150 | std::unique_ptr<IPC::HandleDescriptorHeader> handle_descriptor_header; | 154 | std::unique_ptr<IPC::HandleDescriptorHeader> handle_descriptor_header; |
| 151 | std::unique_ptr<IPC::DataPayloadHeader> data_payload_header; | 155 | std::unique_ptr<IPC::DataPayloadHeader> data_payload_header; |
| 152 | std::unique_ptr<IPC::DomainMessageHeader> domain_message_header; | 156 | std::unique_ptr<IPC::DomainMessageHeader> domain_message_header; |
| 157 | std::vector<IPC::BufferDescriptorX> buffer_x_desciptors; | ||
| 158 | std::vector<IPC::BufferDescriptorABW> buffer_a_desciptors; | ||
| 159 | std::vector<IPC::BufferDescriptorABW> buffer_b_desciptors; | ||
| 160 | std::vector<IPC::BufferDescriptorABW> buffer_w_desciptors; | ||
| 153 | 161 | ||
| 154 | unsigned data_payload_offset{}; | 162 | unsigned data_payload_offset{}; |
| 155 | u32_le command{}; | 163 | u32_le command{}; |