summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-01-17 12:09:12 -0500
committerGravatar GitHub2018-01-17 12:09:12 -0500
commit7172ff4d9a42291f1c3b4de3118b339796c36f11 (patch)
tree81d701cd3a236de9f4763b3e6f43cdc426fe7970 /src
parentMerge pull request #67 from RiverCityRansomware/gdbstubtypo (diff)
parenthle_ipc: Clang format. (diff)
downloadyuzu-7172ff4d9a42291f1c3b4de3118b339796c36f11.tar.gz
yuzu-7172ff4d9a42291f1c3b4de3118b339796c36f11.tar.xz
yuzu-7172ff4d9a42291f1c3b4de3118b339796c36f11.zip
Merge pull request #62 from bunnei/domain-close-handle
Implement IPC domain command CloseVirtualHandle
Diffstat (limited to 'src')
-rw-r--r--src/common/logging/backend.cpp3
-rw-r--r--src/common/logging/log.h1
-rw-r--r--src/core/hle/ipc.h7
-rw-r--r--src/core/hle/kernel/domain.cpp21
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp10
5 files changed, 38 insertions, 4 deletions
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 13f915a01..ba0acfb72 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -43,6 +43,7 @@ namespace Log {
43 SUB(HW, LCD) \ 43 SUB(HW, LCD) \
44 SUB(HW, GPU) \ 44 SUB(HW, GPU) \
45 SUB(HW, AES) \ 45 SUB(HW, AES) \
46 CLS(IPC) \
46 CLS(Frontend) \ 47 CLS(Frontend) \
47 CLS(Render) \ 48 CLS(Render) \
48 SUB(Render, Software) \ 49 SUB(Render, Software) \
@@ -91,8 +92,8 @@ const char* GetLevelName(Level log_level) {
91 92
92Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, 93Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
93 const char* function, const char* format, va_list args) { 94 const char* function, const char* format, va_list args) {
94 using std::chrono::steady_clock;
95 using std::chrono::duration_cast; 95 using std::chrono::duration_cast;
96 using std::chrono::steady_clock;
96 97
97 static steady_clock::time_point time_origin = steady_clock::now(); 98 static steady_clock::time_point time_origin = steady_clock::now();
98 99
diff --git a/src/common/logging/log.h b/src/common/logging/log.h
index 35b5af3cb..57021037a 100644
--- a/src/common/logging/log.h
+++ b/src/common/logging/log.h
@@ -60,6 +60,7 @@ enum class Class : ClassType {
60 HW_LCD, ///< LCD register emulation 60 HW_LCD, ///< LCD register emulation
61 HW_GPU, ///< GPU control emulation 61 HW_GPU, ///< GPU control emulation
62 HW_AES, ///< AES engine emulation 62 HW_AES, ///< AES engine emulation
63 IPC, ///< IPC interface
63 Frontend, ///< Emulator UI 64 Frontend, ///< Emulator UI
64 Render, ///< Emulator video output and hardware acceleration 65 Render, ///< Emulator video output and hardware acceleration
65 Render_Software, ///< Software renderer backend 66 Render_Software, ///< Software renderer backend
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 {
143static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect"); 143static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect");
144 144
145struct DomainMessageHeader { 145struct DomainMessageHeader {
146 enum class CommandType : u32_le {
147 SendMessage = 1,
148 CloseVirtualHandle = 2,
149 };
150
146 union { 151 union {
147 // Used when responding to an IPC request, Server -> Client. 152 // Used when responding to an IPC request, Server -> Client.
148 struct { 153 struct {
@@ -153,7 +158,7 @@ struct DomainMessageHeader {
153 // Used when performing an IPC request, Client -> Server. 158 // Used when performing an IPC request, Client -> Server.
154 struct { 159 struct {
155 union { 160 union {
156 BitField<0, 8, u32_le> command; 161 BitField<0, 8, CommandType> command;
157 BitField<16, 16, u32_le> size; 162 BitField<16, 16, u32_le> size;
158 }; 163 };
159 u32_le object_id; 164 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 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "common/logging/log.h"
6#include "core/hle/ipc_helpers.h"
5#include "core/hle/kernel/client_port.h" 7#include "core/hle/kernel/client_port.h"
6#include "core/hle/kernel/domain.h" 8#include "core/hle/kernel/domain.h"
7#include "core/hle/kernel/handle_table.h" 9#include "core/hle/kernel/handle_table.h"
@@ -36,7 +38,24 @@ ResultCode Domain::SendSyncRequest(SharedPtr<Thread> thread) {
36 if (domain_message_header) { 38 if (domain_message_header) {
37 // If there is a DomainMessageHeader, then this is CommandType "Request" 39 // If there is a DomainMessageHeader, then this is CommandType "Request"
38 const u32 object_id{context.GetDomainMessageHeader()->object_id}; 40 const u32 object_id{context.GetDomainMessageHeader()->object_id};
39 return request_handlers[object_id - 1]->HandleSyncRequest(context); 41 switch (domain_message_header->command) {
42 case IPC::DomainMessageHeader::CommandType::SendMessage:
43 return request_handlers[object_id - 1]->HandleSyncRequest(context);
44
45 case IPC::DomainMessageHeader::CommandType::CloseVirtualHandle: {
46 LOG_DEBUG(IPC, "CloseVirtualHandle, object_id=0x%08X", object_id);
47
48 request_handlers[object_id - 1] = nullptr;
49
50 IPC::RequestBuilder rb{context, 2};
51 rb.Push(RESULT_SUCCESS);
52
53 return RESULT_SUCCESS;
54 }
55 }
56
57 LOG_CRITICAL(IPC, "Unknown domain command=%d", domain_message_header->command.Value());
58 UNIMPLEMENTED();
40 } 59 }
41 return request_handlers.front()->HandleSyncRequest(context); 60 return request_handlers.front()->HandleSyncRequest(context);
42} 61}
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) {
102 data_payload_header = 102 data_payload_header =
103 std::make_unique<IPC::DataPayloadHeader>(rp.PopRaw<IPC::DataPayloadHeader>()); 103 std::make_unique<IPC::DataPayloadHeader>(rp.PopRaw<IPC::DataPayloadHeader>());
104 104
105 data_payload_offset = rp.GetCurrentOffset();
106
107 if (domain_message_header &&
108 domain_message_header->command ==
109 IPC::DomainMessageHeader::CommandType::CloseVirtualHandle) {
110 // CloseVirtualHandle command does not have SFC* or any data
111 return;
112 }
113
105 if (incoming) { 114 if (incoming) {
106 ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'I')); 115 ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'I'));
107 } else { 116 } else {
108 ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'O')); 117 ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'O'));
109 } 118 }
110 119
111 data_payload_offset = rp.GetCurrentOffset();
112 command = rp.Pop<u32_le>(); 120 command = rp.Pop<u32_le>();
113 rp.Skip(1, false); // The command is actually an u64, but we don't use the high part. 121 rp.Skip(1, false); // The command is actually an u64, but we don't use the high part.
114} 122}