From 7aa97198a31c1bce95332d5ae3bf979b7f7ebc0b Mon Sep 17 00:00:00 2001 From: Subv Date: Tue, 2 Oct 2018 09:07:00 -0500 Subject: [PATCH] Services/AM: Implement the GetSystemUpdaterMutex function. This function just returns a Mutex. --- src/core/hle/service/am/am.cpp | 9 +++++++++ src/core/hle/service/am/am.h | 13 +++++++++++++ src/core/hle/service/am/am_u.cpp | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 0528739ca..65c9d5b7e 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -1291,6 +1291,14 @@ void Module::Interface::DeleteProgram(Kernel::HLERequestContext& ctx) { LOG_ERROR(Service_AM, "FileUtil::DeleteDirRecursively unexpectedly failed"); } +void Module::Interface::GetSystemUpdaterMutex(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx, 0x412, 0, 0); // 0x04120000 + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + rb.Push(RESULT_SUCCESS); + rb.PushCopyObjects(am->system_updater_mutex); +} + void Module::Interface::GetMetaSizeFromCia(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x0413, 0, 2); // 0x04130002 auto cia = rp.PopObject(); @@ -1362,6 +1370,7 @@ void Module::Interface::GetMetaDataFromCia(Kernel::HLERequestContext& ctx) { Module::Module() { ScanForAllTitles(); + system_updater_mutex = Kernel::Mutex::Create(false, "AM::SystemUpdaterMutex"); } Module::~Module() = default; diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 9414c46cb..cb7dff745 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -12,6 +12,7 @@ #include "common/common_types.h" #include "core/file_sys/cia_container.h" #include "core/file_sys/file_backend.h" +#include "core/hle/kernel/mutex.h" #include "core/hle/result.h" #include "core/hle/service/service.h" @@ -480,6 +481,17 @@ public: */ void DeleteProgram(Kernel::HLERequestContext& ctx); + /** + * AM::GetSystemUpdaterMutex service function + * Inputs: + * 0 : Command header (0x04120000) + * Outputs: + * 1 : Result, 0 on success, otherwise error code + * 2 : Copy handle descriptor + * 3 : System updater mutex + */ + void GetSystemUpdaterMutex(Kernel::HLERequestContext& ctx); + /** * AM::GetMetaSizeFromCia service function * Returns the size of a given CIA's meta section @@ -522,6 +534,7 @@ private: bool cia_installing = false; std::array, 3> am_title_list; + Kernel::SharedPtr system_updater_mutex; }; void InstallInterfaces(SM::ServiceManager& service_manager); diff --git a/src/core/hle/service/am/am_u.cpp b/src/core/hle/service/am/am_u.cpp index bab230a44..7fa4a38c0 100644 --- a/src/core/hle/service/am/am_u.cpp +++ b/src/core/hle/service/am/am_u.cpp @@ -70,7 +70,7 @@ AM_U::AM_U(std::shared_ptr am) : Module::Interface(std::move(am), "am:u" {0x040F0000, nullptr, "UpdateFirmwareAuto"}, {0x041000C0, &AM_U::DeleteProgram, "DeleteProgram"}, {0x04110044, nullptr, "GetTwlProgramListForReboot"}, - {0x04120000, nullptr, "GetSystemUpdaterMutex"}, + {0x04120000, &AM_U::GetSystemUpdaterMutex, "GetSystemUpdaterMutex"}, {0x04130002, &AM_U::GetMetaSizeFromCia, "GetMetaSizeFromCia"}, {0x04140044, &AM_U::GetMetaDataFromCia, "GetMetaDataFromCia"}, {0x04150080, nullptr, "CheckDemoLaunchRights"},