diff options
| author | bunnei <bunneidev@gmail.com> | 2018-01-17 12:09:12 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-17 12:09:12 -0500 | 
| commit | 7172ff4d9a42291f1c3b4de3118b339796c36f11 (patch) | |
| tree | 81d701cd3a236de9f4763b3e6f43cdc426fe7970 /src/core/hle | |
| parent | d92636d424e14002cb44ec3678ffb1192d5e3cc3 (diff) | |
| parent | b588cbcb1dd1c4256c6d0011a424af9d888ecb20 (diff) | |
Merge pull request #62 from bunnei/domain-close-handle
Implement IPC domain command CloseVirtualHandle
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/ipc.h | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/domain.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 10 | 
3 files changed, 35 insertions, 3 deletions
| diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h index 88ba105e5..1840fac12 100644 --- a/src/core/hle/ipc.h +++ b/src/core/hle/ipc.h @@ -143,6 +143,11 @@ struct DataPayloadHeader {  static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect");  struct DomainMessageHeader { +    enum class CommandType : u32_le { +        SendMessage = 1, +        CloseVirtualHandle = 2, +    }; +      union {          // Used when responding to an IPC request, Server -> Client.          struct { @@ -153,7 +158,7 @@ struct DomainMessageHeader {          // Used when performing an IPC request, Client -> Server.          struct {              union { -                BitField<0, 8, u32_le> command; +                BitField<0, 8, CommandType> command;                  BitField<16, 16, u32_le> size;              };              u32_le object_id; diff --git a/src/core/hle/kernel/domain.cpp b/src/core/hle/kernel/domain.cpp index 7ebb4b9c7..5035e9c08 100644 --- a/src/core/hle/kernel/domain.cpp +++ b/src/core/hle/kernel/domain.cpp @@ -2,6 +2,8 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h"  #include "core/hle/kernel/client_port.h"  #include "core/hle/kernel/domain.h"  #include "core/hle/kernel/handle_table.h" @@ -36,7 +38,24 @@ ResultCode Domain::SendSyncRequest(SharedPtr<Thread> thread) {      if (domain_message_header) {          // If there is a DomainMessageHeader, then this is CommandType "Request"          const u32 object_id{context.GetDomainMessageHeader()->object_id}; -        return request_handlers[object_id - 1]->HandleSyncRequest(context); +        switch (domain_message_header->command) { +        case IPC::DomainMessageHeader::CommandType::SendMessage: +            return request_handlers[object_id - 1]->HandleSyncRequest(context); + +        case IPC::DomainMessageHeader::CommandType::CloseVirtualHandle: { +            LOG_DEBUG(IPC, "CloseVirtualHandle, object_id=0x%08X", object_id); + +            request_handlers[object_id - 1] = nullptr; + +            IPC::RequestBuilder rb{context, 2}; +            rb.Push(RESULT_SUCCESS); + +            return RESULT_SUCCESS; +        } +        } + +        LOG_CRITICAL(IPC, "Unknown domain command=%d", domain_message_header->command.Value()); +        UNIMPLEMENTED();      }      return request_handlers.front()->HandleSyncRequest(context);  } diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index afa09b404..ac62a0d5a 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -102,13 +102,21 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) {      data_payload_header =          std::make_unique<IPC::DataPayloadHeader>(rp.PopRaw<IPC::DataPayloadHeader>()); +    data_payload_offset = rp.GetCurrentOffset(); + +    if (domain_message_header && +        domain_message_header->command == +            IPC::DomainMessageHeader::CommandType::CloseVirtualHandle) { +        // CloseVirtualHandle command does not have SFC* or any data +        return; +    } +      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>();      rp.Skip(1, false); // The command is actually an u64, but we don't use the high part.  } | 
