diff options
| author | 2019-05-26 11:40:41 -0400 | |
|---|---|---|
| committer | 2019-05-26 11:40:46 -0400 | |
| commit | b77fde7c5c1f63aad9d4f01ea625805661870f3e (patch) | |
| tree | 1a69520beebaac50ecd19d4c54828f7b8a498dd0 /src/core/loader | |
| parent | prepo: Save reports from PlayReport service (diff) | |
| download | yuzu-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.cpp | 11 | ||||
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.h | 4 | ||||
| -rw-r--r-- | src/core/loader/loader.h | 6 | ||||
| -rw-r--r-- | src/core/loader/nax.cpp | 4 | ||||
| -rw-r--r-- | src/core/loader/nax.h | 2 | ||||
| -rw-r--r-- | src/core/loader/nca.cpp | 9 | ||||
| -rw-r--r-- | src/core/loader/nca.h | 2 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 12 | ||||
| -rw-r--r-- | src/core/loader/nso.h | 5 | ||||
| -rw-r--r-- | src/core/loader/nsp.cpp | 4 | ||||
| -rw-r--r-- | src/core/loader/nsp.h | 2 | ||||
| -rw-r--r-- | src/core/loader/xci.cpp | 4 | ||||
| -rw-r--r-- | src/core/loader/xci.h | 2 |
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 | ||
| 217 | ResultStatus 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 | |||
| 48 | private: | 50 | private: |
| 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 | |||
| 281 | protected: | 287 | protected: |
| 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 | ||
| 97 | ResultStatus 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 | |||
| 45 | private: | 47 | private: |
| 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 | |||
| 109 | ResultStatus 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 | |||
| 45 | private: | 47 | private: |
| 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 | ||
| 191 | ResultStatus 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 | |||
| 91 | private: | ||
| 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 | ||
| 186 | ResultStatus 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 | |||
| 52 | private: | 54 | private: |
| 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 | ||
| 152 | ResultStatus 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 | |||
| 52 | private: | 54 | private: |
| 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; |