Browse Source
Merge pull request #137 from bunnei/improve-ipc
Merge pull request #137 from bunnei/improve-ipc
Improve IPC, unify Domains and Sessions, and add validationpull/15/merge
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 311 additions and 452 deletions
-
3src/core/CMakeLists.txt
-
115src/core/hle/ipc_helpers.h
-
6src/core/hle/kernel/client_session.h
-
63src/core/hle/kernel/domain.cpp
-
45src/core/hle/kernel/domain.h
-
10src/core/hle/kernel/handle_table.cpp
-
7src/core/hle/kernel/handle_table.h
-
11src/core/hle/kernel/hle_ipc.cpp
-
27src/core/hle/kernel/hle_ipc.h
-
16src/core/hle/kernel/kernel.h
-
47src/core/hle/kernel/server_session.cpp
-
18src/core/hle/kernel/server_session.h
-
3src/core/hle/kernel/svc.cpp
-
35src/core/hle/kernel/sync_object.h
-
12src/core/hle/service/acc/acc_u0.cpp
-
66src/core/hle/service/am/applet_oe.cpp
-
6src/core/hle/service/apm/apm.cpp
-
60src/core/hle/service/audio/audout_u.cpp
-
18src/core/hle/service/filesystem/fsp_srv.cpp
-
17src/core/hle/service/hid/hid.cpp
-
20src/core/hle/service/lm/lm.cpp
-
10src/core/hle/service/nvdrv/interface.cpp
-
2src/core/hle/service/pctl/pctl_a.cpp
-
2src/core/hle/service/service.cpp
-
2src/core/hle/service/set/set.cpp
-
20src/core/hle/service/sm/controller.cpp
-
7src/core/hle/service/sm/sm.cpp
-
8src/core/hle/service/sockets/bsd_u.cpp
-
61src/core/hle/service/time/time.cpp
-
7src/core/hle/service/time/time.h
-
36src/core/hle/service/vi/vi.cpp
-
3src/core/hle/service/vi/vi_m.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