From 352297d361e46eb19a84d174d54d82bc3d2adcef Mon Sep 17 00:00:00 2001
From: Liam <byteslice@airmail.cc>
Date: Wed, 21 Feb 2024 21:57:18 -0500
Subject: [PATCH] psc: rewrite IPmService

---
 src/core/hle/service/psc/pm_service.cpp | 12 +++++-------
 src/core/hle/service/psc/pm_service.h   |  5 ++++-
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/core/hle/service/psc/pm_service.cpp b/src/core/hle/service/psc/pm_service.cpp
index 99b16bbb0..c4e0ad228 100644
--- a/src/core/hle/service/psc/pm_service.cpp
+++ b/src/core/hle/service/psc/pm_service.cpp
@@ -1,7 +1,7 @@
 // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 // SPDX-License-Identifier: GPL-2.0-or-later
 
-#include "core/hle/service/ipc_helpers.h"
+#include "core/hle/service/cmif_serialization.h"
 #include "core/hle/service/psc/pm_module.h"
 #include "core/hle/service/psc/pm_service.h"
 
@@ -10,7 +10,7 @@ namespace Service::PSC {
 IPmService::IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {
     // clang-format off
     static const FunctionInfo functions[] = {
-        {0, &IPmService::GetPmModule, "GetPmModule"},
+        {0, D<&IPmService::GetPmModule>, "GetPmModule"},
     };
     // clang-format on
 
@@ -19,12 +19,10 @@ IPmService::IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m
 
 IPmService::~IPmService() = default;
 
-void IPmService::GetPmModule(HLERequestContext& ctx) {
+Result IPmService::GetPmModule(Out<SharedPointer<IPmModule>> out_module) {
     LOG_DEBUG(Service_PSC, "called");
-
-    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-    rb.Push(ResultSuccess);
-    rb.PushIpcInterface<IPmModule>(system);
+    *out_module = std::make_shared<IPmModule>(system);
+    R_SUCCEED();
 }
 
 } // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_service.h b/src/core/hle/service/psc/pm_service.h
index e8bd1fa6b..08e14c6f8 100644
--- a/src/core/hle/service/psc/pm_service.h
+++ b/src/core/hle/service/psc/pm_service.h
@@ -3,17 +3,20 @@
 
 #pragma once
 
+#include "core/hle/service/cmif_types.h"
 #include "core/hle/service/service.h"
 
 namespace Service::PSC {
 
+class IPmModule;
+
 class IPmService final : public ServiceFramework<IPmService> {
 public:
     explicit IPmService(Core::System& system_);
     ~IPmService() override;
 
 private:
-    void GetPmModule(HLERequestContext& ctx);
+    Result GetPmModule(Out<SharedPointer<IPmModule>> out_module);
 };
 
 } // namespace Service::PSC