summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/sm
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-06-05 04:26:48 +0200
committerbunnei <bunneidev@gmail.com>2021-06-05 04:26:48 +0200
commit27ce97fd42d758350c5100c4bbcb78de0a6d48b5 (patch)
tree7ebe2d29e0bbac3cd33dd21f8f154632aedfdea9 /src/core/hle/service/sm
parentMerge pull request #6392 from german77/controller-widget (diff)
downloadyuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.tar
yuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.tar.gz
yuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.tar.bz2
yuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.tar.lz
yuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.tar.xz
yuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.tar.zst
yuzu-27ce97fd42d758350c5100c4bbcb78de0a6d48b5.zip
Diffstat (limited to 'src/core/hle/service/sm')
-rw-r--r--src/core/hle/service/sm/controller.cpp37
-rw-r--r--src/core/hle/service/sm/sm.cpp2
2 files changed, 11 insertions, 28 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) {
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index d8b20a3f2..bffa9ffcb 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -46,7 +46,7 @@ Kernel::KClientPort& ServiceManager::InterfaceFactory(ServiceManager& self, Core
self.sm_interface = sm;
self.controller_interface = std::make_unique<Controller>(system);
- return sm->CreatePort(system.Kernel());
+ return sm->CreatePort();
}
ResultVal<Kernel::KServerPort*> ServiceManager::RegisterService(std::string name,