diff options
| author | 2020-09-16 08:19:25 -0400 | |
|---|---|---|
| committer | 2020-09-16 08:46:59 -0400 | |
| commit | 113a3972a6487430ab94f08a4a66742739ff48c2 (patch) | |
| tree | 735e838e0e271449cecaedc6977c1831c9e39a3a | |
| parent | Merge pull request #4658 from lioncash/copy3 (diff) | |
| download | yuzu-113a3972a6487430ab94f08a4a66742739ff48c2.tar.gz yuzu-113a3972a6487430ab94f08a4a66742739ff48c2.tar.xz yuzu-113a3972a6487430ab94f08a4a66742739ff48c2.zip | |
core/loader: Remove dependencies on the global system instance
Now all that remains is:
18 instances in file_sys code
14 instances in GDB stub code (this can be tossed wholesale)
4 instances in HLE code
2 instances in settings code.
Diffstat (limited to '')
| -rw-r--r-- | src/core/core.cpp | 2 | ||||
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 16 | ||||
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.h | 6 | ||||
| -rw-r--r-- | src/core/loader/elf.cpp | 3 | ||||
| -rw-r--r-- | src/core/loader/elf.h | 6 | ||||
| -rw-r--r-- | src/core/loader/kip.cpp | 3 | ||||
| -rw-r--r-- | src/core/loader/kip.h | 6 | ||||
| -rw-r--r-- | src/core/loader/loader.h | 7 | ||||
| -rw-r--r-- | src/core/loader/nax.cpp | 5 | ||||
| -rw-r--r-- | src/core/loader/nax.h | 8 | ||||
| -rw-r--r-- | src/core/loader/nca.cpp | 6 | ||||
| -rw-r--r-- | src/core/loader/nca.h | 6 | ||||
| -rw-r--r-- | src/core/loader/nro.cpp | 4 | ||||
| -rw-r--r-- | src/core/loader/nro.h | 6 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 8 | ||||
| -rw-r--r-- | src/core/loader/nso.h | 12 | ||||
| -rw-r--r-- | src/core/loader/nsp.cpp | 7 | ||||
| -rw-r--r-- | src/core/loader/nsp.h | 6 | ||||
| -rw-r--r-- | src/core/loader/xci.cpp | 7 | ||||
| -rw-r--r-- | src/core/loader/xci.h | 6 |
20 files changed, 85 insertions, 45 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index df81e8e2c..05b1d2b92 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -221,7 +221,7 @@ struct System::Impl { | |||
| 221 | telemetry_session->AddInitialInfo(*app_loader); | 221 | telemetry_session->AddInitialInfo(*app_loader); |
| 222 | auto main_process = | 222 | auto main_process = |
| 223 | Kernel::Process::Create(system, "main", Kernel::Process::ProcessType::Userland); | 223 | Kernel::Process::Create(system, "main", Kernel::Process::ProcessType::Userland); |
| 224 | const auto [load_result, load_parameters] = app_loader->Load(*main_process); | 224 | const auto [load_result, load_parameters] = app_loader->Load(*main_process, system); |
| 225 | if (load_result != Loader::ResultStatus::Success) { | 225 | if (load_result != Loader::ResultStatus::Success) { |
| 226 | LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); | 226 | LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); |
| 227 | Shutdown(); | 227 | Shutdown(); |
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 134e83412..56dda425c 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp | |||
| @@ -89,7 +89,7 @@ FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::Virtua | |||
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirectory::Load( | 91 | AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirectory::Load( |
| 92 | Kernel::Process& process) { | 92 | Kernel::Process& process, Core::System& system) { |
| 93 | if (is_loaded) { | 93 | if (is_loaded) { |
| 94 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 94 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 95 | } | 95 | } |
| @@ -141,9 +141,9 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect | |||
| 141 | continue; | 141 | continue; |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | const bool should_pass_arguments{std::strcmp(module, "rtld") == 0}; | 144 | const bool should_pass_arguments = std::strcmp(module, "rtld") == 0; |
| 145 | const auto tentative_next_load_addr{AppLoader_NSO::LoadModule( | 145 | const auto tentative_next_load_addr = AppLoader_NSO::LoadModule( |
| 146 | process, *module_file, code_size, should_pass_arguments, false)}; | 146 | process, system, *module_file, code_size, should_pass_arguments, false); |
| 147 | if (!tentative_next_load_addr) { | 147 | if (!tentative_next_load_addr) { |
| 148 | return {ResultStatus::ErrorLoadingNSO, {}}; | 148 | return {ResultStatus::ErrorLoadingNSO, {}}; |
| 149 | } | 149 | } |
| @@ -168,9 +168,9 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect | |||
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | const VAddr load_addr{next_load_addr}; | 170 | const VAddr load_addr{next_load_addr}; |
| 171 | const bool should_pass_arguments{std::strcmp(module, "rtld") == 0}; | 171 | const bool should_pass_arguments = std::strcmp(module, "rtld") == 0; |
| 172 | const auto tentative_next_load_addr{AppLoader_NSO::LoadModule( | 172 | const auto tentative_next_load_addr = AppLoader_NSO::LoadModule( |
| 173 | process, *module_file, load_addr, should_pass_arguments, true, pm)}; | 173 | process, system, *module_file, load_addr, should_pass_arguments, true, pm); |
| 174 | if (!tentative_next_load_addr) { | 174 | if (!tentative_next_load_addr) { |
| 175 | return {ResultStatus::ErrorLoadingNSO, {}}; | 175 | return {ResultStatus::ErrorLoadingNSO, {}}; |
| 176 | } | 176 | } |
| @@ -192,7 +192,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect | |||
| 192 | // Register the RomFS if a ".romfs" file was found | 192 | // Register the RomFS if a ".romfs" file was found |
| 193 | if (romfs_iter != files.end() && *romfs_iter != nullptr) { | 193 | if (romfs_iter != files.end() && *romfs_iter != nullptr) { |
| 194 | romfs = *romfs_iter; | 194 | romfs = *romfs_iter; |
| 195 | Core::System::GetInstance().GetFileSystemController().RegisterRomFS( | 195 | system.GetFileSystemController().RegisterRomFS( |
| 196 | std::make_unique<FileSys::RomFSFactory>(*this)); | 196 | std::make_unique<FileSys::RomFSFactory>(*this)); |
| 197 | } | 197 | } |
| 198 | 198 | ||
diff --git a/src/core/loader/deconstructed_rom_directory.h b/src/core/loader/deconstructed_rom_directory.h index 1c0a354a4..35d340317 100644 --- a/src/core/loader/deconstructed_rom_directory.h +++ b/src/core/loader/deconstructed_rom_directory.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | #include "core/file_sys/program_metadata.h" | 9 | #include "core/file_sys/program_metadata.h" |
| 10 | #include "core/loader/loader.h" | 10 | #include "core/loader/loader.h" |
| 11 | 11 | ||
| 12 | namespace Core { | ||
| 13 | class System; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace Loader { | 16 | namespace Loader { |
| 13 | 17 | ||
| 14 | /** | 18 | /** |
| @@ -37,7 +41,7 @@ public: | |||
| 37 | return IdentifyType(file); | 41 | return IdentifyType(file); |
| 38 | } | 42 | } |
| 39 | 43 | ||
| 40 | LoadResult Load(Kernel::Process& process) override; | 44 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 41 | 45 | ||
| 42 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; | 46 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; |
| 43 | ResultStatus ReadIcon(std::vector<u8>& buffer) override; | 47 | ResultStatus ReadIcon(std::vector<u8>& buffer) override; |
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 8f7615115..dca1fcb18 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp | |||
| @@ -383,7 +383,8 @@ FileType AppLoader_ELF::IdentifyType(const FileSys::VirtualFile& file) { | |||
| 383 | return FileType::Error; | 383 | return FileType::Error; |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | AppLoader_ELF::LoadResult AppLoader_ELF::Load(Kernel::Process& process) { | 386 | AppLoader_ELF::LoadResult AppLoader_ELF::Load(Kernel::Process& process, |
| 387 | [[maybe_unused]] Core::System& system) { | ||
| 387 | if (is_loaded) { | 388 | if (is_loaded) { |
| 388 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 389 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 389 | } | 390 | } |
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h index 7ef7770a6..3527933ad 100644 --- a/src/core/loader/elf.h +++ b/src/core/loader/elf.h | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 9 | #include "core/loader/loader.h" | 9 | #include "core/loader/loader.h" |
| 10 | 10 | ||
| 11 | namespace Core { | ||
| 12 | class System; | ||
| 13 | } | ||
| 14 | |||
| 11 | namespace Loader { | 15 | namespace Loader { |
| 12 | 16 | ||
| 13 | /// Loads an ELF/AXF file | 17 | /// Loads an ELF/AXF file |
| @@ -26,7 +30,7 @@ public: | |||
| 26 | return IdentifyType(file); | 30 | return IdentifyType(file); |
| 27 | } | 31 | } |
| 28 | 32 | ||
| 29 | LoadResult Load(Kernel::Process& process) override; | 33 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 30 | }; | 34 | }; |
| 31 | 35 | ||
| 32 | } // namespace Loader | 36 | } // namespace Loader |
diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp index 40fa03ad1..5981bcd21 100644 --- a/src/core/loader/kip.cpp +++ b/src/core/loader/kip.cpp | |||
| @@ -43,7 +43,8 @@ FileType AppLoader_KIP::GetFileType() const { | |||
| 43 | : FileType::Error; | 43 | : FileType::Error; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | AppLoader::LoadResult AppLoader_KIP::Load(Kernel::Process& process) { | 46 | AppLoader::LoadResult AppLoader_KIP::Load(Kernel::Process& process, |
| 47 | [[maybe_unused]] Core::System& system) { | ||
| 47 | if (is_loaded) { | 48 | if (is_loaded) { |
| 48 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 49 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 49 | } | 50 | } |
diff --git a/src/core/loader/kip.h b/src/core/loader/kip.h index 12ca40269..dee05a7b5 100644 --- a/src/core/loader/kip.h +++ b/src/core/loader/kip.h | |||
| @@ -6,6 +6,10 @@ | |||
| 6 | 6 | ||
| 7 | #include "core/loader/loader.h" | 7 | #include "core/loader/loader.h" |
| 8 | 8 | ||
| 9 | namespace Core { | ||
| 10 | class System; | ||
| 11 | } | ||
| 12 | |||
| 9 | namespace FileSys { | 13 | namespace FileSys { |
| 10 | class KIP; | 14 | class KIP; |
| 11 | } | 15 | } |
| @@ -26,7 +30,7 @@ public: | |||
| 26 | 30 | ||
| 27 | FileType GetFileType() const override; | 31 | FileType GetFileType() const override; |
| 28 | 32 | ||
| 29 | LoadResult Load(Kernel::Process& process) override; | 33 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 30 | 34 | ||
| 31 | private: | 35 | private: |
| 32 | std::unique_ptr<FileSys::KIP> kip; | 36 | std::unique_ptr<FileSys::KIP> kip; |
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 227ecc704..ac60b097a 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h | |||
| @@ -15,6 +15,10 @@ | |||
| 15 | #include "core/file_sys/control_metadata.h" | 15 | #include "core/file_sys/control_metadata.h" |
| 16 | #include "core/file_sys/vfs.h" | 16 | #include "core/file_sys/vfs.h" |
| 17 | 17 | ||
| 18 | namespace Core { | ||
| 19 | class System; | ||
| 20 | } | ||
| 21 | |||
| 18 | namespace FileSys { | 22 | namespace FileSys { |
| 19 | class NACP; | 23 | class NACP; |
| 20 | } // namespace FileSys | 24 | } // namespace FileSys |
| @@ -154,9 +158,10 @@ public: | |||
| 154 | /** | 158 | /** |
| 155 | * Load the application and return the created Process instance | 159 | * Load the application and return the created Process instance |
| 156 | * @param process The newly created process. | 160 | * @param process The newly created process. |
| 161 | * @param system The system that this process is being loaded under. | ||
| 157 | * @return The status result of the operation. | 162 | * @return The status result of the operation. |
| 158 | */ | 163 | */ |
| 159 | virtual LoadResult Load(Kernel::Process& process) = 0; | 164 | virtual LoadResult Load(Kernel::Process& process, Core::System& system) = 0; |
| 160 | 165 | ||
| 161 | /** | 166 | /** |
| 162 | * Get the code (typically .code section) of the application | 167 | * Get the code (typically .code section) of the application |
diff --git a/src/core/loader/nax.cpp b/src/core/loader/nax.cpp index a152981a0..49028177b 100644 --- a/src/core/loader/nax.cpp +++ b/src/core/loader/nax.cpp | |||
| @@ -41,7 +41,8 @@ FileType AppLoader_NAX::GetFileType() const { | |||
| 41 | return IdentifyTypeImpl(*nax); | 41 | return IdentifyTypeImpl(*nax); |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::Process& process) { | 44 | AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::Process& process, |
| 45 | [[maybe_unused]] Core::System& system) { | ||
| 45 | if (is_loaded) { | 46 | if (is_loaded) { |
| 46 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 47 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 47 | } | 48 | } |
| @@ -65,7 +66,7 @@ AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::Process& process) { | |||
| 65 | return {nca_status, {}}; | 66 | return {nca_status, {}}; |
| 66 | } | 67 | } |
| 67 | 68 | ||
| 68 | const auto result = nca_loader->Load(process); | 69 | const auto result = nca_loader->Load(process, system); |
| 69 | if (result.first != ResultStatus::Success) { | 70 | if (result.first != ResultStatus::Success) { |
| 70 | return result; | 71 | return result; |
| 71 | } | 72 | } |
diff --git a/src/core/loader/nax.h b/src/core/loader/nax.h index eaec9bf58..c2b7722b5 100644 --- a/src/core/loader/nax.h +++ b/src/core/loader/nax.h | |||
| @@ -8,10 +8,12 @@ | |||
| 8 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 9 | #include "core/loader/loader.h" | 9 | #include "core/loader/loader.h" |
| 10 | 10 | ||
| 11 | namespace FileSys { | 11 | namespace Core { |
| 12 | class System; | ||
| 13 | } | ||
| 12 | 14 | ||
| 15 | namespace FileSys { | ||
| 13 | class NAX; | 16 | class NAX; |
| 14 | |||
| 15 | } // namespace FileSys | 17 | } // namespace FileSys |
| 16 | 18 | ||
| 17 | namespace Loader { | 19 | namespace Loader { |
| @@ -33,7 +35,7 @@ public: | |||
| 33 | 35 | ||
| 34 | FileType GetFileType() const override; | 36 | FileType GetFileType() const override; |
| 35 | 37 | ||
| 36 | LoadResult Load(Kernel::Process& process) override; | 38 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 37 | 39 | ||
| 38 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; | 40 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; |
| 39 | u64 ReadRomFSIVFCOffset() const override; | 41 | u64 ReadRomFSIVFCOffset() const override; |
diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp index 5a0469978..50d7a0f32 100644 --- a/src/core/loader/nca.cpp +++ b/src/core/loader/nca.cpp | |||
| @@ -31,7 +31,7 @@ FileType AppLoader_NCA::IdentifyType(const FileSys::VirtualFile& file) { | |||
| 31 | return FileType::Error; | 31 | return FileType::Error; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | AppLoader_NCA::LoadResult AppLoader_NCA::Load(Kernel::Process& process) { | 34 | AppLoader_NCA::LoadResult AppLoader_NCA::Load(Kernel::Process& process, Core::System& system) { |
| 35 | if (is_loaded) { | 35 | if (is_loaded) { |
| 36 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 36 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 37 | } | 37 | } |
| @@ -52,13 +52,13 @@ AppLoader_NCA::LoadResult AppLoader_NCA::Load(Kernel::Process& process) { | |||
| 52 | 52 | ||
| 53 | directory_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(exefs, true); | 53 | directory_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(exefs, true); |
| 54 | 54 | ||
| 55 | const auto load_result = directory_loader->Load(process); | 55 | const auto load_result = directory_loader->Load(process, system); |
| 56 | if (load_result.first != ResultStatus::Success) { | 56 | if (load_result.first != ResultStatus::Success) { |
| 57 | return load_result; | 57 | return load_result; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | if (nca->GetRomFS() != nullptr && nca->GetRomFS()->GetSize() > 0) { | 60 | if (nca->GetRomFS() != nullptr && nca->GetRomFS()->GetSize() > 0) { |
| 61 | Core::System::GetInstance().GetFileSystemController().RegisterRomFS( | 61 | system.GetFileSystemController().RegisterRomFS( |
| 62 | std::make_unique<FileSys::RomFSFactory>(*this)); | 62 | std::make_unique<FileSys::RomFSFactory>(*this)); |
| 63 | } | 63 | } |
| 64 | 64 | ||
diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h index e47dc0e47..711070294 100644 --- a/src/core/loader/nca.h +++ b/src/core/loader/nca.h | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | #include "core/file_sys/vfs.h" | 8 | #include "core/file_sys/vfs.h" |
| 9 | #include "core/loader/loader.h" | 9 | #include "core/loader/loader.h" |
| 10 | 10 | ||
| 11 | namespace Core { | ||
| 12 | class System; | ||
| 13 | } | ||
| 14 | |||
| 11 | namespace FileSys { | 15 | namespace FileSys { |
| 12 | class NCA; | 16 | class NCA; |
| 13 | } | 17 | } |
| @@ -33,7 +37,7 @@ public: | |||
| 33 | return IdentifyType(file); | 37 | return IdentifyType(file); |
| 34 | } | 38 | } |
| 35 | 39 | ||
| 36 | LoadResult Load(Kernel::Process& process) override; | 40 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 37 | 41 | ||
| 38 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; | 42 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; |
| 39 | u64 ReadRomFSIVFCOffset() const override; | 43 | u64 ReadRomFSIVFCOffset() const override; |
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 906544bc9..5ce279f81 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp | |||
| @@ -208,7 +208,7 @@ bool AppLoader_NRO::LoadNro(Kernel::Process& process, const FileSys::VfsFile& fi | |||
| 208 | return LoadNroImpl(process, file.ReadAllBytes(), file.GetName()); | 208 | return LoadNroImpl(process, file.ReadAllBytes(), file.GetName()); |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process) { | 211 | AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process, Core::System& system) { |
| 212 | if (is_loaded) { | 212 | if (is_loaded) { |
| 213 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 213 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 214 | } | 214 | } |
| @@ -218,7 +218,7 @@ AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process) { | |||
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | if (romfs != nullptr) { | 220 | if (romfs != nullptr) { |
| 221 | Core::System::GetInstance().GetFileSystemController().RegisterRomFS( | 221 | system.GetFileSystemController().RegisterRomFS( |
| 222 | std::make_unique<FileSys::RomFSFactory>(*this)); | 222 | std::make_unique<FileSys::RomFSFactory>(*this)); |
| 223 | } | 223 | } |
| 224 | 224 | ||
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h index 4593d48fb..a2aab2ecc 100644 --- a/src/core/loader/nro.h +++ b/src/core/loader/nro.h | |||
| @@ -10,6 +10,10 @@ | |||
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | #include "core/loader/loader.h" | 11 | #include "core/loader/loader.h" |
| 12 | 12 | ||
| 13 | namespace Core { | ||
| 14 | class System; | ||
| 15 | } | ||
| 16 | |||
| 13 | namespace FileSys { | 17 | namespace FileSys { |
| 14 | class NACP; | 18 | class NACP; |
| 15 | } | 19 | } |
| @@ -37,7 +41,7 @@ public: | |||
| 37 | return IdentifyType(file); | 41 | return IdentifyType(file); |
| 38 | } | 42 | } |
| 39 | 43 | ||
| 40 | LoadResult Load(Kernel::Process& process) override; | 44 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 41 | 45 | ||
| 42 | ResultStatus ReadIcon(std::vector<u8>& buffer) override; | 46 | ResultStatus ReadIcon(std::vector<u8>& buffer) override; |
| 43 | ResultStatus ReadProgramId(u64& out_program_id) override; | 47 | ResultStatus ReadProgramId(u64& out_program_id) override; |
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 575330a86..2610cea34 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -71,7 +71,7 @@ FileType AppLoader_NSO::IdentifyType(const FileSys::VirtualFile& file) { | |||
| 71 | return FileType::NSO; | 71 | return FileType::NSO; |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, | 74 | std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, Core::System& system, |
| 75 | const FileSys::VfsFile& file, VAddr load_base, | 75 | const FileSys::VfsFile& file, VAddr load_base, |
| 76 | bool should_pass_arguments, bool load_into_process, | 76 | bool should_pass_arguments, bool load_into_process, |
| 77 | std::optional<FileSys::PatchManager> pm) { | 77 | std::optional<FileSys::PatchManager> pm) { |
| @@ -148,7 +148,6 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, | |||
| 148 | 148 | ||
| 149 | // Apply cheats if they exist and the program has a valid title ID | 149 | // Apply cheats if they exist and the program has a valid title ID |
| 150 | if (pm) { | 150 | if (pm) { |
| 151 | auto& system = Core::System::GetInstance(); | ||
| 152 | system.SetCurrentProcessBuildID(nso_header.build_id); | 151 | system.SetCurrentProcessBuildID(nso_header.build_id); |
| 153 | const auto cheats = pm->CreateCheatList(system, nso_header.build_id); | 152 | const auto cheats = pm->CreateCheatList(system, nso_header.build_id); |
| 154 | if (!cheats.empty()) { | 153 | if (!cheats.empty()) { |
| @@ -166,7 +165,8 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, | |||
| 166 | return load_base + image_size; | 165 | return load_base + image_size; |
| 167 | } | 166 | } |
| 168 | 167 | ||
| 169 | AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::Process& process) { | 168 | AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::Process& process, |
| 169 | [[maybe_unused]] Core::System& system) { | ||
| 170 | if (is_loaded) { | 170 | if (is_loaded) { |
| 171 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 171 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 172 | } | 172 | } |
| @@ -175,7 +175,7 @@ AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::Process& process) { | |||
| 175 | 175 | ||
| 176 | // Load module | 176 | // Load module |
| 177 | const VAddr base_address = process.PageTable().GetCodeRegionStart(); | 177 | const VAddr base_address = process.PageTable().GetCodeRegionStart(); |
| 178 | if (!LoadModule(process, *file, base_address, true, true)) { | 178 | if (!LoadModule(process, system, *file, base_address, true, true)) { |
| 179 | return {ResultStatus::ErrorLoadingNSO, {}}; | 179 | return {ResultStatus::ErrorLoadingNSO, {}}; |
| 180 | } | 180 | } |
| 181 | 181 | ||
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index b210830f0..4bd47787d 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h | |||
| @@ -12,6 +12,10 @@ | |||
| 12 | #include "core/file_sys/patch_manager.h" | 12 | #include "core/file_sys/patch_manager.h" |
| 13 | #include "core/loader/loader.h" | 13 | #include "core/loader/loader.h" |
| 14 | 14 | ||
| 15 | namespace Core { | ||
| 16 | class System; | ||
| 17 | } | ||
| 18 | |||
| 15 | namespace Kernel { | 19 | namespace Kernel { |
| 16 | class Process; | 20 | class Process; |
| 17 | } | 21 | } |
| @@ -80,12 +84,12 @@ public: | |||
| 80 | return IdentifyType(file); | 84 | return IdentifyType(file); |
| 81 | } | 85 | } |
| 82 | 86 | ||
| 83 | static std::optional<VAddr> LoadModule(Kernel::Process& process, const FileSys::VfsFile& file, | 87 | static std::optional<VAddr> LoadModule(Kernel::Process& process, Core::System& system, |
| 84 | VAddr load_base, bool should_pass_arguments, | 88 | const FileSys::VfsFile& file, VAddr load_base, |
| 85 | bool load_into_process, | 89 | bool should_pass_arguments, bool load_into_process, |
| 86 | std::optional<FileSys::PatchManager> pm = {}); | 90 | std::optional<FileSys::PatchManager> pm = {}); |
| 87 | 91 | ||
| 88 | LoadResult Load(Kernel::Process& process) override; | 92 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 89 | 93 | ||
| 90 | ResultStatus ReadNSOModules(Modules& modules) override; | 94 | ResultStatus ReadNSOModules(Modules& modules) override; |
| 91 | 95 | ||
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp index 13950fc08..15e528fa8 100644 --- a/src/core/loader/nsp.cpp +++ b/src/core/loader/nsp.cpp | |||
| @@ -71,7 +71,7 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& file) { | |||
| 71 | return FileType::Error; | 71 | return FileType::Error; |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process) { | 74 | AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process, Core::System& system) { |
| 75 | if (is_loaded) { | 75 | if (is_loaded) { |
| 76 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 76 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 77 | } | 77 | } |
| @@ -99,15 +99,14 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process) { | |||
| 99 | return {ResultStatus::ErrorNSPMissingProgramNCA, {}}; | 99 | return {ResultStatus::ErrorNSPMissingProgramNCA, {}}; |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | const auto result = secondary_loader->Load(process); | 102 | const auto result = secondary_loader->Load(process, system); |
| 103 | if (result.first != ResultStatus::Success) { | 103 | if (result.first != ResultStatus::Success) { |
| 104 | return result; | 104 | return result; |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | FileSys::VirtualFile update_raw; | 107 | FileSys::VirtualFile update_raw; |
| 108 | if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr) { | 108 | if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr) { |
| 109 | Core::System::GetInstance().GetFileSystemController().SetPackedUpdate( | 109 | system.GetFileSystemController().SetPackedUpdate(std::move(update_raw)); |
| 110 | std::move(update_raw)); | ||
| 111 | } | 110 | } |
| 112 | 111 | ||
| 113 | is_loaded = true; | 112 | is_loaded = true; |
diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h index 868b028d3..b27deb686 100644 --- a/src/core/loader/nsp.h +++ b/src/core/loader/nsp.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | #include "core/file_sys/vfs.h" | 9 | #include "core/file_sys/vfs.h" |
| 10 | #include "core/loader/loader.h" | 10 | #include "core/loader/loader.h" |
| 11 | 11 | ||
| 12 | namespace Core { | ||
| 13 | class System; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace FileSys { | 16 | namespace FileSys { |
| 13 | class NACP; | 17 | class NACP; |
| 14 | class NSP; | 18 | class NSP; |
| @@ -35,7 +39,7 @@ public: | |||
| 35 | return IdentifyType(file); | 39 | return IdentifyType(file); |
| 36 | } | 40 | } |
| 37 | 41 | ||
| 38 | LoadResult Load(Kernel::Process& process) override; | 42 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 39 | 43 | ||
| 40 | ResultStatus ReadRomFS(FileSys::VirtualFile& file) override; | 44 | ResultStatus ReadRomFS(FileSys::VirtualFile& file) override; |
| 41 | u64 ReadRomFSIVFCOffset() const override; | 45 | u64 ReadRomFSIVFCOffset() const override; |
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp index 7186ad1ff..25e83af0f 100644 --- a/src/core/loader/xci.cpp +++ b/src/core/loader/xci.cpp | |||
| @@ -49,7 +49,7 @@ FileType AppLoader_XCI::IdentifyType(const FileSys::VirtualFile& file) { | |||
| 49 | return FileType::Error; | 49 | return FileType::Error; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | AppLoader_XCI::LoadResult AppLoader_XCI::Load(Kernel::Process& process) { | 52 | AppLoader_XCI::LoadResult AppLoader_XCI::Load(Kernel::Process& process, Core::System& system) { |
| 53 | if (is_loaded) { | 53 | if (is_loaded) { |
| 54 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 54 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 55 | } | 55 | } |
| @@ -66,15 +66,14 @@ AppLoader_XCI::LoadResult AppLoader_XCI::Load(Kernel::Process& process) { | |||
| 66 | return {ResultStatus::ErrorMissingProductionKeyFile, {}}; | 66 | return {ResultStatus::ErrorMissingProductionKeyFile, {}}; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | const auto result = nca_loader->Load(process); | 69 | const auto result = nca_loader->Load(process, system); |
| 70 | if (result.first != ResultStatus::Success) { | 70 | if (result.first != ResultStatus::Success) { |
| 71 | return result; | 71 | return result; |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | FileSys::VirtualFile update_raw; | 74 | FileSys::VirtualFile update_raw; |
| 75 | if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr) { | 75 | if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr) { |
| 76 | Core::System::GetInstance().GetFileSystemController().SetPackedUpdate( | 76 | system.GetFileSystemController().SetPackedUpdate(std::move(update_raw)); |
| 77 | std::move(update_raw)); | ||
| 78 | } | 77 | } |
| 79 | 78 | ||
| 80 | is_loaded = true; | 79 | is_loaded = true; |
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h index 618ae2f47..04aea286f 100644 --- a/src/core/loader/xci.h +++ b/src/core/loader/xci.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | #include "core/file_sys/vfs.h" | 9 | #include "core/file_sys/vfs.h" |
| 10 | #include "core/loader/loader.h" | 10 | #include "core/loader/loader.h" |
| 11 | 11 | ||
| 12 | namespace Core { | ||
| 13 | class System; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace FileSys { | 16 | namespace FileSys { |
| 13 | class NACP; | 17 | class NACP; |
| 14 | class XCI; | 18 | class XCI; |
| @@ -35,7 +39,7 @@ public: | |||
| 35 | return IdentifyType(file); | 39 | return IdentifyType(file); |
| 36 | } | 40 | } |
| 37 | 41 | ||
| 38 | LoadResult Load(Kernel::Process& process) override; | 42 | LoadResult Load(Kernel::Process& process, Core::System& system) override; |
| 39 | 43 | ||
| 40 | ResultStatus ReadRomFS(FileSys::VirtualFile& file) override; | 44 | ResultStatus ReadRomFS(FileSys::VirtualFile& file) override; |
| 41 | u64 ReadRomFSIVFCOffset() const override; | 45 | u64 ReadRomFSIVFCOffset() const override; |