Browse Source
Merge pull request #62 from bunnei/domain-close-handle
Implement IPC domain command CloseVirtualHandle
pull/15/merge
bunnei
8 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with
38 additions and
4 deletions
-
src/common/logging/backend.cpp
-
src/common/logging/log.h
-
src/core/hle/ipc.h
-
src/core/hle/kernel/domain.cpp
-
src/core/hle/kernel/hle_ipc.cpp
|
|
|
@ -43,6 +43,7 @@ namespace Log { |
|
|
|
SUB(HW, LCD) \ |
|
|
|
SUB(HW, GPU) \ |
|
|
|
SUB(HW, AES) \ |
|
|
|
CLS(IPC) \ |
|
|
|
CLS(Frontend) \ |
|
|
|
CLS(Render) \ |
|
|
|
SUB(Render, Software) \ |
|
|
|
@ -91,8 +92,8 @@ const char* GetLevelName(Level log_level) { |
|
|
|
|
|
|
|
Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, |
|
|
|
const char* function, const char* format, va_list args) { |
|
|
|
using std::chrono::steady_clock; |
|
|
|
using std::chrono::duration_cast; |
|
|
|
using std::chrono::steady_clock; |
|
|
|
|
|
|
|
static steady_clock::time_point time_origin = steady_clock::now(); |
|
|
|
|
|
|
|
|
|
|
|
@ -60,6 +60,7 @@ enum class Class : ClassType { |
|
|
|
HW_LCD, ///< LCD register emulation |
|
|
|
HW_GPU, ///< GPU control emulation |
|
|
|
HW_AES, ///< AES engine emulation |
|
|
|
IPC, ///< IPC interface |
|
|
|
Frontend, ///< Emulator UI |
|
|
|
Render, ///< Emulator video output and hardware acceleration |
|
|
|
Render_Software, ///< Software renderer backend |
|
|
|
|
|
|
|
@ -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; |
|
|
|
|
|
|
|
@ -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}; |
|
|
|
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); |
|
|
|
} |
|
|
|
|
|
|
|
@ -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.
|
|
|
|
} |
|
|
|
|