core: Keep track of ARPManager and register current application on boot
This commit is contained in:
		| @@ -25,6 +25,7 @@ | |||||||
| #include "core/hle/kernel/scheduler.h" | #include "core/hle/kernel/scheduler.h" | ||||||
| #include "core/hle/kernel/thread.h" | #include "core/hle/kernel/thread.h" | ||||||
| #include "core/hle/service/am/applets/applets.h" | #include "core/hle/service/am/applets/applets.h" | ||||||
|  | #include "core/hle/service/glue/manager.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| #include "core/hle/service/sm/sm.h" | #include "core/hle/service/sm/sm.h" | ||||||
| #include "core/loader/loader.h" | #include "core/loader/loader.h" | ||||||
| @@ -33,12 +34,39 @@ | |||||||
| #include "core/settings.h" | #include "core/settings.h" | ||||||
| #include "core/telemetry_session.h" | #include "core/telemetry_session.h" | ||||||
| #include "file_sys/cheat_engine.h" | #include "file_sys/cheat_engine.h" | ||||||
|  | #include "file_sys/patch_manager.h" | ||||||
| #include "video_core/debug_utils/debug_utils.h" | #include "video_core/debug_utils/debug_utils.h" | ||||||
| #include "video_core/renderer_base.h" | #include "video_core/renderer_base.h" | ||||||
| #include "video_core/video_core.h" | #include "video_core/video_core.h" | ||||||
|  |  | ||||||
| namespace Core { | namespace Core { | ||||||
|  |  | ||||||
|  | namespace { | ||||||
|  |  | ||||||
|  | FileSys::StorageId GetStorageIdForFrontendSlot( | ||||||
|  |     std::optional<FileSys::ContentProviderUnionSlot> slot) { | ||||||
|  |     if (!slot.has_value()) { | ||||||
|  |         return FileSys::StorageId::None; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     switch (*slot) { | ||||||
|  |     case FileSys::ContentProviderUnionSlot::UserNAND: | ||||||
|  |         return FileSys::StorageId::NandUser; | ||||||
|  |     case FileSys::ContentProviderUnionSlot::SysNAND: | ||||||
|  |         return FileSys::StorageId::NandSystem; | ||||||
|  |     case FileSys::ContentProviderUnionSlot::SDMC: | ||||||
|  |         return FileSys::StorageId::SdCard; | ||||||
|  |     case FileSys::ContentProviderUnionSlot::FrontendManual: | ||||||
|  |         return FileSys::StorageId::Host; | ||||||
|  |     default: | ||||||
|  |         return FileSys::StorageId::None; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     UNREACHABLE(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // Anonymous namespace | ||||||
|  |  | ||||||
| /*static*/ System System::s_instance; | /*static*/ System System::s_instance; | ||||||
|  |  | ||||||
| FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | ||||||
| @@ -110,6 +138,9 @@ struct System::Impl { | |||||||
|         /// Create default implementations of applets if one is not provided. |         /// Create default implementations of applets if one is not provided. | ||||||
|         applet_manager.SetDefaultAppletsIfMissing(); |         applet_manager.SetDefaultAppletsIfMissing(); | ||||||
|  |  | ||||||
|  |         /// Reset all glue registrations | ||||||
|  |         arp_manager.ResetAll(); | ||||||
|  |  | ||||||
|         telemetry_session = std::make_unique<Core::TelemetrySession>(); |         telemetry_session = std::make_unique<Core::TelemetrySession>(); | ||||||
|         service_manager = std::make_shared<Service::SM::ServiceManager>(); |         service_manager = std::make_shared<Service::SM::ServiceManager>(); | ||||||
|  |  | ||||||
| @@ -161,6 +192,7 @@ struct System::Impl { | |||||||
|             return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + |             return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + | ||||||
|                                              static_cast<u32>(load_result)); |                                              static_cast<u32>(load_result)); | ||||||
|         } |         } | ||||||
|  |         AddGlueRegistrationForProcess(*app_loader, *main_process); | ||||||
|         kernel.MakeCurrentProcess(main_process.get()); |         kernel.MakeCurrentProcess(main_process.get()); | ||||||
|  |  | ||||||
|         // Main process has been loaded and been made current. |         // Main process has been loaded and been made current. | ||||||
| @@ -219,6 +251,31 @@ struct System::Impl { | |||||||
|         return app_loader->ReadTitle(out); |         return app_loader->ReadTitle(out); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void AddGlueRegistrationForProcess(Loader::AppLoader& loader, Kernel::Process& process) { | ||||||
|  |         std::vector<u8> nacp_data; | ||||||
|  |         FileSys::NACP nacp; | ||||||
|  |         if (loader.ReadControlData(nacp) == Loader::ResultStatus::Success) { | ||||||
|  |             nacp_data = nacp.GetRawBytes(); | ||||||
|  |         } else { | ||||||
|  |             nacp_data.resize(sizeof(FileSys::RawNACP)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         Service::Glue::ApplicationLaunchProperty launch{}; | ||||||
|  |         launch.title_id = process.GetTitleID(); | ||||||
|  |  | ||||||
|  |         FileSys::PatchManager pm{launch.title_id}; | ||||||
|  |         launch.version = pm.GetGameVersion().value_or(0); | ||||||
|  |  | ||||||
|  |         // TODO(DarkLordZach): When FSController/Game Card Support is added, if | ||||||
|  |         // current_process_game_card use correct StorageId | ||||||
|  |         launch.base_game_storage_id = GetStorageIdForFrontendSlot(content_provider->GetSlotForEntry( | ||||||
|  |             launch.title_id, FileSys::ContentRecordType::Program)); | ||||||
|  |         launch.update_storage_id = GetStorageIdForFrontendSlot(content_provider->GetSlotForEntry( | ||||||
|  |             FileSys::GetUpdateTitleID(launch.title_id), FileSys::ContentRecordType::Program)); | ||||||
|  |  | ||||||
|  |         arp_manager.Register(launch.title_id, launch, std::move(nacp_data)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void SetStatus(ResultStatus new_status, const char* details = nullptr) { |     void SetStatus(ResultStatus new_status, const char* details = nullptr) { | ||||||
|         status = new_status; |         status = new_status; | ||||||
|         if (details) { |         if (details) { | ||||||
| @@ -249,6 +306,9 @@ struct System::Impl { | |||||||
|     /// Frontend applets |     /// Frontend applets | ||||||
|     Service::AM::Applets::AppletManager applet_manager; |     Service::AM::Applets::AppletManager applet_manager; | ||||||
|  |  | ||||||
|  |     /// Glue services | ||||||
|  |     Service::Glue::ARPManager arp_manager; | ||||||
|  |  | ||||||
|     /// Service manager |     /// Service manager | ||||||
|     std::shared_ptr<Service::SM::ServiceManager> service_manager; |     std::shared_ptr<Service::SM::ServiceManager> service_manager; | ||||||
|  |  | ||||||
| @@ -500,6 +560,14 @@ const Reporter& System::GetReporter() const { | |||||||
|     return impl->reporter; |     return impl->reporter; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | Service::Glue::ARPManager& System::GetARPManager() { | ||||||
|  |     return impl->arp_manager; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const Service::Glue::ARPManager& System::GetARPManager() const { | ||||||
|  |     return impl->arp_manager; | ||||||
|  | } | ||||||
|  |  | ||||||
| System::ResultStatus System::Init(Frontend::EmuWindow& emu_window) { | System::ResultStatus System::Init(Frontend::EmuWindow& emu_window) { | ||||||
|     return impl->Init(*this, emu_window); |     return impl->Init(*this, emu_window); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -43,6 +43,10 @@ struct AppletFrontendSet; | |||||||
| class AppletManager; | class AppletManager; | ||||||
| } // namespace AM::Applets | } // namespace AM::Applets | ||||||
|  |  | ||||||
|  | namespace Glue { | ||||||
|  | class ARPManager; | ||||||
|  | } | ||||||
|  |  | ||||||
| namespace SM { | namespace SM { | ||||||
| class ServiceManager; | class ServiceManager; | ||||||
| } // namespace SM | } // namespace SM | ||||||
| @@ -288,6 +292,10 @@ public: | |||||||
|  |  | ||||||
|     const Reporter& GetReporter() const; |     const Reporter& GetReporter() const; | ||||||
|  |  | ||||||
|  |     Service::Glue::ARPManager& GetARPManager(); | ||||||
|  |  | ||||||
|  |     const Service::Glue::ARPManager& GetARPManager() const; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     System(); |     System(); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user