summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2017-12-28 23:30:21 -0500
committerGravatar bunnei2017-12-28 23:30:21 -0500
commite17c0019c5cf9faaa8f23e3904342c8c4faf0980 (patch)
tree66c9735e44cf91fadca66cfe5c7a651bdc20cf89 /src
parentkernel: Add SyncObject primitive, use it for ClientSession. (diff)
downloadyuzu-e17c0019c5cf9faaa8f23e3904342c8c4faf0980.tar.gz
yuzu-e17c0019c5cf9faaa8f23e3904342c8c4faf0980.tar.xz
yuzu-e17c0019c5cf9faaa8f23e3904342c8c4faf0980.zip
kernel: Add basic support for Domain object.
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/hle/kernel/domain.cpp44
-rw-r--r--src/core/hle/kernel/domain.h45
-rw-r--r--src/core/hle/kernel/kernel.h17
-rw-r--r--src/core/hle/kernel/sync_object.h8
5 files changed, 112 insertions, 4 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 29abb703f..1e023303d 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -29,6 +29,7 @@ set(SRCS
29 hle/kernel/address_arbiter.cpp 29 hle/kernel/address_arbiter.cpp
30 hle/kernel/client_port.cpp 30 hle/kernel/client_port.cpp
31 hle/kernel/client_session.cpp 31 hle/kernel/client_session.cpp
32 hle/kernel/domain.cpp
32 hle/kernel/event.cpp 33 hle/kernel/event.cpp
33 hle/kernel/handle_table.cpp 34 hle/kernel/handle_table.cpp
34 hle/kernel/hle_ipc.cpp 35 hle/kernel/hle_ipc.cpp
@@ -118,6 +119,7 @@ set(HEADERS
118 hle/kernel/address_arbiter.h 119 hle/kernel/address_arbiter.h
119 hle/kernel/client_port.h 120 hle/kernel/client_port.h
120 hle/kernel/client_session.h 121 hle/kernel/client_session.h
122 hle/kernel/domain.h
121 hle/kernel/errors.h 123 hle/kernel/errors.h
122 hle/kernel/event.h 124 hle/kernel/event.h
123 hle/kernel/handle_table.h 125 hle/kernel/handle_table.h
diff --git a/src/core/hle/kernel/domain.cpp b/src/core/hle/kernel/domain.cpp
new file mode 100644
index 000000000..19ba861f5
--- /dev/null
+++ b/src/core/hle/kernel/domain.cpp
@@ -0,0 +1,44 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/hle/kernel/client_port.h"
6#include "core/hle/kernel/domain.h"
7#include "core/hle/kernel/handle_table.h"
8#include "core/hle/kernel/hle_ipc.h"
9#include "core/hle/kernel/process.h"
10#include "core/hle/kernel/session.h"
11#include "core/hle/kernel/thread.h"
12
13namespace Kernel {
14
15ResultVal<SharedPtr<Domain>> Domain::Create(std::string name) {
16 SharedPtr<Domain> domain(new Domain);
17 domain->name = std::move(name);
18 return MakeResult(std::move(domain));
19}
20
21ResultVal<SharedPtr<Domain>> Domain::CreateFromSession(const Session& session) {
22 auto res = Create(session.port->GetName() + "_Domain");
23 auto& domain = res.Unwrap();
24 domain->request_handlers.push_back(std::move(session.server->hle_handler));
25 Kernel::g_handle_table.ConvertSessionToDomain(session, domain);
26 return res;
27}
28
29ResultCode Domain::SendSyncRequest(SharedPtr<Thread> thread) {
30 Kernel::HLERequestContext context(this);
31 u32* cmd_buf = (u32*)Memory::GetPointer(Kernel::GetCurrentThread()->GetTLSAddress());
32 context.PopulateFromIncomingCommandBuffer(cmd_buf, *Kernel::g_current_process,
33 Kernel::g_handle_table);
34
35 auto& domain_message_header = context.GetDomainMessageHeader();
36 if (domain_message_header) {
37 // If there is a DomainMessageHeader, then this is CommandType "Request"
38 const u32 object_id{context.GetDomainMessageHeader()->object_id};
39 return request_handlers[object_id - 1]->HandleSyncRequest(context);
40 }
41 return request_handlers.front()->HandleSyncRequest(context);
42}
43
44} // namespace Kernel
diff --git a/src/core/hle/kernel/domain.h b/src/core/hle/kernel/domain.h
new file mode 100644
index 000000000..74f7ad0dd
--- /dev/null
+++ b/src/core/hle/kernel/domain.h
@@ -0,0 +1,45 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <memory>
8#include <string>
9#include <vector>
10#include "core/hle/kernel/sync_object.h"
11#include "core/hle/result.h"
12
13namespace Kernel {
14
15class Session;
16class SessionRequestHandler;
17
18class Domain final : public SyncObject {
19public:
20 std::string GetTypeName() const override {
21 return "Domain";
22 }
23
24 static const HandleType HANDLE_TYPE = HandleType::Domain;
25 HandleType GetHandleType() const override {
26 return HANDLE_TYPE;
27 }
28
29 static ResultVal<SharedPtr<Domain>> CreateFromSession(const Session& server);
30
31 ResultCode SendSyncRequest(SharedPtr<Thread> thread) override;
32
33 /// The name of this domain (optional)
34 std::string name;
35
36 std::vector<std::shared_ptr<SessionRequestHandler>> request_handlers;
37
38private:
39 Domain() = default;
40 ~Domain() override = default;
41
42 static ResultVal<SharedPtr<Domain>> Create(std::string name = "Unknown");
43};
44
45} // namespace Kernel
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 73fab3981..e43055bfd 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -31,6 +31,7 @@ enum class HandleType : u32 {
31 ServerPort, 31 ServerPort,
32 ClientSession, 32 ClientSession,
33 ServerSession, 33 ServerSession,
34 Domain,
34}; 35};
35 36
36enum { 37enum {
@@ -83,12 +84,28 @@ public:
83 case HandleType::CodeSet: 84 case HandleType::CodeSet:
84 case HandleType::ClientPort: 85 case HandleType::ClientPort:
85 case HandleType::ClientSession: 86 case HandleType::ClientSession:
87 case HandleType::Domain:
86 return false; 88 return false;
87 } 89 }
88 90
89 UNREACHABLE(); 91 UNREACHABLE();
90 } 92 }
91 93
94 /**
95 * Check if svcSendSyncRequest can be called on the object
96 * @return True svcSendSyncRequest can be called on the object, otherwise false
97 */
98 bool IsSyncable() const {
99 switch (GetHandleType()) {
100 case HandleType::ClientSession:
101 case HandleType::Domain:
102 return true;
103 }
104
105 UNREACHABLE();
106 }
107
108
92public: 109public:
93 static unsigned int next_object_id; 110 static unsigned int next_object_id;
94 111
diff --git a/src/core/hle/kernel/sync_object.h b/src/core/hle/kernel/sync_object.h
index ce2835ca4..5d715226e 100644
--- a/src/core/hle/kernel/sync_object.h
+++ b/src/core/hle/kernel/sync_object.h
@@ -16,10 +16,10 @@ class Thread;
16class SyncObject : public Object { 16class SyncObject : public Object {
17public: 17public:
18 /** 18 /**
19 * Handle a sync request from the emulated application. 19 * Handle a sync request from the emulated application.
20 * @param thread Thread that initiated the request. 20 * @param thread Thread that initiated the request.
21 * @returns ResultCode from the operation. 21 * @returns ResultCode from the operation.
22 */ 22 */
23 virtual ResultCode SendSyncRequest(SharedPtr<Thread> thread) = 0; 23 virtual ResultCode SendSyncRequest(SharedPtr<Thread> thread) = 0;
24}; 24};
25 25