diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/loader/nso.cpp | 11 | ||||
| -rw-r--r-- | src/core/loader/nso.h | 2 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 515c5accb..044067a5b 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -97,7 +97,8 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, | |||
| 97 | if (nso_header.IsSegmentCompressed(i)) { | 97 | if (nso_header.IsSegmentCompressed(i)) { |
| 98 | data = DecompressSegment(data, nso_header.segments[i]); | 98 | data = DecompressSegment(data, nso_header.segments[i]); |
| 99 | } | 99 | } |
| 100 | program_image.resize(nso_header.segments[i].location + data.size()); | 100 | program_image.resize(nso_header.segments[i].location + |
| 101 | PageAlignSize(static_cast<u32>(data.size()))); | ||
| 101 | std::memcpy(program_image.data() + nso_header.segments[i].location, data.data(), | 102 | std::memcpy(program_image.data() + nso_header.segments[i].location, data.data(), |
| 102 | data.size()); | 103 | data.size()); |
| 103 | codeset.segments[i].addr = nso_header.segments[i].location; | 104 | codeset.segments[i].addr = nso_header.segments[i].location; |
| @@ -105,8 +106,12 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process, | |||
| 105 | codeset.segments[i].size = PageAlignSize(static_cast<u32>(data.size())); | 106 | codeset.segments[i].size = PageAlignSize(static_cast<u32>(data.size())); |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | if (should_pass_arguments && !Settings::values.program_args.empty()) { | 109 | if (should_pass_arguments) { |
| 109 | const auto arg_data = Settings::values.program_args; | 110 | std::vector<u8> arg_data{Settings::values.program_args.begin(), |
| 111 | Settings::values.program_args.end()}; | ||
| 112 | if (arg_data.empty()) { | ||
| 113 | arg_data.resize(NSO_ARGUMENT_DEFAULT_SIZE); | ||
| 114 | } | ||
| 110 | codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; | 115 | codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; |
| 111 | NSOArgumentHeader args_header{ | 116 | NSOArgumentHeader args_header{ |
| 112 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; | 117 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; |
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index 58cbe162d..d2d600cd9 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h | |||
| @@ -56,6 +56,8 @@ static_assert(sizeof(NSOHeader) == 0x100, "NSOHeader has incorrect size."); | |||
| 56 | static_assert(std::is_trivially_copyable_v<NSOHeader>, "NSOHeader must be trivially copyable."); | 56 | static_assert(std::is_trivially_copyable_v<NSOHeader>, "NSOHeader must be trivially copyable."); |
| 57 | 57 | ||
| 58 | constexpr u64 NSO_ARGUMENT_DATA_ALLOCATION_SIZE = 0x9000; | 58 | constexpr u64 NSO_ARGUMENT_DATA_ALLOCATION_SIZE = 0x9000; |
| 59 | // NOTE: Official software default argument state is unverified. | ||
| 60 | constexpr u64 NSO_ARGUMENT_DEFAULT_SIZE = 1; | ||
| 59 | 61 | ||
| 60 | struct NSOArgumentHeader { | 62 | struct NSOArgumentHeader { |
| 61 | u32_le allocated_size; | 63 | u32_le allocated_size; |