summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/sm/sm_controller.cpp
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2022-10-31 01:58:20 +0100
committerLiam <byteslice@airmail.cc>2022-10-31 13:23:29 +0100
commit4e9adae5da95219b85f11309919944bc07c4043d (patch)
tree7da5ffe32d5e20c9d5989a2cec7cc5c96a83f796 /src/core/hle/service/sm/sm_controller.cpp
parentMerge pull request #9158 from liamwhite/single-bore (diff)
downloadyuzu-4e9adae5da95219b85f11309919944bc07c4043d.tar
yuzu-4e9adae5da95219b85f11309919944bc07c4043d.tar.gz
yuzu-4e9adae5da95219b85f11309919944bc07c4043d.tar.bz2
yuzu-4e9adae5da95219b85f11309919944bc07c4043d.tar.lz
yuzu-4e9adae5da95219b85f11309919944bc07c4043d.tar.xz
yuzu-4e9adae5da95219b85f11309919944bc07c4043d.tar.zst
yuzu-4e9adae5da95219b85f11309919944bc07c4043d.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/sm/sm_controller.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp
index 273f79568..46a8439d8 100644
--- a/src/core/hle/service/sm/sm_controller.cpp
+++ b/src/core/hle/service/sm/sm_controller.cpp
@@ -28,23 +28,36 @@ void Controller::ConvertCurrentObjectToDomain(Kernel::HLERequestContext& ctx) {
void Controller::CloneCurrentObject(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service, "called");
+ auto& process = *ctx.GetThread().GetOwnerProcess();
auto& parent_session = *ctx.Session()->GetParent();
- auto& parent_port = parent_session.GetParent()->GetParent()->GetClientPort();
auto& session_manager = parent_session.GetServerSession().GetSessionRequestManager();
+ auto& session_handler = session_manager->SessionHandler();
- // Create a session.
- Kernel::KClientSession* session{};
- const Result 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(result);
- }
+ // FIXME: this is duplicated from the SVC, it should just call it instead
+ // once this is a proper process
+
+ // Reserve a new session from the process resource limit.
+ Kernel::KScopedResourceReservation session_reservation(&process,
+ Kernel::LimitableResource::Sessions);
+ ASSERT(session_reservation.Succeeded());
+
+ // Create the session.
+ Kernel::KSession* session = Kernel::KSession::Create(system.Kernel());
+ ASSERT(session != nullptr);
+
+ // Initialize the session.
+ session->Initialize(nullptr, parent_session.GetName(), session_manager);
+
+ // Commit the session reservation.
+ session_reservation.Commit();
+
+ // Register the session.
+ session_handler.ClientConnected(&session->GetServerSession());
// We succeeded.
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
rb.Push(ResultSuccess);
- rb.PushMoveObjects(session);
+ rb.PushMoveObjects(session->GetClientSession());
}
void Controller::CloneCurrentObjectEx(Kernel::HLERequestContext& ctx) {