5 changed files with 112 additions and 4 deletions
-
2src/core/CMakeLists.txt
-
44src/core/hle/kernel/domain.cpp
-
45src/core/hle/kernel/domain.h
-
17src/core/hle/kernel/kernel.h
-
8src/core/hle/kernel/sync_object.h
@ -0,0 +1,44 @@ |
|||
// Copyright 2017 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/hle/kernel/client_port.h"
|
|||
#include "core/hle/kernel/domain.h"
|
|||
#include "core/hle/kernel/handle_table.h"
|
|||
#include "core/hle/kernel/hle_ipc.h"
|
|||
#include "core/hle/kernel/process.h"
|
|||
#include "core/hle/kernel/session.h"
|
|||
#include "core/hle/kernel/thread.h"
|
|||
|
|||
namespace Kernel { |
|||
|
|||
ResultVal<SharedPtr<Domain>> Domain::Create(std::string name) { |
|||
SharedPtr<Domain> domain(new Domain); |
|||
domain->name = std::move(name); |
|||
return MakeResult(std::move(domain)); |
|||
} |
|||
|
|||
ResultVal<SharedPtr<Domain>> Domain::CreateFromSession(const Session& session) { |
|||
auto res = Create(session.port->GetName() + "_Domain"); |
|||
auto& domain = res.Unwrap(); |
|||
domain->request_handlers.push_back(std::move(session.server->hle_handler)); |
|||
Kernel::g_handle_table.ConvertSessionToDomain(session, domain); |
|||
return res; |
|||
} |
|||
|
|||
ResultCode Domain::SendSyncRequest(SharedPtr<Thread> thread) { |
|||
Kernel::HLERequestContext context(this); |
|||
u32* cmd_buf = (u32*)Memory::GetPointer(Kernel::GetCurrentThread()->GetTLSAddress()); |
|||
context.PopulateFromIncomingCommandBuffer(cmd_buf, *Kernel::g_current_process, |
|||
Kernel::g_handle_table); |
|||
|
|||
auto& domain_message_header = context.GetDomainMessageHeader(); |
|||
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); |
|||
} |
|||
return request_handlers.front()->HandleSyncRequest(context); |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -0,0 +1,45 @@ |
|||
// Copyright 2017 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
#include <string> |
|||
#include <vector> |
|||
#include "core/hle/kernel/sync_object.h" |
|||
#include "core/hle/result.h" |
|||
|
|||
namespace Kernel { |
|||
|
|||
class Session; |
|||
class SessionRequestHandler; |
|||
|
|||
class Domain final : public SyncObject { |
|||
public: |
|||
std::string GetTypeName() const override { |
|||
return "Domain"; |
|||
} |
|||
|
|||
static const HandleType HANDLE_TYPE = HandleType::Domain; |
|||
HandleType GetHandleType() const override { |
|||
return HANDLE_TYPE; |
|||
} |
|||
|
|||
static ResultVal<SharedPtr<Domain>> CreateFromSession(const Session& server); |
|||
|
|||
ResultCode SendSyncRequest(SharedPtr<Thread> thread) override; |
|||
|
|||
/// The name of this domain (optional) |
|||
std::string name; |
|||
|
|||
std::vector<std::shared_ptr<SessionRequestHandler>> request_handlers; |
|||
|
|||
private: |
|||
Domain() = default; |
|||
~Domain() override = default; |
|||
|
|||
static ResultVal<SharedPtr<Domain>> Create(std::string name = "Unknown"); |
|||
}; |
|||
|
|||
} // namespace Kernel |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue