diff options
author | bunnei <bunneidev@gmail.com> | 2017-10-15 07:24:22 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2017-10-15 07:24:22 +0200 |
commit | 4fb1b24d68e140230da612d464a5edc226860946 (patch) | |
tree | ed6cc24d62caf4476737508de317908a6cb23e90 /src/core/hle/kernel/hle_ipc.cpp | |
parent | core: Refactor MakeMagic usage and remove dead code. (diff) | |
download | yuzu-4fb1b24d68e140230da612d464a5edc226860946.tar yuzu-4fb1b24d68e140230da612d464a5edc226860946.tar.gz yuzu-4fb1b24d68e140230da612d464a5edc226860946.tar.bz2 yuzu-4fb1b24d68e140230da612d464a5edc226860946.tar.lz yuzu-4fb1b24d68e140230da612d464a5edc226860946.tar.xz yuzu-4fb1b24d68e140230da612d464a5edc226860946.tar.zst yuzu-4fb1b24d68e140230da612d464a5edc226860946.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index b7070af03..35cac68f1 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -4,6 +4,7 @@ #include <boost/range/algorithm_ext/erase.hpp> #include "common/assert.h" +#include "common/common_funcs.h" #include "common/common_types.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/handle_table.h" @@ -45,10 +46,15 @@ void HLERequestContext::ClearIncomingObjects() { request_handles.clear(); } -void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf) { +void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) { IPC::RequestParser rp(src_cmdbuf); command_header = std::make_unique<IPC::CommandHeader>(rp.PopRaw<IPC::CommandHeader>()); + if (command_header->type == IPC::CommandType::Close) { + // Close does not populate the rest of the IPC header + return; + } + // If handle descriptor is present, add size of it if (command_header->enable_handle_descriptor) { handle_descriptor_header = @@ -80,9 +86,18 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf) { UNIMPLEMENTED(); } + if (incoming && Session()->IsDomain()) { + domain_message_header = std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); + } + data_payload_header = std::make_unique<IPC::DataPayloadHeader>(rp.PopRaw<IPC::DataPayloadHeader>()); - ASSERT(data_payload_header->magic == 0x49434653 || data_payload_header->magic == 0x4F434653); + + if (incoming) { + ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'I')); + } else { + ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'O')); + } data_payload_offset = rp.GetCurrentOffset(); command = rp.Pop<u32_le>(); @@ -91,7 +106,7 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf) { ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(u32_le* src_cmdbuf, Process& src_process, HandleTable& src_table) { - ParseCommandBuffer(src_cmdbuf); + ParseCommandBuffer(src_cmdbuf, true); size_t untranslated_size = data_payload_offset + command_header->data_size; std::copy_n(src_cmdbuf, untranslated_size, cmd_buf.begin()); @@ -106,7 +121,7 @@ ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(u32_le* src_cmdb ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, Process& dst_process, HandleTable& dst_table) { - ParseCommandBuffer(&cmd_buf[0]); + 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); |