From 5ce0e127daddc3683904a409f0ad496fdda4ba44 Mon Sep 17 00:00:00 2001
From: Morph <39850852+Morph1984@users.noreply.github.com>
Date: Wed, 7 Apr 2021 11:03:45 -0400
Subject: [PATCH] bgtc: Update to 12.x and implement OpenTaskService

---
 src/common/logging/backend.cpp     |  1 +
 src/common/logging/log.h           |  1 +
 src/core/hle/service/glue/bgtc.cpp | 27 ++++++++++++++++++++++++++-
 src/core/hle/service/glue/bgtc.h   |  8 ++++++++
 4 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 2d4d2e9e75..4575df24d7 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -212,6 +212,7 @@ void DebuggerBackend::Write(const Entry& entry) {
     SUB(Service, ARP)                                                                              \
     SUB(Service, BCAT)                                                                             \
     SUB(Service, BPC)                                                                              \
+    SUB(Service, BGTC)                                                                             \
     SUB(Service, BTDRV)                                                                            \
     SUB(Service, BTM)                                                                              \
     SUB(Service, Capture)                                                                          \
diff --git a/src/common/logging/log.h b/src/common/logging/log.h
index 8358949182..3d7b7dab7e 100644
--- a/src/common/logging/log.h
+++ b/src/common/logging/log.h
@@ -66,6 +66,7 @@ enum class Class : ClassType {
     Service_ARP,       ///< The ARP service
     Service_Audio,     ///< The Audio (Audio control) service
     Service_BCAT,      ///< The BCAT service
+    Service_BGTC,      ///< The BGTC (Background Task Controller) service
     Service_BPC,       ///< The BPC service
     Service_BTDRV,     ///< The Bluetooth driver service
     Service_BTM,       ///< The BTM service
diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp
index a478b68e15..daecfff150 100644
--- a/src/core/hle/service/glue/bgtc.cpp
+++ b/src/core/hle/service/glue/bgtc.cpp
@@ -2,11 +2,34 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include "common/logging/log.h"
+#include "core/core.h"
+#include "core/hle/ipc_helpers.h"
 #include "core/hle/service/glue/bgtc.h"
 
 namespace Service::Glue {
 
 BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {100, &BGTC_T::OpenTaskService, "OpenTaskService"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+BGTC_T::~BGTC_T() = default;
+
+void BGTC_T::OpenTaskService(Kernel::HLERequestContext& ctx) {
+    LOG_DEBUG(Service_BGTC, "called");
+
+    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+    rb.Push(RESULT_SUCCESS);
+    rb.PushIpcInterface<ITaskService>(system);
+}
+
+ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} {
     // clang-format off
     static const FunctionInfo functions[] = {
         {1, nullptr, "NotifyTaskStarting"},
@@ -20,16 +43,18 @@ BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {
         {13, nullptr, "UnscheduleTask"},
         {14, nullptr, "GetScheduleEvent"},
         {15, nullptr, "SchedulePeriodicTask"},
+        {16, nullptr, "Unknown16"},
         {101, nullptr, "GetOperationMode"},
         {102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"},
         {103, nullptr, "WillStayHalfAwakeInsteadSleep"},
+        {200, nullptr, "Unknown200"},
     };
     // clang-format on
 
     RegisterHandlers(functions);
 }
 
-BGTC_T::~BGTC_T() = default;
+ITaskService::~ITaskService() = default;
 
 BGTC_SC::BGTC_SC(Core::System& system_) : ServiceFramework{system_, "bgtc:sc"} {
     // clang-format off
diff --git a/src/core/hle/service/glue/bgtc.h b/src/core/hle/service/glue/bgtc.h
index 906116ba6a..4c0142fd5a 100644
--- a/src/core/hle/service/glue/bgtc.h
+++ b/src/core/hle/service/glue/bgtc.h
@@ -16,6 +16,14 @@ class BGTC_T final : public ServiceFramework<BGTC_T> {
 public:
     explicit BGTC_T(Core::System& system_);
     ~BGTC_T() override;
+
+    void OpenTaskService(Kernel::HLERequestContext& ctx);
+};
+
+class ITaskService final : public ServiceFramework<ITaskService> {
+public:
+    explicit ITaskService(Core::System& system_);
+    ~ITaskService() override;
 };
 
 class BGTC_SC final : public ServiceFramework<BGTC_SC> {