summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Rodrigo Locatti2020-09-16 20:59:44 +0000
committerGravatar GitHub2020-09-16 20:59:44 +0000
commitb0ae8265ea0aea16bfe37dce96cc3f758fd35feb (patch)
tree735e838e0e271449cecaedc6977c1831c9e39a3a
parentMerge pull request #4658 from lioncash/copy3 (diff)
parentcore/loader: Remove dependencies on the global system instance (diff)
downloadyuzu-b0ae8265ea0aea16bfe37dce96cc3f758fd35feb.tar.gz
yuzu-b0ae8265ea0aea16bfe37dce96cc3f758fd35feb.tar.xz
yuzu-b0ae8265ea0aea16bfe37dce96cc3f758fd35feb.zip
Merge pull request #4661 from lioncash/system-loader
core/loader: Remove dependencies on the global system instance
Diffstat (limited to '')
-rw-r--r--src/core/core.cpp2
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp16
-rw-r--r--src/core/loader/deconstructed_rom_directory.h6
-rw-r--r--src/core/loader/elf.cpp3
-rw-r--r--src/core/loader/elf.h6
-rw-r--r--src/core/loader/kip.cpp3
-rw-r--r--src/core/loader/kip.h6
-rw-r--r--src/core/loader/loader.h7
-rw-r--r--src/core/loader/nax.cpp5
-rw-r--r--src/core/loader/nax.h8
-rw-r--r--src/core/loader/nca.cpp6
-rw-r--r--src/core/loader/nca.h6
-rw-r--r--src/core/loader/nro.cpp4
-rw-r--r--src/core/loader/nro.h6
-rw-r--r--src/core/loader/nso.cpp8
-rw-r--r--src/core/loader/nso.h12
-rw-r--r--src/core/loader/nsp.cpp7
-rw-r--r--src/core/loader/nsp.h6
-rw-r--r--src/core/loader/xci.cpp7
-rw-r--r--src/core/loader/xci.h6
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
91AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirectory::Load( 91AppLoader_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
12namespace Core {
13class System;
14}
15
12namespace Loader { 16namespace 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
386AppLoader_ELF::LoadResult AppLoader_ELF::Load(Kernel::Process& process) { 386AppLoader_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
11namespace Core {
12class System;
13}
14
11namespace Loader { 15namespace 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
46AppLoader::LoadResult AppLoader_KIP::Load(Kernel::Process& process) { 46AppLoader::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
9namespace Core {
10class System;
11}
12
9namespace FileSys { 13namespace FileSys {
10class KIP; 14class 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
31private: 35private:
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
18namespace Core {
19class System;
20}
21
18namespace FileSys { 22namespace FileSys {
19class NACP; 23class 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
44AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::Process& process) { 44AppLoader_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
11namespace FileSys { 11namespace Core {
12class System;
13}
12 14
15namespace FileSys {
13class NAX; 16class NAX;
14
15} // namespace FileSys 17} // namespace FileSys
16 18
17namespace Loader { 19namespace 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
34AppLoader_NCA::LoadResult AppLoader_NCA::Load(Kernel::Process& process) { 34AppLoader_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
11namespace Core {
12class System;
13}
14
11namespace FileSys { 15namespace FileSys {
12class NCA; 16class 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
211AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process) { 211AppLoader_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
13namespace Core {
14class System;
15}
16
13namespace FileSys { 17namespace FileSys {
14class NACP; 18class 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
74std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, 74std::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
169AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::Process& process) { 168AppLoader_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
15namespace Core {
16class System;
17}
18
15namespace Kernel { 19namespace Kernel {
16class Process; 20class 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
74AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process) { 74AppLoader_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
12namespace Core {
13class System;
14}
15
12namespace FileSys { 16namespace FileSys {
13class NACP; 17class NACP;
14class NSP; 18class 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
52AppLoader_XCI::LoadResult AppLoader_XCI::Load(Kernel::Process& process) { 52AppLoader_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
12namespace Core {
13class System;
14}
15
12namespace FileSys { 16namespace FileSys {
13class NACP; 17class NACP;
14class XCI; 18class 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;