Browse Source
Merge pull request #207 from mailwl/duplicatesession
IPC: add domain header to response if only it exists in request
pull/15/merge
bunnei
8 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
12 additions and
6 deletions
-
src/core/hle/ipc_helpers.h
-
src/core/hle/kernel/hle_ipc.cpp
-
src/core/hle/kernel/server_session.cpp
|
|
|
@ -118,7 +118,8 @@ public: |
|
|
|
|
|
|
|
AlignWithPadding(); |
|
|
|
|
|
|
|
if (context.Session()->IsDomain()) { |
|
|
|
const bool request_has_domain_header{context.GetDomainMessageHeader() != nullptr}; |
|
|
|
if (context.Session()->IsDomain() && request_has_domain_header) { |
|
|
|
IPC::DomainMessageHeader domain_header{}; |
|
|
|
domain_header.num_objects = num_domain_objects; |
|
|
|
PushRaw(domain_header); |
|
|
|
|
|
|
|
@ -85,9 +85,14 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) { |
|
|
|
|
|
|
|
if (Session()->IsDomain() && (command_header->type == IPC::CommandType::Request || !incoming)) { |
|
|
|
// If this is an incoming message, only CommandType "Request" has a domain header
|
|
|
|
// All outgoing domain messages have the domain header
|
|
|
|
domain_message_header = |
|
|
|
std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); |
|
|
|
// All outgoing domain messages have the domain header, if only incoming has it
|
|
|
|
if (incoming || domain_message_header) { |
|
|
|
domain_message_header = |
|
|
|
std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); |
|
|
|
} else { |
|
|
|
if (Session()->IsDomain()) |
|
|
|
LOG_WARNING(IPC, "Domain request has no DomainMessageHeader!"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
data_payload_header = |
|
|
|
@ -196,7 +201,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P |
|
|
|
|
|
|
|
// TODO(Subv): Translate the X/A/B/W buffers.
|
|
|
|
|
|
|
|
if (Session()->IsDomain()) { |
|
|
|
if (Session()->IsDomain() && domain_message_header) { |
|
|
|
ASSERT(domain_message_header->num_objects == domain_objects.size()); |
|
|
|
// Write the domain objects to the command buffer, these go after the raw untranslated data.
|
|
|
|
// TODO(Subv): This completely ignores C buffers.
|
|
|
|
|
|
|
|
@ -96,7 +96,7 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr<Thread> thread) { |
|
|
|
|
|
|
|
ResultCode result = RESULT_SUCCESS; |
|
|
|
// If the session has been converted to a domain, handle the domain request
|
|
|
|
if (IsDomain()) { |
|
|
|
if (IsDomain() && context.GetDomainMessageHeader()) { |
|
|
|
result = HandleDomainSyncRequest(context); |
|
|
|
// If there is no domain header, the regular session handler is used
|
|
|
|
} else if (hle_handler != nullptr) { |
|
|
|
|