summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2017-10-18 21:38:01 -0400
committerGravatar bunnei2017-10-18 21:38:01 -0400
commitb283cf734807e63e4bbee1a085553cb653648944 (patch)
treea098b2d72e435f6f3661a2c4aae15574e49b7b41 /src
parentservice: Add CreatePort function (that does not register/install). (diff)
downloadyuzu-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.cpp25
-rw-r--r--src/core/hle/kernel/hle_ipc.h8
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
143private: 147private:
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{};