Merge pull request #2884 from ogniK5377/deglobal-sys-services
Remove usage of System::CurrentInterface() from most services
This commit is contained in:
		| @@ -1066,7 +1066,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_) | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system.Kernel(); | ||||
|     gpu_error_detected_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::Manual, "IApplicationFunctions:GpuErrorDetectedSystemEvent"); | ||||
| } | ||||
|   | ||||
| @@ -29,9 +29,9 @@ static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) { | ||||
|     return (title_id & DLC_BASE_TITLE_ID_MASK) == base; | ||||
| } | ||||
|  | ||||
| static std::vector<u64> AccumulateAOCTitleIDs() { | ||||
| static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { | ||||
|     std::vector<u64> add_on_content; | ||||
|     const auto& rcu = Core::System::GetInstance().GetContentProvider(); | ||||
|     const auto& rcu = system.GetContentProvider(); | ||||
|     const auto list = | ||||
|         rcu.ListEntriesFilter(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data); | ||||
|     std::transform(list.begin(), list.end(), std::back_inserter(add_on_content), | ||||
| @@ -47,7 +47,8 @@ static std::vector<u64> AccumulateAOCTitleIDs() { | ||||
|     return add_on_content; | ||||
| } | ||||
|  | ||||
| AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs()) { | ||||
| AOC_U::AOC_U(Core::System& system) | ||||
|     : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs(system)), system(system) { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "CountAddOnContentByApplicationId"}, | ||||
| @@ -65,7 +66,7 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system.Kernel(); | ||||
|     aoc_change_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, | ||||
|                                                               "GetAddOnContentListChanged:Event"); | ||||
| } | ||||
| @@ -86,7 +87,7 @@ void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|  | ||||
|     const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID(); | ||||
|     const auto current = system.CurrentProcess()->GetTitleID(); | ||||
|  | ||||
|     const auto& disabled = Settings::values.disabled_addons[current]; | ||||
|     if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) { | ||||
| @@ -113,7 +114,7 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_AOC, "called with offset={}, count={}, process_id={}", offset, count, | ||||
|               process_id); | ||||
|  | ||||
|     const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID(); | ||||
|     const auto current = system.CurrentProcess()->GetTitleID(); | ||||
|  | ||||
|     std::vector<u32> out; | ||||
|     const auto& disabled = Settings::values.disabled_addons[current]; | ||||
| @@ -159,7 +160,7 @@ void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::ResponseBuilder rb{ctx, 4}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|  | ||||
|     const auto title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); | ||||
|     const auto title_id = system.CurrentProcess()->GetTitleID(); | ||||
|     FileSys::PatchManager pm{title_id}; | ||||
|  | ||||
|     const auto res = pm.GetControlMetadata(); | ||||
| @@ -196,8 +197,8 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { | ||||
|     rb.PushCopyObjects(aoc_change_event.readable); | ||||
| } | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
|     std::make_shared<AOC_U>()->InstallAsService(service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     std::make_shared<AOC_U>(system)->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::AOC | ||||
|   | ||||
| @@ -14,7 +14,7 @@ namespace Service::AOC { | ||||
|  | ||||
| class AOC_U final : public ServiceFramework<AOC_U> { | ||||
| public: | ||||
|     AOC_U(); | ||||
|     explicit AOC_U(Core::System& system); | ||||
|     ~AOC_U() override; | ||||
|  | ||||
| private: | ||||
| @@ -26,9 +26,10 @@ private: | ||||
|  | ||||
|     std::vector<u64> add_on_content; | ||||
|     Kernel::EventPair aoc_change_event; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| /// Registers all AOC services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::AOC | ||||
|   | ||||
| @@ -16,7 +16,7 @@ namespace Service::BtDrv { | ||||
|  | ||||
| class Bt final : public ServiceFramework<Bt> { | ||||
| public: | ||||
|     explicit Bt() : ServiceFramework{"bt"} { | ||||
|     explicit Bt(Core::System& system) : ServiceFramework{"bt"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, nullptr, "LeClientReadCharacteristic"}, | ||||
| @@ -33,7 +33,7 @@ public: | ||||
|         // clang-format on | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         auto& kernel = system.Kernel(); | ||||
|         register_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::Automatic, "BT:RegisterEvent"); | ||||
|     } | ||||
| @@ -163,9 +163,9 @@ public: | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& sm) { | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) { | ||||
|     std::make_shared<BtDrv>()->InstallAsService(sm); | ||||
|     std::make_shared<Bt>()->InstallAsService(sm); | ||||
|     std::make_shared<Bt>(system)->InstallAsService(sm); | ||||
| } | ||||
|  | ||||
| } // namespace Service::BtDrv | ||||
|   | ||||
| @@ -8,9 +8,13 @@ namespace Service::SM { | ||||
| class ServiceManager; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::BtDrv { | ||||
|  | ||||
| /// Registers all BtDrv services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& sm); | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system); | ||||
|  | ||||
| } // namespace Service::BtDrv | ||||
|   | ||||
| @@ -17,7 +17,7 @@ namespace Service::BTM { | ||||
|  | ||||
| class IBtmUserCore final : public ServiceFramework<IBtmUserCore> { | ||||
| public: | ||||
|     explicit IBtmUserCore() : ServiceFramework{"IBtmUserCore"} { | ||||
|     explicit IBtmUserCore(Core::System& system) : ServiceFramework{"IBtmUserCore"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &IBtmUserCore::AcquireBleScanEvent, "AcquireBleScanEvent"}, | ||||
| @@ -56,7 +56,7 @@ public: | ||||
|         // clang-format on | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         auto& kernel = system.Kernel(); | ||||
|         scan_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, | ||||
|                                                             "IBtmUserCore:ScanEvent"); | ||||
|         connection_event = Kernel::WritableEvent::CreateEventPair( | ||||
| @@ -108,7 +108,7 @@ private: | ||||
|  | ||||
| class BTM_USR final : public ServiceFramework<BTM_USR> { | ||||
| public: | ||||
|     explicit BTM_USR() : ServiceFramework{"btm:u"} { | ||||
|     explicit BTM_USR(Core::System& system) : ServiceFramework{"btm:u"}, system(system) { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &BTM_USR::GetCore, "GetCore"}, | ||||
| @@ -123,8 +123,10 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IBtmUserCore>(); | ||||
|         rb.PushIpcInterface<IBtmUserCore>(system); | ||||
|     } | ||||
|  | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class BTM final : public ServiceFramework<BTM> { | ||||
| @@ -268,11 +270,11 @@ private: | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& sm) { | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) { | ||||
|     std::make_shared<BTM>()->InstallAsService(sm); | ||||
|     std::make_shared<BTM_DBG>()->InstallAsService(sm); | ||||
|     std::make_shared<BTM_SYS>()->InstallAsService(sm); | ||||
|     std::make_shared<BTM_USR>()->InstallAsService(sm); | ||||
|     std::make_shared<BTM_USR>(system)->InstallAsService(sm); | ||||
| } | ||||
|  | ||||
| } // namespace Service::BTM | ||||
|   | ||||
| @@ -8,8 +8,12 @@ namespace Service::SM { | ||||
| class ServiceManager; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| }; | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& sm); | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system); | ||||
|  | ||||
| } // namespace Service::BTM | ||||
|   | ||||
| @@ -20,8 +20,8 @@ | ||||
|  | ||||
| namespace Service::Fatal { | ||||
|  | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)) {} | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, Core::System& system, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)), system(system) {} | ||||
|  | ||||
| Module::Interface::~Interface() = default; | ||||
|  | ||||
| @@ -64,7 +64,8 @@ enum class FatalType : u32 { | ||||
|     ErrorScreen = 2, | ||||
| }; | ||||
|  | ||||
| static void GenerateErrorReport(ResultCode error_code, const FatalInfo& info) { | ||||
| static void GenerateErrorReport(Core::System& system, ResultCode error_code, | ||||
|                                 const FatalInfo& info) { | ||||
|     const auto title_id = Core::CurrentProcess()->GetTitleID(); | ||||
|     std::string crash_report = fmt::format( | ||||
|         "Yuzu {}-{} crash report\n" | ||||
| @@ -101,18 +102,19 @@ static void GenerateErrorReport(ResultCode error_code, const FatalInfo& info) { | ||||
|  | ||||
|     LOG_ERROR(Service_Fatal, "{}", crash_report); | ||||
|  | ||||
|     Core::System::GetInstance().GetReporter().SaveCrashReport( | ||||
|     system.GetReporter().SaveCrashReport( | ||||
|         title_id, error_code, info.set_flags, info.program_entry_point, info.sp, info.pc, | ||||
|         info.pstate, info.afsr0, info.afsr1, info.esr, info.far, info.registers, info.backtrace, | ||||
|         info.backtrace_size, info.ArchAsString(), info.unk10); | ||||
| } | ||||
|  | ||||
| static void ThrowFatalError(ResultCode error_code, FatalType fatal_type, const FatalInfo& info) { | ||||
| static void ThrowFatalError(Core::System& system, ResultCode error_code, FatalType fatal_type, | ||||
|                             const FatalInfo& info) { | ||||
|     LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", | ||||
|               static_cast<u32>(fatal_type), error_code.raw); | ||||
|     switch (fatal_type) { | ||||
|     case FatalType::ErrorReportAndScreen: | ||||
|         GenerateErrorReport(error_code, info); | ||||
|         GenerateErrorReport(system, error_code, info); | ||||
|         [[fallthrough]]; | ||||
|     case FatalType::ErrorScreen: | ||||
|         // Since we have no fatal:u error screen. We should just kill execution instead | ||||
| @@ -120,7 +122,7 @@ static void ThrowFatalError(ResultCode error_code, FatalType fatal_type, const F | ||||
|         break; | ||||
|         // Should not throw a fatal screen but should generate an error report | ||||
|     case FatalType::ErrorReport: | ||||
|         GenerateErrorReport(error_code, info); | ||||
|         GenerateErrorReport(system, error_code, info); | ||||
|         break; | ||||
|     } | ||||
| } | ||||
| @@ -130,7 +132,7 @@ void Module::Interface::ThrowFatal(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto error_code = rp.Pop<ResultCode>(); | ||||
|  | ||||
|     ThrowFatalError(error_code, FatalType::ErrorScreen, {}); | ||||
|     ThrowFatalError(system, error_code, FatalType::ErrorScreen, {}); | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
| @@ -141,7 +143,8 @@ void Module::Interface::ThrowFatalWithPolicy(Kernel::HLERequestContext& ctx) { | ||||
|     const auto error_code = rp.Pop<ResultCode>(); | ||||
|     const auto fatal_type = rp.PopEnum<FatalType>(); | ||||
|  | ||||
|     ThrowFatalError(error_code, fatal_type, {}); // No info is passed with ThrowFatalWithPolicy | ||||
|     ThrowFatalError(system, error_code, fatal_type, | ||||
|                     {}); // No info is passed with ThrowFatalWithPolicy | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
| @@ -157,15 +160,15 @@ void Module::Interface::ThrowFatalWithCpuContext(Kernel::HLERequestContext& ctx) | ||||
|     ASSERT_MSG(fatal_info.size() == sizeof(FatalInfo), "Invalid fatal info buffer size!"); | ||||
|     std::memcpy(&info, fatal_info.data(), sizeof(FatalInfo)); | ||||
|  | ||||
|     ThrowFatalError(error_code, fatal_type, info); | ||||
|     ThrowFatalError(system, error_code, fatal_type, info); | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     auto module = std::make_shared<Module>(); | ||||
|     std::make_shared<Fatal_P>(module)->InstallAsService(service_manager); | ||||
|     std::make_shared<Fatal_U>(module)->InstallAsService(service_manager); | ||||
|     std::make_shared<Fatal_P>(module, system)->InstallAsService(service_manager); | ||||
|     std::make_shared<Fatal_U>(module, system)->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::Fatal | ||||
|   | ||||
| @@ -6,13 +6,17 @@ | ||||
|  | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::Fatal { | ||||
|  | ||||
| class Module final { | ||||
| public: | ||||
|     class Interface : public ServiceFramework<Interface> { | ||||
|     public: | ||||
|         explicit Interface(std::shared_ptr<Module> module, const char* name); | ||||
|         explicit Interface(std::shared_ptr<Module> module, Core::System& system, const char* name); | ||||
|         ~Interface() override; | ||||
|  | ||||
|         void ThrowFatal(Kernel::HLERequestContext& ctx); | ||||
| @@ -21,9 +25,10 @@ public: | ||||
|  | ||||
|     protected: | ||||
|         std::shared_ptr<Module> module; | ||||
|         Core::System& system; | ||||
|     }; | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::Fatal | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
|  | ||||
| namespace Service::Fatal { | ||||
|  | ||||
| Fatal_P::Fatal_P(std::shared_ptr<Module> module) | ||||
|     : Module::Interface(std::move(module), "fatal:p") {} | ||||
| Fatal_P::Fatal_P(std::shared_ptr<Module> module, Core::System& system) | ||||
|     : Module::Interface(std::move(module), system, "fatal:p") {} | ||||
|  | ||||
| Fatal_P::~Fatal_P() = default; | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ namespace Service::Fatal { | ||||
|  | ||||
| class Fatal_P final : public Module::Interface { | ||||
| public: | ||||
|     explicit Fatal_P(std::shared_ptr<Module> module); | ||||
|     explicit Fatal_P(std::shared_ptr<Module> module, Core::System& system); | ||||
|     ~Fatal_P() override; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,8 @@ | ||||
|  | ||||
| namespace Service::Fatal { | ||||
|  | ||||
| Fatal_U::Fatal_U(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "fatal:u") { | ||||
| Fatal_U::Fatal_U(std::shared_ptr<Module> module, Core::System& system) | ||||
|     : Module::Interface(std::move(module), system, "fatal:u") { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &Fatal_U::ThrowFatal, "ThrowFatal"}, | ||||
|         {1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"}, | ||||
|   | ||||
| @@ -10,7 +10,7 @@ namespace Service::Fatal { | ||||
|  | ||||
| class Fatal_U final : public Module::Interface { | ||||
| public: | ||||
|     explicit Fatal_U(std::shared_ptr<Module> module); | ||||
|     explicit Fatal_U(std::shared_ptr<Module> module, Core::System& system); | ||||
|     ~Fatal_U() override; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -149,7 +149,8 @@ private: | ||||
|  | ||||
| class INotificationService final : public ServiceFramework<INotificationService> { | ||||
| public: | ||||
|     INotificationService(Common::UUID uuid) : ServiceFramework("INotificationService"), uuid(uuid) { | ||||
|     INotificationService(Common::UUID uuid, Core::System& system) | ||||
|         : ServiceFramework("INotificationService"), uuid(uuid) { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &INotificationService::GetEvent, "GetEvent"}, | ||||
| @@ -159,6 +160,9 @@ public: | ||||
|         // clang-format on | ||||
|  | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         notification_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             system.Kernel(), Kernel::ResetType::Manual, "INotificationService:NotifyEvent"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
| @@ -167,13 +171,6 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|  | ||||
|         if (!is_event_created) { | ||||
|             auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|             notification_event = Kernel::WritableEvent::CreateEventPair( | ||||
|                 kernel, Kernel::ResetType::Manual, "INotificationService:NotifyEvent"); | ||||
|             is_event_created = true; | ||||
|         } | ||||
|         rb.PushCopyObjects(notification_event.readable); | ||||
|     } | ||||
|  | ||||
| @@ -261,21 +258,21 @@ void Module::Interface::CreateNotificationService(Kernel::HLERequestContext& ctx | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushIpcInterface<INotificationService>(uuid); | ||||
|     rb.PushIpcInterface<INotificationService>(uuid, system); | ||||
| } | ||||
|  | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)) {} | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, Core::System& system, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)), system(system) {} | ||||
|  | ||||
| Module::Interface::~Interface() = default; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     auto module = std::make_shared<Module>(); | ||||
|     std::make_shared<Friend>(module, "friend:a")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, "friend:m")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, "friend:s")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, "friend:u")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, "friend:v")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, system, "friend:a")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, system, "friend:m")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, system, "friend:s")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, system, "friend:u")->InstallAsService(service_manager); | ||||
|     std::make_shared<Friend>(module, system, "friend:v")->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::Friend | ||||
|   | ||||
| @@ -6,13 +6,17 @@ | ||||
|  | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::Friend { | ||||
|  | ||||
| class Module final { | ||||
| public: | ||||
|     class Interface : public ServiceFramework<Interface> { | ||||
|     public: | ||||
|         explicit Interface(std::shared_ptr<Module> module, const char* name); | ||||
|         explicit Interface(std::shared_ptr<Module> module, Core::System& system, const char* name); | ||||
|         ~Interface() override; | ||||
|  | ||||
|         void CreateFriendService(Kernel::HLERequestContext& ctx); | ||||
| @@ -20,10 +24,11 @@ public: | ||||
|  | ||||
|     protected: | ||||
|         std::shared_ptr<Module> module; | ||||
|         Core::System& system; | ||||
|     }; | ||||
| }; | ||||
|  | ||||
| /// Registers all Friend services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::Friend | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
|  | ||||
| namespace Service::Friend { | ||||
|  | ||||
| Friend::Friend(std::shared_ptr<Module> module, const char* name) | ||||
|     : Interface(std::move(module), name) { | ||||
| Friend::Friend(std::shared_ptr<Module> module, Core::System& system, const char* name) | ||||
|     : Interface(std::move(module), system, name) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &Friend::CreateFriendService, "CreateFriendService"}, | ||||
|         {1, &Friend::CreateNotificationService, "CreateNotificationService"}, | ||||
|   | ||||
| @@ -10,7 +10,7 @@ namespace Service::Friend { | ||||
|  | ||||
| class Friend final : public Module::Interface { | ||||
| public: | ||||
|     explicit Friend(std::shared_ptr<Module> module, const char* name); | ||||
|     explicit Friend(std::shared_ptr<Module> module, Core::System& system, const char* name); | ||||
|     ~Friend() override; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
|  | ||||
| namespace Service::HID { | ||||
|  | ||||
| ControllerBase::ControllerBase() = default; | ||||
| ControllerBase::ControllerBase(Core::System& system) : system(system) {} | ||||
| ControllerBase::~ControllerBase() = default; | ||||
|  | ||||
| void ControllerBase::ActivateController() { | ||||
|   | ||||
| @@ -11,10 +11,14 @@ namespace Core::Timing { | ||||
| class CoreTiming; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::HID { | ||||
| class ControllerBase { | ||||
| public: | ||||
|     ControllerBase(); | ||||
|     explicit ControllerBase(Core::System& system); | ||||
|     virtual ~ControllerBase(); | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -46,5 +50,7 @@ protected: | ||||
|         s64_le entry_count; | ||||
|     }; | ||||
|     static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size"); | ||||
|  | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -14,7 +14,8 @@ constexpr s32 HID_JOYSTICK_MAX = 0x7fff; | ||||
| constexpr s32 HID_JOYSTICK_MIN = -0x7fff; | ||||
| enum class JoystickId : std::size_t { Joystick_Left, Joystick_Right }; | ||||
|  | ||||
| Controller_DebugPad::Controller_DebugPad() = default; | ||||
| Controller_DebugPad::Controller_DebugPad(Core::System& system) | ||||
|     : ControllerBase(system), system(system) {} | ||||
| Controller_DebugPad::~Controller_DebugPad() = default; | ||||
|  | ||||
| void Controller_DebugPad::OnInit() {} | ||||
|   | ||||
| @@ -16,7 +16,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_DebugPad final : public ControllerBase { | ||||
| public: | ||||
|     Controller_DebugPad(); | ||||
|     explicit Controller_DebugPad(Core::System& system); | ||||
|     ~Controller_DebugPad() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -89,5 +89,6 @@ private: | ||||
|         buttons; | ||||
|     std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID> | ||||
|         analogs; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -10,7 +10,8 @@ | ||||
| namespace Service::HID { | ||||
| constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3BA00; | ||||
|  | ||||
| Controller_Gesture::Controller_Gesture() = default; | ||||
| Controller_Gesture::Controller_Gesture(Core::System& system) | ||||
|     : ControllerBase(system), system(system) {} | ||||
| Controller_Gesture::~Controller_Gesture() = default; | ||||
|  | ||||
| void Controller_Gesture::OnInit() {} | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_Gesture final : public ControllerBase { | ||||
| public: | ||||
|     Controller_Gesture(); | ||||
|     explicit Controller_Gesture(Core::System& system); | ||||
|     ~Controller_Gesture() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -59,5 +59,6 @@ private: | ||||
|         std::array<GestureState, 17> gesture_states; | ||||
|     }; | ||||
|     SharedMemory shared_memory{}; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -12,7 +12,8 @@ namespace Service::HID { | ||||
| constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3800; | ||||
| constexpr u8 KEYS_PER_BYTE = 8; | ||||
|  | ||||
| Controller_Keyboard::Controller_Keyboard() = default; | ||||
| Controller_Keyboard::Controller_Keyboard(Core::System& system) | ||||
|     : ControllerBase(system), system(system) {} | ||||
| Controller_Keyboard::~Controller_Keyboard() = default; | ||||
|  | ||||
| void Controller_Keyboard::OnInit() {} | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_Keyboard final : public ControllerBase { | ||||
| public: | ||||
|     Controller_Keyboard(); | ||||
|     explicit Controller_Keyboard(Core::System& system); | ||||
|     ~Controller_Keyboard() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -53,5 +53,6 @@ private: | ||||
|         keyboard_keys; | ||||
|     std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardMods> | ||||
|         keyboard_mods; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
| namespace Service::HID { | ||||
| constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3400; | ||||
|  | ||||
| Controller_Mouse::Controller_Mouse() = default; | ||||
| Controller_Mouse::Controller_Mouse(Core::System& system) : ControllerBase(system), system(system) {} | ||||
| Controller_Mouse::~Controller_Mouse() = default; | ||||
|  | ||||
| void Controller_Mouse::OnInit() {} | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_Mouse final : public ControllerBase { | ||||
| public: | ||||
|     Controller_Mouse(); | ||||
|     explicit Controller_Mouse(Core::System& system); | ||||
|     ~Controller_Mouse() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -53,5 +53,6 @@ private: | ||||
|     std::unique_ptr<Input::MouseDevice> mouse_device; | ||||
|     std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeMouseButton::NumMouseButtons> | ||||
|         mouse_button_devices; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -93,7 +93,7 @@ u32 Controller_NPad::IndexToNPad(std::size_t index) { | ||||
|     }; | ||||
| } | ||||
|  | ||||
| Controller_NPad::Controller_NPad() = default; | ||||
| Controller_NPad::Controller_NPad(Core::System& system) : ControllerBase(system), system(system) {} | ||||
| Controller_NPad::~Controller_NPad() = default; | ||||
|  | ||||
| void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | ||||
| @@ -168,7 +168,7 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | ||||
| } | ||||
|  | ||||
| void Controller_NPad::OnInit() { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system.Kernel(); | ||||
|     styleset_changed_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::Automatic, "npad:NpadStyleSetChanged"); | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this? | ||||
|  | ||||
| class Controller_NPad final : public ControllerBase { | ||||
| public: | ||||
|     Controller_NPad(); | ||||
|     explicit Controller_NPad(Core::System& system); | ||||
|     ~Controller_NPad() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -327,5 +327,6 @@ private: | ||||
|     std::array<ControllerPad, 10> npad_pad_states{}; | ||||
|     bool IsControllerSupported(NPadControllerType controller); | ||||
|     bool is_in_lr_assignment_mode{false}; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -9,7 +9,8 @@ | ||||
|  | ||||
| namespace Service::HID { | ||||
|  | ||||
| Controller_Stubbed::Controller_Stubbed() = default; | ||||
| Controller_Stubbed::Controller_Stubbed(Core::System& system) | ||||
|     : ControllerBase(system), system(system) {} | ||||
| Controller_Stubbed::~Controller_Stubbed() = default; | ||||
|  | ||||
| void Controller_Stubbed::OnInit() {} | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_Stubbed final : public ControllerBase { | ||||
| public: | ||||
|     Controller_Stubbed(); | ||||
|     explicit Controller_Stubbed(Core::System& system); | ||||
|     ~Controller_Stubbed() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -30,5 +30,6 @@ public: | ||||
| private: | ||||
|     bool smart_update{}; | ||||
|     std::size_t common_offset{}; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -13,7 +13,8 @@ | ||||
| namespace Service::HID { | ||||
| constexpr std::size_t SHARED_MEMORY_OFFSET = 0x400; | ||||
|  | ||||
| Controller_Touchscreen::Controller_Touchscreen() = default; | ||||
| Controller_Touchscreen::Controller_Touchscreen(Core::System& system) | ||||
|     : ControllerBase(system), system(system) {} | ||||
| Controller_Touchscreen::~Controller_Touchscreen() = default; | ||||
|  | ||||
| void Controller_Touchscreen::OnInit() {} | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_Touchscreen final : public ControllerBase { | ||||
| public: | ||||
|     Controller_Touchscreen(); | ||||
|     explicit Controller_Touchscreen(Core::System& system); | ||||
|     ~Controller_Touchscreen() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -69,5 +69,6 @@ private: | ||||
|     TouchScreenSharedMemory shared_memory{}; | ||||
|     std::unique_ptr<Input::TouchDevice> touch_device; | ||||
|     s64_le last_touch{}; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| namespace Service::HID { | ||||
| constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C00; | ||||
|  | ||||
| Controller_XPad::Controller_XPad() = default; | ||||
| Controller_XPad::Controller_XPad(Core::System& system) : ControllerBase(system), system(system) {} | ||||
| Controller_XPad::~Controller_XPad() = default; | ||||
|  | ||||
| void Controller_XPad::OnInit() {} | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| namespace Service::HID { | ||||
| class Controller_XPad final : public ControllerBase { | ||||
| public: | ||||
|     Controller_XPad(); | ||||
|     explicit Controller_XPad(Core::System& system); | ||||
|     ~Controller_XPad() override; | ||||
|  | ||||
|     // Called when the controller is initialized | ||||
| @@ -56,5 +56,6 @@ private: | ||||
|     }; | ||||
|     static_assert(sizeof(SharedMemory) == 0x1000, "SharedMemory is an invalid size"); | ||||
|     SharedMemory shared_memory{}; | ||||
|     Core::System& system; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -42,13 +42,14 @@ constexpr s64 accelerometer_update_ticks = static_cast<s64>(Core::Timing::BASE_C | ||||
| constexpr s64 gyroscope_update_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 100); | ||||
| constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; | ||||
|  | ||||
| IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") { | ||||
| IAppletResource::IAppletResource(Core::System& system) | ||||
|     : ServiceFramework("IAppletResource"), system(system) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system.Kernel(); | ||||
|     shared_mem = Kernel::SharedMemory::Create( | ||||
|         kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite, | ||||
|         Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory"); | ||||
| @@ -74,7 +75,7 @@ IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") { | ||||
|     GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000); | ||||
|  | ||||
|     // Register update callbacks | ||||
|     auto& core_timing = Core::System::GetInstance().CoreTiming(); | ||||
|     auto& core_timing = system.CoreTiming(); | ||||
|     pad_update_event = | ||||
|         core_timing.RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, s64 cycles_late) { | ||||
|             UpdateControllers(userdata, cycles_late); | ||||
| @@ -96,7 +97,7 @@ void IAppletResource::DeactivateController(HidController controller) { | ||||
| } | ||||
|  | ||||
| IAppletResource ::~IAppletResource() { | ||||
|     Core::System::GetInstance().CoreTiming().UnscheduleEvent(pad_update_event, 0); | ||||
|     system.CoreTiming().UnscheduleEvent(pad_update_event, 0); | ||||
| } | ||||
|  | ||||
| void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { | ||||
| @@ -108,7 +109,7 @@ void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { | ||||
| } | ||||
|  | ||||
| void IAppletResource::UpdateControllers(u64 userdata, s64 cycles_late) { | ||||
|     auto& core_timing = Core::System::GetInstance().CoreTiming(); | ||||
|     auto& core_timing = system.CoreTiming(); | ||||
|  | ||||
|     const bool should_reload = Settings::values.is_device_reload_pending.exchange(false); | ||||
|     for (const auto& controller : controllers) { | ||||
| @@ -141,13 +142,13 @@ private: | ||||
|  | ||||
| std::shared_ptr<IAppletResource> Hid::GetAppletResource() { | ||||
|     if (applet_resource == nullptr) { | ||||
|         applet_resource = std::make_shared<IAppletResource>(); | ||||
|         applet_resource = std::make_shared<IAppletResource>(system); | ||||
|     } | ||||
|  | ||||
|     return applet_resource; | ||||
| } | ||||
|  | ||||
| Hid::Hid() : ServiceFramework("hid") { | ||||
| Hid::Hid(Core::System& system) : ServiceFramework("hid"), system(system) { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &Hid::CreateAppletResource, "CreateAppletResource"}, | ||||
| @@ -286,7 +287,7 @@ void Hid::CreateAppletResource(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||||
|  | ||||
|     if (applet_resource == nullptr) { | ||||
|         applet_resource = std::make_shared<IAppletResource>(); | ||||
|         applet_resource = std::make_shared<IAppletResource>(system); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
| @@ -1053,14 +1054,14 @@ void ReloadInputDevices() { | ||||
|     Settings::values.is_device_reload_pending.store(true); | ||||
| } | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
|     std::make_shared<Hid>()->InstallAsService(service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     std::make_shared<Hid>(system)->InstallAsService(service_manager); | ||||
|     std::make_shared<HidBus>()->InstallAsService(service_manager); | ||||
|     std::make_shared<HidDbg>()->InstallAsService(service_manager); | ||||
|     std::make_shared<HidSys>()->InstallAsService(service_manager); | ||||
|     std::make_shared<HidTmp>()->InstallAsService(service_manager); | ||||
|  | ||||
|     std::make_shared<IRS>()->InstallAsService(service_manager); | ||||
|     std::make_shared<IRS>(system)->InstallAsService(service_manager); | ||||
|     std::make_shared<IRS_SYS>()->InstallAsService(service_manager); | ||||
|  | ||||
|     std::make_shared<XCD_SYS>()->InstallAsService(service_manager); | ||||
|   | ||||
| @@ -42,7 +42,7 @@ enum class HidController : std::size_t { | ||||
|  | ||||
| class IAppletResource final : public ServiceFramework<IAppletResource> { | ||||
| public: | ||||
|     IAppletResource(); | ||||
|     explicit IAppletResource(Core::System& system); | ||||
|     ~IAppletResource() override; | ||||
|  | ||||
|     void ActivateController(HidController controller); | ||||
| @@ -61,7 +61,7 @@ public: | ||||
| private: | ||||
|     template <typename T> | ||||
|     void MakeController(HidController controller) { | ||||
|         controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(); | ||||
|         controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(system); | ||||
|     } | ||||
|  | ||||
|     void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); | ||||
| @@ -70,6 +70,7 @@ private: | ||||
|     Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; | ||||
|  | ||||
|     Core::Timing::EventType* pad_update_event; | ||||
|     Core::System& system; | ||||
|  | ||||
|     std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)> | ||||
|         controllers{}; | ||||
| @@ -77,7 +78,7 @@ private: | ||||
|  | ||||
| class Hid final : public ServiceFramework<Hid> { | ||||
| public: | ||||
|     Hid(); | ||||
|     explicit Hid(Core::System& system); | ||||
|     ~Hid() override; | ||||
|  | ||||
|     std::shared_ptr<IAppletResource> GetAppletResource(); | ||||
| @@ -126,12 +127,13 @@ private: | ||||
|     void SwapNpadAssignment(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     std::shared_ptr<IAppletResource> applet_resource; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| /// Reload input devices. Used when input configuration changed | ||||
| void ReloadInputDevices(); | ||||
|  | ||||
| /// Registers all HID services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| namespace Service::HID { | ||||
|  | ||||
| IRS::IRS() : ServiceFramework{"irs"} { | ||||
| IRS::IRS(Core::System& system) : ServiceFramework{"irs"}, system(system) { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {302, &IRS::ActivateIrsensor, "ActivateIrsensor"}, | ||||
| @@ -37,7 +37,7 @@ IRS::IRS() : ServiceFramework{"irs"} { | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system.Kernel(); | ||||
|     shared_mem = Kernel::SharedMemory::Create( | ||||
|         kernel, nullptr, 0x8000, Kernel::MemoryPermission::ReadWrite, | ||||
|         Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "IRS:SharedMemory"); | ||||
| @@ -98,7 +98,7 @@ void IRS::GetImageTransferProcessorState(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 5}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushRaw<u64>(Core::System::GetInstance().CoreTiming().GetTicks()); | ||||
|     rb.PushRaw<u64>(system.CoreTiming().GetTicks()); | ||||
|     rb.PushRaw<u32>(0); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,7 @@ namespace Service::HID { | ||||
|  | ||||
| class IRS final : public ServiceFramework<IRS> { | ||||
| public: | ||||
|     explicit IRS(); | ||||
|     explicit IRS(Core::System& system); | ||||
|     ~IRS() override; | ||||
|  | ||||
| private: | ||||
| @@ -39,6 +39,7 @@ private: | ||||
|     void ActivateIrsensorWithFunctionLevel(Kernel::HLERequestContext& ctx); | ||||
|     Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; | ||||
|     const u32 device_handle{0xABCD}; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class IRS_SYS final : public ServiceFramework<IRS_SYS> { | ||||
|   | ||||
| @@ -78,7 +78,7 @@ public: | ||||
|  | ||||
| class RelocatableObject final : public ServiceFramework<RelocatableObject> { | ||||
| public: | ||||
|     explicit RelocatableObject() : ServiceFramework{"ldr:ro"} { | ||||
|     explicit RelocatableObject(Core::System& system) : ServiceFramework{"ldr:ro"}, system(system) { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &RelocatableObject::LoadNro, "LoadNro"}, | ||||
| @@ -364,7 +364,7 @@ public: | ||||
|         vm_manager.ReprotectRange(*map_address + header.rw_offset, header.rw_size, | ||||
|                                   Kernel::VMAPermission::ReadWrite); | ||||
|  | ||||
|         Core::System::GetInstance().InvalidateCpuInstructionCaches(); | ||||
|         system.InvalidateCpuInstructionCaches(); | ||||
|  | ||||
|         nro.insert_or_assign(*map_address, | ||||
|                              NROInfo{hash, nro_address, nro_size, bss_address, bss_size}); | ||||
| @@ -430,7 +430,7 @@ public: | ||||
|                        .IsSuccess()); | ||||
|         } | ||||
|  | ||||
|         Core::System::GetInstance().InvalidateCpuInstructionCaches(); | ||||
|         system.InvalidateCpuInstructionCaches(); | ||||
|  | ||||
|         nro.erase(iter); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -516,13 +516,14 @@ private: | ||||
|                Common::Is4KBAligned(header.text_size) && Common::Is4KBAligned(header.ro_size) && | ||||
|                Common::Is4KBAligned(header.rw_size); | ||||
|     } | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& sm) { | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) { | ||||
|     std::make_shared<DebugMonitor>()->InstallAsService(sm); | ||||
|     std::make_shared<ProcessManager>()->InstallAsService(sm); | ||||
|     std::make_shared<Shell>()->InstallAsService(sm); | ||||
|     std::make_shared<RelocatableObject>()->InstallAsService(sm); | ||||
|     std::make_shared<RelocatableObject>(system)->InstallAsService(sm); | ||||
| } | ||||
|  | ||||
| } // namespace Service::LDR | ||||
|   | ||||
| @@ -11,6 +11,6 @@ class ServiceManager; | ||||
| namespace Service::LDR { | ||||
|  | ||||
| /// Registers all LDR services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& sm); | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system); | ||||
|  | ||||
| } // namespace Service::LDR | ||||
|   | ||||
| @@ -23,9 +23,9 @@ constexpr ResultCode ERR_TAG_FAILED(ErrorModule::NFP, | ||||
| constexpr ResultCode ERR_NO_APPLICATION_AREA(ErrorModule::NFP, 152); | ||||
| } // namespace ErrCodes | ||||
|  | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)) { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, Core::System& system, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)), system(system) { | ||||
|     auto& kernel = system.Kernel(); | ||||
|     nfc_tag_load = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, | ||||
|                                                           "IUser:NFCTagDetected"); | ||||
| } | ||||
| @@ -34,8 +34,8 @@ Module::Interface::~Interface() = default; | ||||
|  | ||||
| class IUser final : public ServiceFramework<IUser> { | ||||
| public: | ||||
|     IUser(Module::Interface& nfp_interface) | ||||
|         : ServiceFramework("NFP::IUser"), nfp_interface(nfp_interface) { | ||||
|     IUser(Module::Interface& nfp_interface, Core::System& system) | ||||
|         : ServiceFramework("NFP::IUser"), nfp_interface(nfp_interface), system(system) { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &IUser::Initialize, "Initialize"}, | ||||
|             {1, &IUser::Finalize, "Finalize"}, | ||||
| @@ -65,7 +65,7 @@ public: | ||||
|         }; | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         auto& kernel = system.Kernel(); | ||||
|         deactivate_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::Automatic, "IUser:DeactivateEvent"); | ||||
|         availability_change_event = Kernel::WritableEvent::CreateEventPair( | ||||
| @@ -324,6 +324,7 @@ private: | ||||
|     Kernel::EventPair deactivate_event; | ||||
|     Kernel::EventPair availability_change_event; | ||||
|     const Module::Interface& nfp_interface; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) { | ||||
| @@ -331,7 +332,7 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushIpcInterface<IUser>(*this); | ||||
|     rb.PushIpcInterface<IUser>(*this, system); | ||||
| } | ||||
|  | ||||
| bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | ||||
| @@ -353,9 +354,9 @@ const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const | ||||
|     return amiibo; | ||||
| } | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     auto module = std::make_shared<Module>(); | ||||
|     std::make_shared<NFP_User>(module)->InstallAsService(service_manager); | ||||
|     std::make_shared<NFP_User>(module, system)->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::NFP | ||||
|   | ||||
| @@ -16,7 +16,7 @@ class Module final { | ||||
| public: | ||||
|     class Interface : public ServiceFramework<Interface> { | ||||
|     public: | ||||
|         explicit Interface(std::shared_ptr<Module> module, const char* name); | ||||
|         explicit Interface(std::shared_ptr<Module> module, Core::System& system, const char* name); | ||||
|         ~Interface() override; | ||||
|  | ||||
|         struct ModelInfo { | ||||
| @@ -43,9 +43,10 @@ public: | ||||
|  | ||||
|     protected: | ||||
|         std::shared_ptr<Module> module; | ||||
|         Core::System& system; | ||||
|     }; | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::NFP | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
|  | ||||
| namespace Service::NFP { | ||||
|  | ||||
| NFP_User::NFP_User(std::shared_ptr<Module> module) | ||||
|     : Module::Interface(std::move(module), "nfp:user") { | ||||
| NFP_User::NFP_User(std::shared_ptr<Module> module, Core::System& system) | ||||
|     : Module::Interface(std::move(module), system, "nfp:user") { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &NFP_User::CreateUserInterface, "CreateUserInterface"}, | ||||
|     }; | ||||
|   | ||||
| @@ -10,7 +10,7 @@ namespace Service::NFP { | ||||
|  | ||||
| class NFP_User final : public Module::Interface { | ||||
| public: | ||||
|     explicit NFP_User(std::shared_ptr<Module> module); | ||||
|     explicit NFP_User(std::shared_ptr<Module> module, Core::System& system); | ||||
|     ~NFP_User() override; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,7 @@ public: | ||||
|  | ||||
| class IRequest final : public ServiceFramework<IRequest> { | ||||
| public: | ||||
|     explicit IRequest() : ServiceFramework("IRequest") { | ||||
|     explicit IRequest(Core::System& system) : ServiceFramework("IRequest") { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &IRequest::GetRequestState, "GetRequestState"}, | ||||
|             {1, &IRequest::GetResult, "GetResult"}, | ||||
| @@ -61,7 +61,7 @@ public: | ||||
|         }; | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         auto& kernel = system.Kernel(); | ||||
|         event1 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, | ||||
|                                                         "IRequest:Event1"); | ||||
|         event2 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, | ||||
| @@ -130,7 +130,7 @@ public: | ||||
|  | ||||
| class IGeneralService final : public ServiceFramework<IGeneralService> { | ||||
| public: | ||||
|     IGeneralService(); | ||||
|     IGeneralService(Core::System& system); | ||||
|  | ||||
| private: | ||||
|     void GetClientId(Kernel::HLERequestContext& ctx) { | ||||
| @@ -155,7 +155,7 @@ private: | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|  | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IRequest>(); | ||||
|         rb.PushIpcInterface<IRequest>(system); | ||||
|     } | ||||
|     void RemoveNetworkProfile(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_NIFM, "(STUBBED) called"); | ||||
| @@ -198,9 +198,11 @@ private: | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.Push<u8>(0); | ||||
|     } | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| IGeneralService::IGeneralService() : ServiceFramework("IGeneralService") { | ||||
| IGeneralService::IGeneralService(Core::System& system) | ||||
|     : ServiceFramework("IGeneralService"), system(system) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {1, &IGeneralService::GetClientId, "GetClientId"}, | ||||
|         {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"}, | ||||
| @@ -245,7 +247,8 @@ IGeneralService::IGeneralService() : ServiceFramework("IGeneralService") { | ||||
|  | ||||
| class NetworkInterface final : public ServiceFramework<NetworkInterface> { | ||||
| public: | ||||
|     explicit NetworkInterface(const char* name) : ServiceFramework{name} { | ||||
|     explicit NetworkInterface(const char* name, Core::System& system) | ||||
|         : ServiceFramework{name}, system(system) { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"}, | ||||
|             {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}, | ||||
| @@ -258,7 +261,7 @@ public: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IGeneralService>(); | ||||
|         rb.PushIpcInterface<IGeneralService>(system); | ||||
|     } | ||||
|  | ||||
|     void CreateGeneralService(Kernel::HLERequestContext& ctx) { | ||||
| @@ -266,14 +269,17 @@ public: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IGeneralService>(); | ||||
|         rb.PushIpcInterface<IGeneralService>(system); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
|     std::make_shared<NetworkInterface>("nifm:a")->InstallAsService(service_manager); | ||||
|     std::make_shared<NetworkInterface>("nifm:s")->InstallAsService(service_manager); | ||||
|     std::make_shared<NetworkInterface>("nifm:u")->InstallAsService(service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     std::make_shared<NetworkInterface>("nifm:a", system)->InstallAsService(service_manager); | ||||
|     std::make_shared<NetworkInterface>("nifm:s", system)->InstallAsService(service_manager); | ||||
|     std::make_shared<NetworkInterface>("nifm:u", system)->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::NIFM | ||||
|   | ||||
| @@ -8,9 +8,13 @@ namespace Service::SM { | ||||
| class ServiceManager; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::NIFM { | ||||
|  | ||||
| /// Registers all NIFM services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::NIFM | ||||
|   | ||||
| @@ -126,7 +126,7 @@ public: | ||||
| class IEnsureNetworkClockAvailabilityService final | ||||
|     : public ServiceFramework<IEnsureNetworkClockAvailabilityService> { | ||||
| public: | ||||
|     IEnsureNetworkClockAvailabilityService() | ||||
|     explicit IEnsureNetworkClockAvailabilityService(Core::System& system) | ||||
|         : ServiceFramework("IEnsureNetworkClockAvailabilityService") { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, | ||||
| @@ -139,7 +139,7 @@ public: | ||||
|         }; | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         auto& kernel = system.Kernel(); | ||||
|         finished_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::Automatic, | ||||
|             "IEnsureNetworkClockAvailabilityService:FinishEvent"); | ||||
| @@ -200,7 +200,7 @@ private: | ||||
|  | ||||
| class NTC final : public ServiceFramework<NTC> { | ||||
| public: | ||||
|     explicit NTC() : ServiceFramework{"ntc"} { | ||||
|     explicit NTC(Core::System& system) : ServiceFramework{"ntc"}, system(system) { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"}, | ||||
| @@ -218,7 +218,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IEnsureNetworkClockAvailabilityService>(); | ||||
|         rb.PushIpcInterface<IEnsureNetworkClockAvailabilityService>(system); | ||||
|     } | ||||
|  | ||||
|     // TODO(ogniK): Do we need these? | ||||
| @@ -235,13 +235,14 @@ private: | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|     } | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& sm) { | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) { | ||||
|     std::make_shared<NIM>()->InstallAsService(sm); | ||||
|     std::make_shared<NIM_ECA>()->InstallAsService(sm); | ||||
|     std::make_shared<NIM_SHP>()->InstallAsService(sm); | ||||
|     std::make_shared<NTC>()->InstallAsService(sm); | ||||
|     std::make_shared<NTC>(system)->InstallAsService(sm); | ||||
| } | ||||
|  | ||||
| } // namespace Service::NIM | ||||
|   | ||||
| @@ -8,8 +8,12 @@ namespace Service::SM { | ||||
| class ServiceManager; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::NIM { | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& sm); | ||||
| void InstallInterfaces(SM::ServiceManager& sm, Core::System& system); | ||||
|  | ||||
| } // namespace Service::NIM | ||||
|   | ||||
| @@ -617,7 +617,8 @@ public: | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSystemController& fsc) { | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|  | ||||
|     std::make_shared<NS>("ns:am2")->InstallAsService(service_manager); | ||||
|     std::make_shared<NS>("ns:ec")->InstallAsService(service_manager); | ||||
|     std::make_shared<NS>("ns:rid")->InstallAsService(service_manager); | ||||
| @@ -628,7 +629,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSyst | ||||
|     std::make_shared<NS_SU>()->InstallAsService(service_manager); | ||||
|     std::make_shared<NS_VM>()->InstallAsService(service_manager); | ||||
|  | ||||
|     std::make_shared<PL_U>(fsc)->InstallAsService(service_manager); | ||||
|     std::make_shared<PL_U>(system)->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::NS | ||||
|   | ||||
| @@ -97,8 +97,7 @@ private: | ||||
| }; | ||||
|  | ||||
| /// Registers all NS services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSystemController& fsc); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace NS | ||||
|  | ||||
| } // namespace Service | ||||
|   | ||||
| @@ -150,8 +150,9 @@ struct PL_U::Impl { | ||||
|     std::vector<FontRegion> shared_font_regions; | ||||
| }; | ||||
|  | ||||
| PL_U::PL_U(FileSystem::FileSystemController& fsc) | ||||
|     : ServiceFramework("pl:u"), impl{std::make_unique<Impl>()} { | ||||
| PL_U::PL_U(Core::System& system) | ||||
|     : ServiceFramework("pl:u"), impl{std::make_unique<Impl>()}, system(system) { | ||||
|  | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &PL_U::RequestLoad, "RequestLoad"}, | ||||
|         {1, &PL_U::GetLoadState, "GetLoadState"}, | ||||
| @@ -161,6 +162,9 @@ PL_U::PL_U(FileSystem::FileSystemController& fsc) | ||||
|         {5, &PL_U::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriority"}, | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& fsc = system.GetFileSystemController(); | ||||
|  | ||||
|     // Attempt to load shared font data from disk | ||||
|     const auto* nand = fsc.GetSystemNANDContents(); | ||||
|     std::size_t offset = 0; | ||||
| @@ -325,7 +329,7 @@ void PL_U::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx) { | ||||
|                                                        Kernel::MemoryState::Shared); | ||||
|  | ||||
|     // Create shared font memory object | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system.Kernel(); | ||||
|     impl->shared_font_mem = Kernel::SharedMemory::Create( | ||||
|         kernel, Core::CurrentProcess(), SHARED_FONT_MEM_SIZE, Kernel::MemoryPermission::ReadWrite, | ||||
|         Kernel::MemoryPermission::Read, SHARED_FONT_MEM_VADDR, Kernel::MemoryRegion::BASE, | ||||
|   | ||||
| @@ -17,7 +17,7 @@ namespace NS { | ||||
|  | ||||
| class PL_U final : public ServiceFramework<PL_U> { | ||||
| public: | ||||
|     PL_U(FileSystem::FileSystemController& fsc); | ||||
|     explicit PL_U(Core::System& system); | ||||
|     ~PL_U() override; | ||||
|  | ||||
| private: | ||||
| @@ -30,6 +30,7 @@ private: | ||||
|  | ||||
|     struct Impl; | ||||
|     std::unique_ptr<Impl> impl; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace NS | ||||
|   | ||||
| @@ -29,26 +29,28 @@ namespace Service::NVFlinger { | ||||
| constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60); | ||||
| constexpr s64 frame_ticks_30fps = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 30); | ||||
|  | ||||
| NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { | ||||
|     displays.emplace_back(0, "Default"); | ||||
|     displays.emplace_back(1, "External"); | ||||
|     displays.emplace_back(2, "Edid"); | ||||
|     displays.emplace_back(3, "Internal"); | ||||
|     displays.emplace_back(4, "Null"); | ||||
| NVFlinger::NVFlinger(Core::System& system) : system(system) { | ||||
|     displays.emplace_back(0, "Default", system); | ||||
|     displays.emplace_back(1, "External", system); | ||||
|     displays.emplace_back(2, "Edid", system); | ||||
|     displays.emplace_back(3, "Internal", system); | ||||
|     displays.emplace_back(4, "Null", system); | ||||
|  | ||||
|     // Schedule the screen composition events | ||||
|     composition_event = core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, | ||||
|                                                                               s64 cycles_late) { | ||||
|         Compose(); | ||||
|         const auto ticks = Settings::values.force_30fps_mode ? frame_ticks_30fps : GetNextTicks(); | ||||
|         this->core_timing.ScheduleEvent(std::max<s64>(0LL, ticks - cycles_late), composition_event); | ||||
|     }); | ||||
|     composition_event = system.CoreTiming().RegisterEvent( | ||||
|         "ScreenComposition", [this](u64 userdata, s64 cycles_late) { | ||||
|             Compose(); | ||||
|             const auto ticks = | ||||
|                 Settings::values.force_30fps_mode ? frame_ticks_30fps : GetNextTicks(); | ||||
|             this->system.CoreTiming().ScheduleEvent(std::max<s64>(0LL, ticks - cycles_late), | ||||
|                                                     composition_event); | ||||
|         }); | ||||
|  | ||||
|     core_timing.ScheduleEvent(frame_ticks, composition_event); | ||||
|     system.CoreTiming().ScheduleEvent(frame_ticks, composition_event); | ||||
| } | ||||
|  | ||||
| NVFlinger::~NVFlinger() { | ||||
|     core_timing.UnscheduleEvent(composition_event, 0); | ||||
|     system.CoreTiming().UnscheduleEvent(composition_event, 0); | ||||
| } | ||||
|  | ||||
| void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) { | ||||
| @@ -185,11 +187,9 @@ void NVFlinger::Compose() { | ||||
|         MicroProfileFlip(); | ||||
|  | ||||
|         if (!buffer) { | ||||
|             auto& system_instance = Core::System::GetInstance(); | ||||
|  | ||||
|             // There was no queued buffer to draw, render previous frame | ||||
|             system_instance.GetPerfStats().EndGameFrame(); | ||||
|             system_instance.GPU().SwapBuffers({}); | ||||
|             system.GetPerfStats().EndGameFrame(); | ||||
|             system.GPU().SwapBuffers({}); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,7 @@ class BufferQueue; | ||||
|  | ||||
| class NVFlinger final { | ||||
| public: | ||||
|     explicit NVFlinger(Core::Timing::CoreTiming& core_timing); | ||||
|     explicit NVFlinger(Core::System& system); | ||||
|     ~NVFlinger(); | ||||
|  | ||||
|     /// Sets the NVDrv module instance to use to send buffers to the GPU. | ||||
| @@ -105,8 +105,7 @@ private: | ||||
|     /// Event that handles screen composition. | ||||
|     Core::Timing::EventType* composition_event; | ||||
|  | ||||
|     /// Core timing instance for registering/unregistering the composition event. | ||||
|     Core::Timing::CoreTiming& core_timing; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::NVFlinger | ||||
|   | ||||
| @@ -15,7 +15,7 @@ namespace Service::PlayReport { | ||||
|  | ||||
| class PlayReport final : public ServiceFramework<PlayReport> { | ||||
| public: | ||||
|     explicit PlayReport(Core::System& system, const char* name) | ||||
|     explicit PlayReport(const char* name, Core::System& system) | ||||
|         : ServiceFramework{name}, system(system) { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
| @@ -128,12 +128,12 @@ private: | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| void InstallInterfaces(Core::System& system) { | ||||
|     std::make_shared<PlayReport>(system, "prepo:a")->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<PlayReport>(system, "prepo:a2")->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<PlayReport>(system, "prepo:m")->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<PlayReport>(system, "prepo:s")->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<PlayReport>(system, "prepo:u")->InstallAsService(system.ServiceManager()); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | ||||
|     std::make_shared<PlayReport>("prepo:a", system)->InstallAsService(service_manager); | ||||
|     std::make_shared<PlayReport>("prepo:a2", system)->InstallAsService(service_manager); | ||||
|     std::make_shared<PlayReport>("prepo:m", system)->InstallAsService(service_manager); | ||||
|     std::make_shared<PlayReport>("prepo:s", system)->InstallAsService(service_manager); | ||||
|     std::make_shared<PlayReport>("prepo:u", system)->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Service::PlayReport | ||||
|   | ||||
| @@ -8,8 +8,12 @@ namespace Service::SM { | ||||
| class ServiceManager; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::PlayReport { | ||||
|  | ||||
| void InstallInterfaces(Core::System& system); | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); | ||||
|  | ||||
| } // namespace Service::PlayReport | ||||
|   | ||||
| @@ -198,50 +198,50 @@ ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& co | ||||
| void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) { | ||||
|     // NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it | ||||
|     // here and pass it into the respective InstallInterfaces functions. | ||||
|     auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(system.CoreTiming()); | ||||
|     auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(system); | ||||
|     system.GetFileSystemController().CreateFactories(*system.GetFilesystem(), false); | ||||
|  | ||||
|     SM::ServiceManager::InstallInterfaces(sm); | ||||
|  | ||||
|     Account::InstallInterfaces(system); | ||||
|     AM::InstallInterfaces(*sm, nv_flinger, system); | ||||
|     AOC::InstallInterfaces(*sm); | ||||
|     AOC::InstallInterfaces(*sm, system); | ||||
|     APM::InstallInterfaces(system); | ||||
|     Audio::InstallInterfaces(*sm, system); | ||||
|     BCAT::InstallInterfaces(*sm); | ||||
|     BPC::InstallInterfaces(*sm); | ||||
|     BtDrv::InstallInterfaces(*sm); | ||||
|     BTM::InstallInterfaces(*sm); | ||||
|     BtDrv::InstallInterfaces(*sm, system); | ||||
|     BTM::InstallInterfaces(*sm, system); | ||||
|     Capture::InstallInterfaces(*sm); | ||||
|     ERPT::InstallInterfaces(*sm); | ||||
|     ES::InstallInterfaces(*sm); | ||||
|     EUPLD::InstallInterfaces(*sm); | ||||
|     Fatal::InstallInterfaces(*sm); | ||||
|     Fatal::InstallInterfaces(*sm, system); | ||||
|     FGM::InstallInterfaces(*sm); | ||||
|     FileSystem::InstallInterfaces(system); | ||||
|     Friend::InstallInterfaces(*sm); | ||||
|     Friend::InstallInterfaces(*sm, system); | ||||
|     Glue::InstallInterfaces(system); | ||||
|     GRC::InstallInterfaces(*sm); | ||||
|     HID::InstallInterfaces(*sm); | ||||
|     HID::InstallInterfaces(*sm, system); | ||||
|     LBL::InstallInterfaces(*sm); | ||||
|     LDN::InstallInterfaces(*sm); | ||||
|     LDR::InstallInterfaces(*sm); | ||||
|     LDR::InstallInterfaces(*sm, system); | ||||
|     LM::InstallInterfaces(*sm); | ||||
|     Migration::InstallInterfaces(*sm); | ||||
|     Mii::InstallInterfaces(*sm); | ||||
|     MM::InstallInterfaces(*sm); | ||||
|     NCM::InstallInterfaces(*sm); | ||||
|     NFC::InstallInterfaces(*sm); | ||||
|     NFP::InstallInterfaces(*sm); | ||||
|     NIFM::InstallInterfaces(*sm); | ||||
|     NIM::InstallInterfaces(*sm); | ||||
|     NFP::InstallInterfaces(*sm, system); | ||||
|     NIFM::InstallInterfaces(*sm, system); | ||||
|     NIM::InstallInterfaces(*sm, system); | ||||
|     NPNS::InstallInterfaces(*sm); | ||||
|     NS::InstallInterfaces(*sm, system.GetFileSystemController()); | ||||
|     NS::InstallInterfaces(*sm, system); | ||||
|     Nvidia::InstallInterfaces(*sm, *nv_flinger, system); | ||||
|     PCIe::InstallInterfaces(*sm); | ||||
|     PCTL::InstallInterfaces(*sm); | ||||
|     PCV::InstallInterfaces(*sm); | ||||
|     PlayReport::InstallInterfaces(system); | ||||
|     PlayReport::InstallInterfaces(*sm, system); | ||||
|     PM::InstallInterfaces(system); | ||||
|     PSC::InstallInterfaces(*sm); | ||||
|     PSM::InstallInterfaces(*sm); | ||||
|   | ||||
| @@ -7,8 +7,8 @@ | ||||
| namespace Service::Time { | ||||
|  | ||||
| Time::Time(std::shared_ptr<Module> time, std::shared_ptr<SharedMemory> shared_memory, | ||||
|            const char* name) | ||||
|     : Module::Interface(std::move(time), std::move(shared_memory), name) { | ||||
|            Core::System& system, const char* name) | ||||
|     : Module::Interface(std::move(time), std::move(shared_memory), system, name) { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &Time::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, | ||||
|   | ||||
| @@ -13,7 +13,7 @@ class SharedMemory; | ||||
| class Time final : public Module::Interface { | ||||
| public: | ||||
|     explicit Time(std::shared_ptr<Module> time, std::shared_ptr<SharedMemory> shared_memory, | ||||
|                   const char* name); | ||||
|                   Core::System& system, const char* name); | ||||
|     ~Time() override; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -126,8 +126,8 @@ private: | ||||
|  | ||||
| class ISteadyClock final : public ServiceFramework<ISteadyClock> { | ||||
| public: | ||||
|     ISteadyClock(std::shared_ptr<SharedMemory> shared_memory) | ||||
|         : ServiceFramework("ISteadyClock"), shared_memory(shared_memory) { | ||||
|     ISteadyClock(std::shared_ptr<SharedMemory> shared_memory, Core::System& system) | ||||
|         : ServiceFramework("ISteadyClock"), shared_memory(shared_memory), system(system) { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &ISteadyClock::GetCurrentTimePoint, "GetCurrentTimePoint"}, | ||||
|         }; | ||||
| @@ -150,12 +150,13 @@ private: | ||||
|     } | ||||
|  | ||||
|     SteadyClockTimePoint GetCurrentTimePoint() const { | ||||
|         const auto& core_timing = Core::System::GetInstance().CoreTiming(); | ||||
|         const auto& core_timing = system.CoreTiming(); | ||||
|         const auto ms = Core::Timing::CyclesToMs(core_timing.GetTicks()); | ||||
|         return {static_cast<u64_le>(ms.count() / 1000), {}}; | ||||
|     } | ||||
|  | ||||
|     std::shared_ptr<SharedMemory> shared_memory; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class ITimeZoneService final : public ServiceFramework<ITimeZoneService> { | ||||
| @@ -290,7 +291,7 @@ void Module::Interface::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushIpcInterface<ISteadyClock>(shared_memory); | ||||
|     rb.PushIpcInterface<ISteadyClock>(shared_memory, system); | ||||
| } | ||||
|  | ||||
| void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) { | ||||
| @@ -325,7 +326,7 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const auto& core_timing = Core::System::GetInstance().CoreTiming(); | ||||
|     const auto& core_timing = system.CoreTiming(); | ||||
|     const auto ms = Core::Timing::CyclesToMs(core_timing.GetTicks()); | ||||
|     const SteadyClockTimePoint steady_clock_time_point{static_cast<u64_le>(ms.count() / 1000), {}}; | ||||
|  | ||||
| @@ -407,8 +408,10 @@ void Module::Interface::SetStandardUserSystemClockAutomaticCorrectionEnabled( | ||||
| } | ||||
|  | ||||
| Module::Interface::Interface(std::shared_ptr<Module> time, | ||||
|                              std::shared_ptr<SharedMemory> shared_memory, const char* name) | ||||
|     : ServiceFramework(name), time(std::move(time)), shared_memory(std::move(shared_memory)) {} | ||||
|                              std::shared_ptr<SharedMemory> shared_memory, Core::System& system, | ||||
|                              const char* name) | ||||
|     : ServiceFramework(name), time(std::move(time)), shared_memory(std::move(shared_memory)), | ||||
|       system(system) {} | ||||
|  | ||||
| Module::Interface::~Interface() = default; | ||||
|  | ||||
| @@ -416,9 +419,11 @@ void InstallInterfaces(Core::System& system) { | ||||
|     auto time = std::make_shared<Module>(); | ||||
|     auto shared_mem = std::make_shared<SharedMemory>(system); | ||||
|  | ||||
|     std::make_shared<Time>(time, shared_mem, "time:a")->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<Time>(time, shared_mem, "time:s")->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<Time>(std::move(time), shared_mem, "time:u") | ||||
|     std::make_shared<Time>(time, shared_mem, system, "time:a") | ||||
|         ->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<Time>(time, shared_mem, system, "time:s") | ||||
|         ->InstallAsService(system.ServiceManager()); | ||||
|     std::make_shared<Time>(std::move(time), shared_mem, system, "time:u") | ||||
|         ->InstallAsService(system.ServiceManager()); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -80,7 +80,8 @@ public: | ||||
|     class Interface : public ServiceFramework<Interface> { | ||||
|     public: | ||||
|         explicit Interface(std::shared_ptr<Module> time, | ||||
|                            std::shared_ptr<SharedMemory> shared_memory, const char* name); | ||||
|                            std::shared_ptr<SharedMemory> shared_memory, Core::System& system, | ||||
|                            const char* name); | ||||
|         ~Interface() override; | ||||
|  | ||||
|         void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); | ||||
| @@ -97,6 +98,7 @@ public: | ||||
|     protected: | ||||
|         std::shared_ptr<Module> time; | ||||
|         std::shared_ptr<SharedMemory> shared_memory; | ||||
|         Core::System& system; | ||||
|     }; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -15,8 +15,8 @@ | ||||
|  | ||||
| namespace Service::VI { | ||||
|  | ||||
| Display::Display(u64 id, std::string name) : id{id}, name{std::move(name)} { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
| Display::Display(u64 id, std::string name, Core::System& system) : id{id}, name{std::move(name)} { | ||||
|     auto& kernel = system.Kernel(); | ||||
|     vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, | ||||
|                                                          fmt::format("Display VSync Event {}", id)); | ||||
| } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ public: | ||||
|     /// @param id   The unique ID for this display. | ||||
|     /// @param name The name for this display. | ||||
|     /// | ||||
|     Display(u64 id, std::string name); | ||||
|     Display(u64 id, std::string name, Core::System& system); | ||||
|     ~Display(); | ||||
|  | ||||
|     Display(const Display&) = delete; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user