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