summaryrefslogtreecommitdiff
path: root/src/core/hle/ipc_helpers.h
diff options
context:
space:
mode:
authorGravatar Liam2022-10-16 01:53:56 -0400
committerGravatar Liam2022-10-31 17:44:06 -0400
commit983f2b70741f17f30fe2321451f10cabecc013d2 (patch)
treec1ac3c1033fdeefaabe76590ca204c4c1b2a98cd /src/core/hle/ipc_helpers.h
parentMerge pull request #9159 from liamwhite/kbork (diff)
downloadyuzu-983f2b70741f17f30fe2321451f10cabecc013d2.tar.gz
yuzu-983f2b70741f17f30fe2321451f10cabecc013d2.tar.xz
yuzu-983f2b70741f17f30fe2321451f10cabecc013d2.zip
kernel: invert session request handling flow
Diffstat (limited to 'src/core/hle/ipc_helpers.h')
-rw-r--r--src/core/hle/ipc_helpers.h17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index 18fde8bd6..3bb111748 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -86,13 +86,13 @@ public:
86 u32 num_domain_objects{}; 86 u32 num_domain_objects{};
87 const bool always_move_handles{ 87 const bool always_move_handles{
88 (static_cast<u32>(flags) & static_cast<u32>(Flags::AlwaysMoveHandles)) != 0}; 88 (static_cast<u32>(flags) & static_cast<u32>(Flags::AlwaysMoveHandles)) != 0};
89 if (!ctx.Session()->GetSessionRequestManager()->IsDomain() || always_move_handles) { 89 if (!ctx.GetManager()->IsDomain() || always_move_handles) {
90 num_handles_to_move = num_objects_to_move; 90 num_handles_to_move = num_objects_to_move;
91 } else { 91 } else {
92 num_domain_objects = num_objects_to_move; 92 num_domain_objects = num_objects_to_move;
93 } 93 }
94 94
95 if (ctx.Session()->GetSessionRequestManager()->IsDomain()) { 95 if (ctx.GetManager()->IsDomain()) {
96 raw_data_size += 96 raw_data_size +=
97 static_cast<u32>(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects); 97 static_cast<u32>(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects);
98 ctx.write_size += num_domain_objects; 98 ctx.write_size += num_domain_objects;
@@ -125,8 +125,7 @@ public:
125 if (!ctx.IsTipc()) { 125 if (!ctx.IsTipc()) {
126 AlignWithPadding(); 126 AlignWithPadding();
127 127
128 if (ctx.Session()->GetSessionRequestManager()->IsDomain() && 128 if (ctx.GetManager()->IsDomain() && ctx.HasDomainMessageHeader()) {
129 ctx.HasDomainMessageHeader()) {
130 IPC::DomainMessageHeader domain_header{}; 129 IPC::DomainMessageHeader domain_header{};
131 domain_header.num_objects = num_domain_objects; 130 domain_header.num_objects = num_domain_objects;
132 PushRaw(domain_header); 131 PushRaw(domain_header);
@@ -146,18 +145,18 @@ public:
146 145
147 template <class T> 146 template <class T>
148 void PushIpcInterface(std::shared_ptr<T> iface) { 147 void PushIpcInterface(std::shared_ptr<T> iface) {
149 if (context->Session()->GetSessionRequestManager()->IsDomain()) { 148 if (context->GetManager()->IsDomain()) {
150 context->AddDomainObject(std::move(iface)); 149 context->AddDomainObject(std::move(iface));
151 } else { 150 } else {
152 kernel.CurrentProcess()->GetResourceLimit()->Reserve( 151 kernel.CurrentProcess()->GetResourceLimit()->Reserve(
153 Kernel::LimitableResource::Sessions, 1); 152 Kernel::LimitableResource::Sessions, 1);
154 153
155 auto* session = Kernel::KSession::Create(kernel); 154 auto* session = Kernel::KSession::Create(kernel);
156 session->Initialize(nullptr, iface->GetServiceName(), 155 session->Initialize(nullptr, iface->GetServiceName());
157 std::make_shared<Kernel::SessionRequestManager>(kernel)); 156 iface->RegisterSession(&session->GetServerSession(),
157 std::make_shared<Kernel::SessionRequestManager>(kernel));
158 158
159 context->AddMoveObject(&session->GetClientSession()); 159 context->AddMoveObject(&session->GetClientSession());
160 iface->ClientConnected(&session->GetServerSession());
161 } 160 }
162 } 161 }
163 162
@@ -387,7 +386,7 @@ public:
387 386
388 template <class T> 387 template <class T>
389 std::weak_ptr<T> PopIpcInterface() { 388 std::weak_ptr<T> PopIpcInterface() {
390 ASSERT(context->Session()->GetSessionRequestManager()->IsDomain()); 389 ASSERT(context->GetManager()->IsDomain());
391 ASSERT(context->GetDomainMessageHeader().input_object_count > 0); 390 ASSERT(context->GetDomainMessageHeader().input_object_count > 0);
392 return context->GetDomainHandler<T>(Pop<u32>() - 1); 391 return context->GetDomainHandler<T>(Pop<u32>() - 1);
393 } 392 }