summaryrefslogtreecommitdiff
path: root/src/core/loader
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-05-26 11:40:41 -0400
committerGravatar Zach Hilman2019-05-26 11:40:46 -0400
commitb77fde7c5c1f63aad9d4f01ea625805661870f3e (patch)
tree1a69520beebaac50ecd19d4c54828f7b8a498dd0 /src/core/loader
parentprepo: Save reports from PlayReport service (diff)
downloadyuzu-b77fde7c5c1f63aad9d4f01ea625805661870f3e.tar.gz
yuzu-b77fde7c5c1f63aad9d4f01ea625805661870f3e.tar.xz
yuzu-b77fde7c5c1f63aad9d4f01ea625805661870f3e.zip
loader: Move NSO module tracking to AppLoader
Also cleanup of general stuff
Diffstat (limited to 'src/core/loader')
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp11
-rw-r--r--src/core/loader/deconstructed_rom_directory.h4
-rw-r--r--src/core/loader/loader.h6
-rw-r--r--src/core/loader/nax.cpp4
-rw-r--r--src/core/loader/nax.h2
-rw-r--r--src/core/loader/nca.cpp9
-rw-r--r--src/core/loader/nca.h2
-rw-r--r--src/core/loader/nso.cpp12
-rw-r--r--src/core/loader/nso.h5
-rw-r--r--src/core/loader/nsp.cpp4
-rw-r--r--src/core/loader/nsp.h2
-rw-r--r--src/core/loader/xci.cpp4
-rw-r--r--src/core/loader/xci.h2
13 files changed, 64 insertions, 3 deletions
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index 10b13fb1d..f9e88be2b 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -141,6 +141,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
141 const FileSys::PatchManager pm(metadata.GetTitleID()); 141 const FileSys::PatchManager pm(metadata.GetTitleID());
142 142
143 // Load NSO modules 143 // Load NSO modules
144 modules.clear();
144 const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress(); 145 const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress();
145 VAddr next_load_addr = base_address; 146 VAddr next_load_addr = base_address;
146 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", 147 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3",
@@ -159,6 +160,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
159 } 160 }
160 161
161 next_load_addr = *tentative_next_load_addr; 162 next_load_addr = *tentative_next_load_addr;
163 modules.insert_or_assign(load_addr, module);
162 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr); 164 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr);
163 // Register module with GDBStub 165 // Register module with GDBStub
164 GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false); 166 GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false);
@@ -212,4 +214,13 @@ bool AppLoader_DeconstructedRomDirectory::IsRomFSUpdatable() const {
212 return false; 214 return false;
213} 215}
214 216
217ResultStatus AppLoader_DeconstructedRomDirectory::ReadNSOModules(Modules& modules) {
218 if (!is_loaded) {
219 return ResultStatus::ErrorNotInitialized;
220 }
221
222 modules = this->modules;
223 return ResultStatus::Success;
224}
225
215} // namespace Loader 226} // namespace Loader
diff --git a/src/core/loader/deconstructed_rom_directory.h b/src/core/loader/deconstructed_rom_directory.h
index 1a65c16a4..1c0a354a4 100644
--- a/src/core/loader/deconstructed_rom_directory.h
+++ b/src/core/loader/deconstructed_rom_directory.h
@@ -45,6 +45,8 @@ public:
45 ResultStatus ReadTitle(std::string& title) override; 45 ResultStatus ReadTitle(std::string& title) override;
46 bool IsRomFSUpdatable() const override; 46 bool IsRomFSUpdatable() const override;
47 47
48 ResultStatus ReadNSOModules(Modules& modules) override;
49
48private: 50private:
49 FileSys::ProgramMetadata metadata; 51 FileSys::ProgramMetadata metadata;
50 FileSys::VirtualFile romfs; 52 FileSys::VirtualFile romfs;
@@ -54,6 +56,8 @@ private:
54 std::string name; 56 std::string name;
55 u64 title_id{}; 57 u64 title_id{};
56 bool override_update; 58 bool override_update;
59
60 Modules modules;
57}; 61};
58 62
59} // namespace Loader 63} // namespace Loader
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index f7846db52..d6372c559 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -278,6 +278,12 @@ public:
278 return ResultStatus::ErrorNotImplemented; 278 return ResultStatus::ErrorNotImplemented;
279 } 279 }
280 280
281 using Modules = std::map<VAddr, std::string>;
282
283 virtual ResultStatus ReadNSOModules(Modules& modules) {
284 return ResultStatus::ErrorNotImplemented;
285 }
286
281protected: 287protected:
282 FileSys::VirtualFile file; 288 FileSys::VirtualFile file;
283 bool is_loaded = false; 289 bool is_loaded = false;
diff --git a/src/core/loader/nax.cpp b/src/core/loader/nax.cpp
index 34efef09a..a152981a0 100644
--- a/src/core/loader/nax.cpp
+++ b/src/core/loader/nax.cpp
@@ -94,4 +94,8 @@ ResultStatus AppLoader_NAX::ReadLogo(std::vector<u8>& buffer) {
94 return nca_loader->ReadLogo(buffer); 94 return nca_loader->ReadLogo(buffer);
95} 95}
96 96
97ResultStatus AppLoader_NAX::ReadNSOModules(Modules& modules) {
98 return nca_loader->ReadNSOModules(modules);
99}
100
97} // namespace Loader 101} // namespace Loader
diff --git a/src/core/loader/nax.h b/src/core/loader/nax.h
index 00f1659c1..eaec9bf58 100644
--- a/src/core/loader/nax.h
+++ b/src/core/loader/nax.h
@@ -42,6 +42,8 @@ public:
42 ResultStatus ReadBanner(std::vector<u8>& buffer) override; 42 ResultStatus ReadBanner(std::vector<u8>& buffer) override;
43 ResultStatus ReadLogo(std::vector<u8>& buffer) override; 43 ResultStatus ReadLogo(std::vector<u8>& buffer) override;
44 44
45 ResultStatus ReadNSOModules(Modules& modules) override;
46
45private: 47private:
46 std::unique_ptr<FileSys::NAX> nax; 48 std::unique_ptr<FileSys::NAX> nax;
47 std::unique_ptr<AppLoader_NCA> nca_loader; 49 std::unique_ptr<AppLoader_NCA> nca_loader;
diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp
index b3f8f1083..0f65fb637 100644
--- a/src/core/loader/nca.cpp
+++ b/src/core/loader/nca.cpp
@@ -105,4 +105,13 @@ ResultStatus AppLoader_NCA::ReadLogo(std::vector<u8>& buffer) {
105 buffer = logo->GetFile("NintendoLogo.png")->ReadAllBytes(); 105 buffer = logo->GetFile("NintendoLogo.png")->ReadAllBytes();
106 return ResultStatus::Success; 106 return ResultStatus::Success;
107} 107}
108
109ResultStatus AppLoader_NCA::ReadNSOModules(Modules& modules) {
110 if (directory_loader == nullptr) {
111 return ResultStatus::ErrorNotInitialized;
112 }
113
114 return directory_loader->ReadNSOModules(modules);
115}
116
108} // namespace Loader 117} // namespace Loader
diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h
index 94f0ed677..e47dc0e47 100644
--- a/src/core/loader/nca.h
+++ b/src/core/loader/nca.h
@@ -42,6 +42,8 @@ public:
42 ResultStatus ReadBanner(std::vector<u8>& buffer) override; 42 ResultStatus ReadBanner(std::vector<u8>& buffer) override;
43 ResultStatus ReadLogo(std::vector<u8>& buffer) override; 43 ResultStatus ReadLogo(std::vector<u8>& buffer) override;
44 44
45 ResultStatus ReadNSOModules(Modules& modules) override;
46
45private: 47private:
46 std::unique_ptr<FileSys::NCA> nca; 48 std::unique_ptr<FileSys::NCA> nca;
47 std::unique_ptr<AppLoader_DeconstructedRomDirectory> directory_loader; 49 std::unique_ptr<AppLoader_DeconstructedRomDirectory> directory_loader;
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 7beeaaff3..e0d6ab473 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -164,9 +164,6 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process,
164 // Register module with GDBStub 164 // Register module with GDBStub
165 GDBStub::RegisterModule(file.GetName(), load_base, load_base); 165 GDBStub::RegisterModule(file.GetName(), load_base, load_base);
166 166
167 // Register module for ARMInterface with System
168 Core::System::GetInstance().RegisterNSOModule(file.GetName(), load_base);
169
170 return load_base + image_size; 167 return load_base + image_size;
171} 168}
172 169
@@ -175,11 +172,15 @@ AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::Process& process) {
175 return {ResultStatus::ErrorAlreadyLoaded, {}}; 172 return {ResultStatus::ErrorAlreadyLoaded, {}};
176 } 173 }
177 174
175 modules.clear();
176
178 // Load module 177 // Load module
179 const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress(); 178 const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress();
180 if (!LoadModule(process, *file, base_address, true)) { 179 if (!LoadModule(process, *file, base_address, true)) {
181 return {ResultStatus::ErrorLoadingNSO, {}}; 180 return {ResultStatus::ErrorLoadingNSO, {}};
182 } 181 }
182
183 modules.insert_or_assign(base_address, file->GetName());
183 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address); 184 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address);
184 185
185 is_loaded = true; 186 is_loaded = true;
@@ -187,4 +188,9 @@ AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::Process& process) {
187 LoadParameters{Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE}}; 188 LoadParameters{Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE}};
188} 189}
189 190
191ResultStatus AppLoader_NSO::ReadNSOModules(Modules& modules) {
192 modules = this->modules;
193 return ResultStatus::Success;
194}
195
190} // namespace Loader 196} // namespace Loader
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h
index fdce9191c..58cbe162d 100644
--- a/src/core/loader/nso.h
+++ b/src/core/loader/nso.h
@@ -85,6 +85,11 @@ public:
85 std::optional<FileSys::PatchManager> pm = {}); 85 std::optional<FileSys::PatchManager> pm = {});
86 86
87 LoadResult Load(Kernel::Process& process) override; 87 LoadResult Load(Kernel::Process& process) override;
88
89 ResultStatus ReadNSOModules(Modules& modules) override;
90
91private:
92 Modules modules;
88}; 93};
89 94
90} // namespace Loader 95} // namespace Loader
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index ad56bbb38..3a22ec2c6 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -183,4 +183,8 @@ ResultStatus AppLoader_NSP::ReadLogo(std::vector<u8>& buffer) {
183 return secondary_loader->ReadLogo(buffer); 183 return secondary_loader->ReadLogo(buffer);
184} 184}
185 185
186ResultStatus AppLoader_NSP::ReadNSOModules(Modules& modules) {
187 return secondary_loader->ReadNSOModules(modules);
188}
189
186} // namespace Loader 190} // namespace Loader
diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h
index 85e870bdf..868b028d3 100644
--- a/src/core/loader/nsp.h
+++ b/src/core/loader/nsp.h
@@ -49,6 +49,8 @@ public:
49 ResultStatus ReadBanner(std::vector<u8>& buffer) override; 49 ResultStatus ReadBanner(std::vector<u8>& buffer) override;
50 ResultStatus ReadLogo(std::vector<u8>& buffer) override; 50 ResultStatus ReadLogo(std::vector<u8>& buffer) override;
51 51
52 ResultStatus ReadNSOModules(Modules& modules) override;
53
52private: 54private:
53 std::unique_ptr<FileSys::NSP> nsp; 55 std::unique_ptr<FileSys::NSP> nsp;
54 std::unique_ptr<AppLoader> secondary_loader; 56 std::unique_ptr<AppLoader> secondary_loader;
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp
index 1e285a053..a5c4d3688 100644
--- a/src/core/loader/xci.cpp
+++ b/src/core/loader/xci.cpp
@@ -149,4 +149,8 @@ ResultStatus AppLoader_XCI::ReadLogo(std::vector<u8>& buffer) {
149 return nca_loader->ReadLogo(buffer); 149 return nca_loader->ReadLogo(buffer);
150} 150}
151 151
152ResultStatus AppLoader_XCI::ReadNSOModules(Modules& modules) {
153 return nca_loader->ReadNSOModules(modules);
154}
155
152} // namespace Loader 156} // namespace Loader
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h
index ae7145b14..618ae2f47 100644
--- a/src/core/loader/xci.h
+++ b/src/core/loader/xci.h
@@ -49,6 +49,8 @@ public:
49 ResultStatus ReadBanner(std::vector<u8>& buffer) override; 49 ResultStatus ReadBanner(std::vector<u8>& buffer) override;
50 ResultStatus ReadLogo(std::vector<u8>& buffer) override; 50 ResultStatus ReadLogo(std::vector<u8>& buffer) override;
51 51
52 ResultStatus ReadNSOModules(Modules& modules) override;
53
52private: 54private:
53 std::unique_ptr<FileSys::XCI> xci; 55 std::unique_ptr<FileSys::XCI> xci;
54 std::unique_ptr<AppLoader_NCA> nca_loader; 56 std::unique_ptr<AppLoader_NCA> nca_loader;