From 3c9e70fefae0754c7484484fc8f58011e5b14aaa Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 29 Sep 2018 22:12:53 -0400 Subject: nso: Replace NSOHeader padding bytes with build ID --- src/core/loader/nso.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/core/loader/nso.cpp') diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index cbe2a3e53..512954d40 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -36,8 +36,7 @@ struct NsoHeader { INSERT_PADDING_WORDS(1); u8 flags; std::array segments; // Text, RoData, Data (in that order) - u32_le bss_size; - INSERT_PADDING_BYTES(0x1c); + std::array build_id; std::array segments_compressed_size; bool IsSegmentCompressed(size_t segment_num) const { -- cgit v1.2.3 From 003b44822a309c0ef57fc6dd41e401e18ecb92bf Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 29 Sep 2018 22:16:09 -0400 Subject: nso: Add framework to support patching of uncompressed NSOs --- src/core/loader/nso.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src/core/loader/nso.cpp') diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 512954d40..d22a88af1 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -10,6 +10,7 @@ #include "common/logging/log.h" #include "common/swap.h" #include "core/core.h" +#include "core/file_sys/patch_manager.h" #include "core/gdbstub/gdbstub.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" @@ -92,7 +93,8 @@ static constexpr u32 PageAlignSize(u32 size) { return (size + Memory::PAGE_MASK) & ~Memory::PAGE_MASK; } -VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) { +VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, + std::shared_ptr pm) { if (file == nullptr) return {}; @@ -141,6 +143,17 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) { const u32 image_size{PageAlignSize(static_cast(program_image.size()) + bss_size)}; program_image.resize(image_size); + // Apply patches if necessary + if (pm != nullptr && pm->HasNSOPatch(nso_header.build_id)) { + std::vector pi_header(program_image.size() + 0x100); + std::memcpy(pi_header.data(), &nso_header, sizeof(NsoHeader)); + std::memcpy(pi_header.data() + 0x100, program_image.data(), program_image.size()); + + pi_header = pm->PatchNSO(pi_header); + + std::memcpy(program_image.data(), pi_header.data() + 0x100, program_image.size()); + } + // Load codeset for current process codeset->name = file->GetName(); codeset->memory = std::make_shared>(std::move(program_image)); -- cgit v1.2.3 From 215b65fe75810b72bb76ae8dbb75ea59ac16f13f Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Tue, 2 Oct 2018 17:03:34 -0400 Subject: nso: Optimize loading of IPS patches Avoid resource-heavy classes and remove quasi-duplicated code. --- src/core/loader/nso.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/loader/nso.cpp') 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) { } VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, - std::shared_ptr pm) { + boost::optional pm) { if (file == nullptr) return {}; @@ -144,7 +144,7 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, program_image.resize(image_size); // Apply patches if necessary - if (pm != nullptr && pm->HasNSOPatch(nso_header.build_id)) { + if (pm != boost::none && pm->HasNSOPatch(nso_header.build_id)) { std::vector pi_header(program_image.size() + 0x100); std::memcpy(pi_header.data(), &nso_header, sizeof(NsoHeader)); std::memcpy(pi_header.data() + 0x100, program_image.data(), program_image.size()); -- cgit v1.2.3