Эх сурвалжийг харах

Merge pull request #318 from mailwl/account

Service/ACC: convert to module, add acc:aa, acc:su, acc:u1 services
bunnei 8 жил өмнө
parent
commit
20c97c60d5

+ 6 - 0
src/core/CMakeLists.txt

@@ -88,8 +88,14 @@ add_library(core STATIC
     hle/romfs.h
     hle/romfs.h
     hle/service/acc/acc.cpp
     hle/service/acc/acc.cpp
     hle/service/acc/acc.h
     hle/service/acc/acc.h
+    hle/service/acc/acc_aa.cpp
+    hle/service/acc/acc_aa.h
+    hle/service/acc/acc_su.cpp
+    hle/service/acc/acc_su.h
     hle/service/acc/acc_u0.cpp
     hle/service/acc/acc_u0.cpp
     hle/service/acc/acc_u0.h
     hle/service/acc/acc_u0.h
+    hle/service/acc/acc_u1.cpp
+    hle/service/acc/acc_u1.h
     hle/service/am/am.cpp
     hle/service/am/am.cpp
     hle/service/am/am.h
     hle/service/am/am.h
     hle/service/am/applet_ae.cpp
     hle/service/am/applet_ae.cpp

+ 129 - 1
src/core/hle/service/acc/acc.cpp

@@ -2,14 +2,142 @@
 // Licensed under GPLv2 or any later version
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 // Refer to the license.txt file included.
 
 
+#include "common/logging/log.h"
+#include "core/hle/ipc_helpers.h"
 #include "core/hle/service/acc/acc.h"
 #include "core/hle/service/acc/acc.h"
+#include "core/hle/service/acc/acc_aa.h"
+#include "core/hle/service/acc/acc_su.h"
 #include "core/hle/service/acc/acc_u0.h"
 #include "core/hle/service/acc/acc_u0.h"
+#include "core/hle/service/acc/acc_u1.h"
 
 
 namespace Service {
 namespace Service {
 namespace Account {
 namespace Account {
 
 
+// TODO: RE this structure
+struct UserData {
+    INSERT_PADDING_WORDS(1);
+    u32 icon_id;
+    u8 bg_color_id;
+    INSERT_PADDING_BYTES(0x7);
+    INSERT_PADDING_BYTES(0x10);
+    INSERT_PADDING_BYTES(0x60);
+};
+static_assert(sizeof(UserData) == 0x80, "UserData structure has incorrect size");
+
+struct ProfileBase {
+    u8 user_id[0x10];
+    u64 timestamp;
+    u8 username[0x20];
+};
+static_assert(sizeof(ProfileBase) == 0x38, "ProfileBase structure has incorrect size");
+
+using Uid = std::array<u64, 2>;
+static constexpr Uid DEFAULT_USER_ID{0x10ull, 0x20ull};
+
+class IProfile final : public ServiceFramework<IProfile> {
+public:
+    IProfile() : ServiceFramework("IProfile") {
+        static const FunctionInfo functions[] = {
+            {1, &IProfile::GetBase, "GetBase"},
+        };
+        RegisterHandlers(functions);
+    }
+
+private:
+    void GetBase(Kernel::HLERequestContext& ctx) {
+        LOG_WARNING(Service_ACC, "(STUBBED) called");
+        ProfileBase profile_base{};
+        IPC::ResponseBuilder rb{ctx, 16};
+        rb.Push(RESULT_SUCCESS);
+        rb.PushRaw(profile_base);
+    }
+};
+
+class IManagerForApplication final : public ServiceFramework<IManagerForApplication> {
+public:
+    IManagerForApplication() : ServiceFramework("IManagerForApplication") {
+        static const FunctionInfo functions[] = {
+            {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
+            {1, &IManagerForApplication::GetAccountId, "GetAccountId"},
+        };
+        RegisterHandlers(functions);
+    }
+
+private:
+    void CheckAvailability(Kernel::HLERequestContext& ctx) {
+        LOG_WARNING(Service_ACC, "(STUBBED) called");
+        IPC::ResponseBuilder rb{ctx, 3};
+        rb.Push(RESULT_SUCCESS);
+        rb.Push(true); // TODO: Check when this is supposed to return true and when not
+    }
+
+    void GetAccountId(Kernel::HLERequestContext& ctx) {
+        LOG_WARNING(Service_ACC, "(STUBBED) called");
+        IPC::ResponseBuilder rb{ctx, 4};
+        rb.Push(RESULT_SUCCESS);
+        rb.Push<u64>(0x12345678ABCDEF);
+    }
+};
+
+void Module::Interface::GetUserExistence(Kernel::HLERequestContext& ctx) {
+    LOG_WARNING(Service_ACC, "(STUBBED) called");
+    IPC::ResponseBuilder rb{ctx, 3};
+    rb.Push(RESULT_SUCCESS);
+    rb.Push(true); // TODO: Check when this is supposed to return true and when not
+}
+
+void Module::Interface::ListAllUsers(Kernel::HLERequestContext& ctx) {
+    LOG_WARNING(Service_ACC, "(STUBBED) called");
+    constexpr std::array<u128, 10> user_ids{DEFAULT_USER_ID};
+    ctx.WriteBuffer(user_ids.data(), user_ids.size());
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(RESULT_SUCCESS);
+}
+
+void Module::Interface::ListOpenUsers(Kernel::HLERequestContext& ctx) {
+    LOG_WARNING(Service_ACC, "(STUBBED) called");
+    constexpr std::array<u128, 10> user_ids{DEFAULT_USER_ID};
+    ctx.WriteBuffer(user_ids.data(), user_ids.size());
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(RESULT_SUCCESS);
+}
+
+void Module::Interface::GetProfile(Kernel::HLERequestContext& ctx) {
+    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+    rb.Push(RESULT_SUCCESS);
+    rb.PushIpcInterface<IProfile>();
+    LOG_DEBUG(Service_ACC, "called");
+}
+
+void Module::Interface::InitializeApplicationInfo(Kernel::HLERequestContext& ctx) {
+    LOG_WARNING(Service_ACC, "(STUBBED) called");
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(RESULT_SUCCESS);
+}
+
+void Module::Interface::GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx) {
+    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+    rb.Push(RESULT_SUCCESS);
+    rb.PushIpcInterface<IManagerForApplication>();
+    LOG_DEBUG(Service_ACC, "called");
+}
+
+void Module::Interface::GetLastOpenedUser(Kernel::HLERequestContext& ctx) {
+    LOG_WARNING(Service_ACC, "(STUBBED) called");
+    IPC::ResponseBuilder rb{ctx, 6};
+    rb.Push(RESULT_SUCCESS);
+    rb.PushRaw(DEFAULT_USER_ID);
+}
+
+Module::Interface::Interface(std::shared_ptr<Module> module, const char* name)
+    : ServiceFramework(name), module(std::move(module)) {}
+
 void InstallInterfaces(SM::ServiceManager& service_manager) {
 void InstallInterfaces(SM::ServiceManager& service_manager) {
-    std::make_shared<ACC_U0>()->InstallAsService(service_manager);
+    auto module = std::make_shared<Module>();
+    std::make_shared<ACC_AA>(module)->InstallAsService(service_manager);
+    std::make_shared<ACC_SU>(module)->InstallAsService(service_manager);
+    std::make_shared<ACC_U0>(module)->InstallAsService(service_manager);
+    std::make_shared<ACC_U1>(module)->InstallAsService(service_manager);
 }
 }
 
 
 } // namespace Account
 } // namespace Account

+ 19 - 0
src/core/hle/service/acc/acc.h

@@ -9,6 +9,25 @@
 namespace Service {
 namespace Service {
 namespace Account {
 namespace Account {
 
 
+class Module final {
+public:
+    class Interface : public ServiceFramework<Interface> {
+    public:
+        Interface(std::shared_ptr<Module> module, const char* name);
+
+        void GetUserExistence(Kernel::HLERequestContext& ctx);
+        void ListAllUsers(Kernel::HLERequestContext& ctx);
+        void ListOpenUsers(Kernel::HLERequestContext& ctx);
+        void GetLastOpenedUser(Kernel::HLERequestContext& ctx);
+        void GetProfile(Kernel::HLERequestContext& ctx);
+        void InitializeApplicationInfo(Kernel::HLERequestContext& ctx);
+        void GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx);
+
+    protected:
+        std::shared_ptr<Module> module;
+    };
+};
+
 /// Registers all ACC services with the specified service manager.
 /// Registers all ACC services with the specified service manager.
 void InstallInterfaces(SM::ServiceManager& service_manager);
 void InstallInterfaces(SM::ServiceManager& service_manager);
 
 

+ 22 - 0
src/core/hle/service/acc/acc_aa.cpp

@@ -0,0 +1,22 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/acc/acc_aa.h"
+
+namespace Service {
+namespace Account {
+
+ACC_AA::ACC_AA(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "acc:aa") {
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "EnsureCacheAsync"},
+        {1, nullptr, "LoadCache"},
+        {2, nullptr, "GetDeviceAccountId"},
+        {50, nullptr, "RegisterNotificationTokenAsync"},
+        {51, nullptr, "UnregisterNotificationTokenAsync"},
+    };
+    RegisterHandlers(functions);
+}
+
+} // namespace Account
+} // namespace Service

+ 18 - 0
src/core/hle/service/acc/acc_aa.h

@@ -0,0 +1,18 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/hle/service/acc/acc.h"
+
+namespace Service {
+namespace Account {
+
+class ACC_AA final : public Module::Interface {
+public:
+    explicit ACC_AA(std::shared_ptr<Module> module);
+};
+
+} // namespace Account
+} // namespace Service

+ 55 - 0
src/core/hle/service/acc/acc_su.cpp

@@ -0,0 +1,55 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/acc/acc_su.h"
+
+namespace Service {
+namespace Account {
+
+ACC_SU::ACC_SU(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "acc:su") {
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "GetUserCount"},
+        {1, &ACC_SU::GetUserExistence, "GetUserExistence"},
+        {2, &ACC_SU::ListAllUsers, "ListAllUsers"},
+        {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},
+        {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},
+        {5, &ACC_SU::GetProfile, "GetProfile"},
+        {6, nullptr, "GetProfileDigest"},
+        {50, nullptr, "IsUserRegistrationRequestPermitted"},
+        {51, nullptr, "TrySelectUserWithoutInteraction"},
+        {60, nullptr, "ListOpenContextStoredUsers"},
+        {100, nullptr, "GetUserRegistrationNotifier"},
+        {101, nullptr, "GetUserStateChangeNotifier"},
+        {102, nullptr, "GetBaasAccountManagerForSystemService"},
+        {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+        {104, nullptr, "GetProfileUpdateNotifier"},
+        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+        {110, nullptr, "StoreSaveDataThumbnail"},
+        {111, nullptr, "ClearSaveDataThumbnail"},
+        {112, nullptr, "LoadSaveDataThumbnail"},
+        {113, nullptr, "GetSaveDataThumbnailExistence"},
+        {190, nullptr, "GetUserLastOpenedApplication"},
+        {191, nullptr, "ActivateOpenContextHolder"},
+        {200, nullptr, "BeginUserRegistration"},
+        {201, nullptr, "CompleteUserRegistration"},
+        {202, nullptr, "CancelUserRegistration"},
+        {203, nullptr, "DeleteUser"},
+        {204, nullptr, "SetUserPosition"},
+        {205, nullptr, "GetProfileEditor"},
+        {206, nullptr, "CompleteUserRegistrationForcibly"},
+        {210, nullptr, "CreateFloatingRegistrationRequest"},
+        {230, nullptr, "AuthenticateServiceAsync"},
+        {250, nullptr, "GetBaasAccountAdministrator"},
+        {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
+        {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
+        {299, nullptr, "SuspendBackgroundDaemon"},
+        {997, nullptr, "DebugInvalidateTokenCacheForUser"},
+        {998, nullptr, "DebugSetUserStateClose"},
+        {999, nullptr, "DebugSetUserStateOpen"},
+    };
+    RegisterHandlers(functions);
+}
+
+} // namespace Account
+} // namespace Service

+ 18 - 0
src/core/hle/service/acc/acc_su.h

@@ -0,0 +1,18 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/hle/service/acc/acc.h"
+
+namespace Service {
+namespace Account {
+
+class ACC_SU final : public Module::Interface {
+public:
+    explicit ACC_SU(std::shared_ptr<Module> module);
+};
+
+} // namespace Account
+} // namespace Service

+ 12 - 101
src/core/hle/service/acc/acc_u0.cpp

@@ -2,120 +2,31 @@
 // Licensed under GPLv2 or any later version
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 // Refer to the license.txt file included.
 
 
-#include "common/logging/log.h"
-#include "core/hle/ipc_helpers.h"
 #include "core/hle/service/acc/acc_u0.h"
 #include "core/hle/service/acc/acc_u0.h"
 
 
 namespace Service {
 namespace Service {
 namespace Account {
 namespace Account {
 
 
-using Uid = std::array<u64, 2>;
-static constexpr Uid DEFAULT_USER_ID{0x10ull, 0x20ull};
-
-class IProfile final : public ServiceFramework<IProfile> {
-public:
-    IProfile() : ServiceFramework("IProfile") {
-        static const FunctionInfo functions[] = {
-            {1, &IProfile::GetBase, "GetBase"},
-        };
-        RegisterHandlers(functions);
-    }
-
-private:
-    void GetBase(Kernel::HLERequestContext& ctx) {
-        LOG_WARNING(Service_ACC, "(STUBBED) called");
-        ProfileBase profile_base{};
-        IPC::ResponseBuilder rb{ctx, 16};
-        rb.Push(RESULT_SUCCESS);
-        rb.PushRaw(profile_base);
-    }
-};
-
-class IManagerForApplication final : public ServiceFramework<IManagerForApplication> {
-public:
-    IManagerForApplication() : ServiceFramework("IManagerForApplication") {
-        static const FunctionInfo functions[] = {
-            {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
-            {1, &IManagerForApplication::GetAccountId, "GetAccountId"},
-        };
-        RegisterHandlers(functions);
-    }
-
-private:
-    void CheckAvailability(Kernel::HLERequestContext& ctx) {
-        LOG_WARNING(Service_ACC, "(STUBBED) called");
-        IPC::ResponseBuilder rb{ctx, 3};
-        rb.Push(RESULT_SUCCESS);
-        rb.Push(true); // TODO: Check when this is supposed to return true and when not
-    }
-
-    void GetAccountId(Kernel::HLERequestContext& ctx) {
-        LOG_WARNING(Service_ACC, "(STUBBED) called");
-        IPC::ResponseBuilder rb{ctx, 4};
-        rb.Push(RESULT_SUCCESS);
-        rb.Push<u64>(0x12345678ABCDEF);
-    }
-};
-
-void ACC_U0::GetUserExistence(Kernel::HLERequestContext& ctx) {
-    LOG_WARNING(Service_ACC, "(STUBBED) called");
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(RESULT_SUCCESS);
-    rb.Push(true); // TODO: Check when this is supposed to return true and when not
-}
-
-void ACC_U0::ListAllUsers(Kernel::HLERequestContext& ctx) {
-    LOG_WARNING(Service_ACC, "(STUBBED) called");
-    constexpr std::array<u128, 10> user_ids{DEFAULT_USER_ID};
-    ctx.WriteBuffer(user_ids.data(), user_ids.size());
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(RESULT_SUCCESS);
-}
-
-void ACC_U0::ListOpenUsers(Kernel::HLERequestContext& ctx) {
-    LOG_WARNING(Service_ACC, "(STUBBED) called");
-    constexpr std::array<u128, 10> user_ids{DEFAULT_USER_ID};
-    ctx.WriteBuffer(user_ids.data(), user_ids.size());
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(RESULT_SUCCESS);
-}
-
-void ACC_U0::GetProfile(Kernel::HLERequestContext& ctx) {
-    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-    rb.Push(RESULT_SUCCESS);
-    rb.PushIpcInterface<IProfile>();
-    LOG_DEBUG(Service_ACC, "called");
-}
-
-void ACC_U0::InitializeApplicationInfo(Kernel::HLERequestContext& ctx) {
-    LOG_WARNING(Service_ACC, "(STUBBED) called");
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(RESULT_SUCCESS);
-}
-
-void ACC_U0::GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx) {
-    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-    rb.Push(RESULT_SUCCESS);
-    rb.PushIpcInterface<IManagerForApplication>();
-    LOG_DEBUG(Service_ACC, "called");
-}
-
-void ACC_U0::GetLastOpenedUser(Kernel::HLERequestContext& ctx) {
-    LOG_WARNING(Service_ACC, "(STUBBED) called");
-    IPC::ResponseBuilder rb{ctx, 6};
-    rb.Push(RESULT_SUCCESS);
-    rb.PushRaw(DEFAULT_USER_ID);
-}
-
-ACC_U0::ACC_U0() : ServiceFramework("acc:u0") {
+ACC_U0::ACC_U0(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "acc:u0") {
     static const FunctionInfo functions[] = {
     static const FunctionInfo functions[] = {
+        {0, nullptr, "GetUserCount"},
         {1, &ACC_U0::GetUserExistence, "GetUserExistence"},
         {1, &ACC_U0::GetUserExistence, "GetUserExistence"},
         {2, &ACC_U0::ListAllUsers, "ListAllUsers"},
         {2, &ACC_U0::ListAllUsers, "ListAllUsers"},
         {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
         {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
         {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
         {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
         {5, &ACC_U0::GetProfile, "GetProfile"},
         {5, &ACC_U0::GetProfile, "GetProfile"},
+        {6, nullptr, "GetProfileDigest"},
+        {50, nullptr, "IsUserRegistrationRequestPermitted"},
+        {51, nullptr, "TrySelectUserWithoutInteraction"},
+        {60, nullptr, "ListOpenContextStoredUsers"},
         {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
         {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
         {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
         {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
+        {102, nullptr, "AuthenticateApplicationAsync"},
+        {103, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+        {110, nullptr, "StoreSaveDataThumbnail"},
+        {111, nullptr, "ClearSaveDataThumbnail"},
+        {120, nullptr, "CreateGuestLoginRequest"},
+        {130, nullptr, "LoadOpenContext"},
     };
     };
     RegisterHandlers(functions);
     RegisterHandlers(functions);
 }
 }

+ 3 - 25
src/core/hle/service/acc/acc_u0.h

@@ -4,36 +4,14 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "core/hle/service/service.h"
+#include "core/hle/service/acc/acc.h"
 
 
 namespace Service {
 namespace Service {
 namespace Account {
 namespace Account {
 
 
-// TODO: RE this structure
-struct UserData {
-    INSERT_PADDING_BYTES(0x80);
-};
-static_assert(sizeof(UserData) == 0x80, "UserData structure has incorrect size");
-
-// TODO: RE this structure
-struct ProfileBase {
-    INSERT_PADDING_BYTES(0x38);
-};
-static_assert(sizeof(ProfileBase) == 0x38, "ProfileBase structure has incorrect size");
-
-class ACC_U0 final : public ServiceFramework<ACC_U0> {
+class ACC_U0 final : public Module::Interface {
 public:
 public:
-    ACC_U0();
-    ~ACC_U0() = default;
-
-private:
-    void GetUserExistence(Kernel::HLERequestContext& ctx);
-    void ListAllUsers(Kernel::HLERequestContext& ctx);
-    void ListOpenUsers(Kernel::HLERequestContext& ctx);
-    void GetLastOpenedUser(Kernel::HLERequestContext& ctx);
-    void GetProfile(Kernel::HLERequestContext& ctx);
-    void InitializeApplicationInfo(Kernel::HLERequestContext& ctx);
-    void GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx);
+    explicit ACC_U0(std::shared_ptr<Module> module);
 };
 };
 
 
 } // namespace Account
 } // namespace Account

+ 42 - 0
src/core/hle/service/acc/acc_u1.cpp

@@ -0,0 +1,42 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/acc/acc_u1.h"
+
+namespace Service {
+namespace Account {
+
+ACC_U1::ACC_U1(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "acc:u1") {
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "GetUserCount"},
+        {1, &ACC_U1::GetUserExistence, "GetUserExistence"},
+        {2, &ACC_U1::ListAllUsers, "ListAllUsers"},
+        {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},
+        {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},
+        {5, &ACC_U1::GetProfile, "GetProfile"},
+        {6, nullptr, "GetProfileDigest"},
+        {50, nullptr, "IsUserRegistrationRequestPermitted"},
+        {51, nullptr, "TrySelectUserWithoutInteraction"},
+        {60, nullptr, "ListOpenContextStoredUsers"},
+        {100, nullptr, "GetUserRegistrationNotifier"},
+        {101, nullptr, "GetUserStateChangeNotifier"},
+        {102, nullptr, "GetBaasAccountManagerForSystemService"},
+        {103, nullptr, "GetProfileUpdateNotifier"},
+        {104, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+        {105, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+        {110, nullptr, "StoreSaveDataThumbnail"},
+        {111, nullptr, "ClearSaveDataThumbnail"},
+        {112, nullptr, "LoadSaveDataThumbnail"},
+        {113, nullptr, "GetSaveDataThumbnailExistence"},
+        {190, nullptr, "GetUserLastOpenedApplication"},
+        {191, nullptr, "ActivateOpenContextHolder"},
+        {997, nullptr, "DebugInvalidateTokenCacheForUser"},
+        {998, nullptr, "DebugSetUserStateClose"},
+        {999, nullptr, "DebugSetUserStateOpen"},
+    };
+    RegisterHandlers(functions);
+}
+
+} // namespace Account
+} // namespace Service

+ 18 - 0
src/core/hle/service/acc/acc_u1.h

@@ -0,0 +1,18 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/hle/service/acc/acc.h"
+
+namespace Service {
+namespace Account {
+
+class ACC_U1 final : public Module::Interface {
+public:
+    explicit ACC_U1(std::shared_ptr<Module> module);
+};
+
+} // namespace Account
+} // namespace Service