10 changed files with 2 additions and 169 deletions
-
3src/core/CMakeLists.txt
-
1src/core/hle/ipc_helpers.h
-
3src/core/hle/kernel/client_session.h
-
63src/core/hle/kernel/domain.cpp
-
45src/core/hle/kernel/domain.h
-
1src/core/hle/kernel/hle_ipc.cpp
-
16src/core/hle/kernel/kernel.h
-
3src/core/hle/kernel/svc.cpp
-
35src/core/hle/kernel/sync_object.h
-
1src/core/hle/service/sm/controller.cpp
@ -1,63 +0,0 @@ |
|||||
// Copyright 2018 yuzu emulator team
|
|
||||
// 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"
|
|
||||
#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}; |
|
||||
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); |
|
||||
} |
|
||||
|
|
||||
} // namespace Kernel
|
|
||||
@ -1,45 +0,0 @@ |
|||||
// Copyright 2018 yuzu emulator team |
|
||||
// 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 |
|
||||
@ -1,35 +0,0 @@ |
|||||
// Copyright 2018 yuzu emulator team |
|
||||
// Licensed under GPLv2 or any later version |
|
||||
// Refer to the license.txt file included. |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include <boost/smart_ptr/intrusive_ptr.hpp> |
|
||||
#include "core/hle/kernel/kernel.h" |
|
||||
#include "core/hle/result.h" |
|
||||
|
|
||||
namespace Kernel { |
|
||||
|
|
||||
class Thread; |
|
||||
|
|
||||
/// Class that represents a Kernel object that svcSendSyncRequest can be called on |
|
||||
class SyncObject : public Object { |
|
||||
public: |
|
||||
/** |
|
||||
* Handle a sync request from the emulated application. |
|
||||
* @param thread Thread that initiated the request. |
|
||||
* @returns ResultCode from the operation. |
|
||||
*/ |
|
||||
virtual ResultCode SendSyncRequest(SharedPtr<Thread> thread) = 0; |
|
||||
}; |
|
||||
|
|
||||
// Specialization of DynamicObjectCast for SyncObjects |
|
||||
template <> |
|
||||
inline SharedPtr<SyncObject> DynamicObjectCast<SyncObject>(SharedPtr<Object> object) { |
|
||||
if (object != nullptr && object->IsSyncable()) { |
|
||||
return boost::static_pointer_cast<SyncObject>(std::move(object)); |
|
||||
} |
|
||||
return nullptr; |
|
||||
} |
|
||||
|
|
||||
} // namespace Kernel |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue