diff options
| author | 2018-09-21 14:39:30 +1000 | |
|---|---|---|
| committer | 2018-09-21 00:39:30 -0400 | |
| commit | 1db1e013e0f8f3383e486d4f47d88d1bdb6e2769 (patch) | |
| tree | 419c4550b7362c9b247fb1531738888e1d3294ae /src | |
| parent | Merge pull request #1225 from tech4me/travis-windows (diff) | |
| download | yuzu-1db1e013e0f8f3383e486d4f47d88d1bdb6e2769.tar.gz yuzu-1db1e013e0f8f3383e486d4f47d88d1bdb6e2769.tar.xz yuzu-1db1e013e0f8f3383e486d4f47d88d1bdb6e2769.zip | |
Added support for uncompressed NSOs (#1374)
* Added support for uncompressed NSOs
* Moved compressed section check to NsoHeader
Diffstat (limited to '')
| -rw-r--r-- | src/core/loader/nso.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 3c6306818..78a4438c4 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -32,11 +32,18 @@ static_assert(sizeof(NsoSegmentHeader) == 0x10, "NsoSegmentHeader has incorrect | |||
| 32 | 32 | ||
| 33 | struct NsoHeader { | 33 | struct NsoHeader { |
| 34 | u32_le magic; | 34 | u32_le magic; |
| 35 | INSERT_PADDING_BYTES(0xc); | 35 | u32_le version; |
| 36 | INSERT_PADDING_WORDS(1); | ||
| 37 | u8 flags; | ||
| 36 | std::array<NsoSegmentHeader, 3> segments; // Text, RoData, Data (in that order) | 38 | std::array<NsoSegmentHeader, 3> segments; // Text, RoData, Data (in that order) |
| 37 | u32_le bss_size; | 39 | u32_le bss_size; |
| 38 | INSERT_PADDING_BYTES(0x1c); | 40 | INSERT_PADDING_BYTES(0x1c); |
| 39 | std::array<u32_le, 3> segments_compressed_size; | 41 | std::array<u32_le, 3> segments_compressed_size; |
| 42 | |||
| 43 | bool IsSegmentCompressed(size_t segment_num) const { | ||
| 44 | ASSERT_MSG(segment_num < 3, "Invalid segment {}", segment_num); | ||
| 45 | return ((flags >> segment_num) & 1); | ||
| 46 | } | ||
| 40 | }; | 47 | }; |
| 41 | static_assert(sizeof(NsoHeader) == 0x6c, "NsoHeader has incorrect size."); | 48 | static_assert(sizeof(NsoHeader) == 0x6c, "NsoHeader has incorrect size."); |
| 42 | static_assert(std::is_trivially_copyable_v<NsoHeader>, "NsoHeader isn't trivially copyable."); | 49 | static_assert(std::is_trivially_copyable_v<NsoHeader>, "NsoHeader isn't trivially copyable."); |
| @@ -105,9 +112,11 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) { | |||
| 105 | Kernel::SharedPtr<Kernel::CodeSet> codeset = Kernel::CodeSet::Create(kernel, ""); | 112 | Kernel::SharedPtr<Kernel::CodeSet> codeset = Kernel::CodeSet::Create(kernel, ""); |
| 106 | std::vector<u8> program_image; | 113 | std::vector<u8> program_image; |
| 107 | for (std::size_t i = 0; i < nso_header.segments.size(); ++i) { | 114 | for (std::size_t i = 0; i < nso_header.segments.size(); ++i) { |
| 108 | const std::vector<u8> compressed_data = | 115 | std::vector<u8> data = |
| 109 | file->ReadBytes(nso_header.segments_compressed_size[i], nso_header.segments[i].offset); | 116 | file->ReadBytes(nso_header.segments_compressed_size[i], nso_header.segments[i].offset); |
| 110 | std::vector<u8> data = DecompressSegment(compressed_data, nso_header.segments[i]); | 117 | if (nso_header.IsSegmentCompressed(i)) { |
| 118 | data = DecompressSegment(data, nso_header.segments[i]); | ||
| 119 | } | ||
| 111 | program_image.resize(nso_header.segments[i].location); | 120 | program_image.resize(nso_header.segments[i].location); |
| 112 | program_image.insert(program_image.end(), data.begin(), data.end()); | 121 | program_image.insert(program_image.end(), data.begin(), data.end()); |
| 113 | codeset->segments[i].addr = nso_header.segments[i].location; | 122 | codeset->segments[i].addr = nso_header.segments[i].location; |