diff options
author | bunnei <bunneidev@gmail.com> | 2021-06-07 07:52:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-07 07:52:07 +0200 |
commit | 28eb8c83d479403b5da88ae7d3d2a1c6b81a6552 (patch) | |
tree | 43b28bb3b8df05e3f19fe4a151571dedd7171255 /src/core/hle/service/sm/controller.cpp | |
parent | Merge pull request #6400 from ameerj/disable-uniform-simplify (diff) | |
parent | hle: kernel: KServerSession: Use ASSERT_MSG where appropriate. (diff) | |
download | yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.tar yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.tar.gz yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.tar.bz2 yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.tar.lz yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.tar.xz yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.tar.zst yuzu-28eb8c83d479403b5da88ae7d3d2a1c6b81a6552.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/service/sm/controller.cpp | 37 |
1 files changed, 10 insertions, 27 deletions
diff --git a/src/core/hle/service/sm/controller.cpp b/src/core/hle/service/sm/controller.cpp index 5fa5e0512..8b9418e0f 100644 --- a/src/core/hle/service/sm/controller.cpp +++ b/src/core/hle/service/sm/controller.cpp @@ -28,42 +28,25 @@ void Controller::ConvertCurrentObjectToDomain(Kernel::HLERequestContext& ctx) { } void Controller::CloneCurrentObject(Kernel::HLERequestContext& ctx) { - // TODO(bunnei): This is just creating a new handle to the same Session. I assume this is wrong - // and that we probably want to actually make an entirely new Session, but we still need to - // verify this on hardware. - LOG_DEBUG(Service, "called"); - auto& kernel = system.Kernel(); - auto* session = ctx.Session()->GetParent(); - auto* port = session->GetParent()->GetParent(); + auto& parent_session = *ctx.Session()->GetParent(); + auto& parent_port = parent_session.GetParent()->GetParent()->GetClientPort(); + auto& session_manager = parent_session.GetServerSession().GetSessionRequestManager(); - // Reserve a new session from the process resource limit. - Kernel::KScopedResourceReservation session_reservation( - kernel.CurrentProcess()->GetResourceLimit(), Kernel::LimitableResource::Sessions); - if (!session_reservation.Succeeded()) { + // Create a session. + Kernel::KClientSession* session{}; + const ResultCode result = parent_port.CreateSession(std::addressof(session), session_manager); + if (result.IsError()) { + LOG_CRITICAL(Service, "CreateSession failed with error 0x{:08X}", result.raw); IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(Kernel::ResultLimitReached); + rb.Push(result); } - // Create a new session. - auto* clone = Kernel::KSession::Create(kernel); - clone->Initialize(&port->GetClientPort(), session->GetName()); - - // Commit the session reservation. - session_reservation.Commit(); - - // Enqueue the session with the named port. - port->EnqueueSession(&clone->GetServerSession()); - - // Set the session request manager. - clone->GetServerSession().SetSessionRequestManager( - session->GetServerSession().GetSessionRequestManager()); - // We succeeded. IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; rb.Push(ResultSuccess); - rb.PushMoveObjects(clone->GetClientSession()); + rb.PushMoveObjects(session); } void Controller::CloneCurrentObjectEx(Kernel::HLERequestContext& ctx) { |