diff options
| author | 2018-10-02 17:03:34 -0400 | |
|---|---|---|
| committer | 2018-10-02 17:03:38 -0400 | |
| commit | 215b65fe75810b72bb76ae8dbb75ea59ac16f13f (patch) | |
| tree | da57983b31917f55694d17e5fec0bab8dc0877fc /src/core/loader | |
| parent | deconstructed_rom_directory: Force NSO loader to patch NSOs (diff) | |
| download | yuzu-215b65fe75810b72bb76ae8dbb75ea59ac16f13f.tar.gz yuzu-215b65fe75810b72bb76ae8dbb75ea59ac16f13f.tar.xz yuzu-215b65fe75810b72bb76ae8dbb75ea59ac16f13f.zip | |
nso: Optimize loading of IPS patches
Avoid resource-heavy classes and remove quasi-duplicated code.
Diffstat (limited to 'src/core/loader')
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 5 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 4 | ||||
| -rw-r--r-- | src/core/loader/nso.h | 2 |
3 files changed, 5 insertions, 6 deletions
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 338f6b01b..9a86e5824 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp | |||
| @@ -130,6 +130,7 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(Kernel::Process& process) | |||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | process.LoadFromMetadata(metadata); | 132 | process.LoadFromMetadata(metadata); |
| 133 | const FileSys::PatchManager pm(metadata.GetTitleID()); | ||
| 133 | 134 | ||
| 134 | // Load NSO modules | 135 | // Load NSO modules |
| 135 | const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress(); | 136 | const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress(); |
| @@ -139,9 +140,7 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(Kernel::Process& process) | |||
| 139 | const FileSys::VirtualFile module_file = dir->GetFile(module); | 140 | const FileSys::VirtualFile module_file = dir->GetFile(module); |
| 140 | if (module_file != nullptr) { | 141 | if (module_file != nullptr) { |
| 141 | const VAddr load_addr = next_load_addr; | 142 | const VAddr load_addr = next_load_addr; |
| 142 | next_load_addr = AppLoader_NSO::LoadModule( | 143 | next_load_addr = AppLoader_NSO::LoadModule(module_file, load_addr, pm); |
| 143 | module_file, load_addr, | ||
| 144 | std::make_shared<FileSys::PatchManager>(metadata.GetTitleID())); | ||
| 145 | LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr); | 144 | LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr); |
| 146 | // Register module with GDBStub | 145 | // Register module with GDBStub |
| 147 | GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false); | 146 | GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false); |
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index d22a88af1..2186b02af 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -94,7 +94,7 @@ static constexpr u32 PageAlignSize(u32 size) { | |||
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | 96 | VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, |
| 97 | std::shared_ptr<FileSys::PatchManager> pm) { | 97 | boost::optional<FileSys::PatchManager> pm) { |
| 98 | if (file == nullptr) | 98 | if (file == nullptr) |
| 99 | return {}; | 99 | return {}; |
| 100 | 100 | ||
| @@ -144,7 +144,7 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | |||
| 144 | program_image.resize(image_size); | 144 | program_image.resize(image_size); |
| 145 | 145 | ||
| 146 | // Apply patches if necessary | 146 | // Apply patches if necessary |
| 147 | if (pm != nullptr && pm->HasNSOPatch(nso_header.build_id)) { | 147 | if (pm != boost::none && pm->HasNSOPatch(nso_header.build_id)) { |
| 148 | std::vector<u8> pi_header(program_image.size() + 0x100); | 148 | std::vector<u8> pi_header(program_image.size() + 0x100); |
| 149 | std::memcpy(pi_header.data(), &nso_header, sizeof(NsoHeader)); | 149 | std::memcpy(pi_header.data(), &nso_header, sizeof(NsoHeader)); |
| 150 | std::memcpy(pi_header.data() + 0x100, program_image.data(), program_image.size()); | 150 | std::memcpy(pi_header.data() + 0x100, program_image.data(), program_image.size()); |
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index 7c26aa4ba..05353d4d9 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h | |||
| @@ -28,7 +28,7 @@ public: | |||
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base, | 30 | static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base, |
| 31 | std::shared_ptr<FileSys::PatchManager> pm = nullptr); | 31 | boost::optional<FileSys::PatchManager> pm = boost::none); |
| 32 | 32 | ||
| 33 | ResultStatus Load(Kernel::Process& process) override; | 33 | ResultStatus Load(Kernel::Process& process) override; |
| 34 | }; | 34 | }; |