diff options
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 4 | ||||
| -rw-r--r-- | src/core/loader/nro.cpp | 14 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 14 | ||||
| -rw-r--r-- | src/core/loader/nso.h | 2 |
4 files changed, 20 insertions, 14 deletions
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 61808d094..951fd8257 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp | |||
| @@ -141,8 +141,8 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(Kernel::Process& process) | |||
| 141 | const FileSys::VirtualFile module_file = dir->GetFile(module); | 141 | const FileSys::VirtualFile module_file = dir->GetFile(module); |
| 142 | if (module_file != nullptr) { | 142 | if (module_file != nullptr) { |
| 143 | const VAddr load_addr = next_load_addr; | 143 | const VAddr load_addr = next_load_addr; |
| 144 | next_load_addr = | 144 | next_load_addr = AppLoader_NSO::LoadModule(module_file, load_addr, |
| 145 | AppLoader_NSO::LoadModule(module_file, load_addr, std::strcmp(module, "rtld") == 0, pm); | 145 | std::strcmp(module, "rtld") == 0, pm); |
| 146 | LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr); | 146 | LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", module, load_addr); |
| 147 | // Register module with GDBStub | 147 | // Register module with GDBStub |
| 148 | GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false); | 148 | GDBStub::RegisterModule(module, load_addr, next_load_addr - 1, false); |
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 0d7c1dcfa..25dd3f04e 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp | |||
| @@ -154,12 +154,14 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) { | |||
| 154 | 154 | ||
| 155 | if (!Settings::values.program_args.empty()) { | 155 | if (!Settings::values.program_args.empty()) { |
| 156 | const auto arg_data = Settings::values.program_args; | 156 | const auto arg_data = Settings::values.program_args; |
| 157 | codeset->DataSegment().size += 0x9000; | 157 | codeset->DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; |
| 158 | NSOArgumentHeader args_header{0x9000, static_cast<u32_le>(arg_data.size()), {}}; | 158 | NSOArgumentHeader args_header{ |
| 159 | program_image.resize(static_cast<u32>(program_image.size()) + 0x9000); | 159 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; |
| 160 | std::memcpy(program_image.data() + program_image.size() - 0x9000, &args_header, | 160 | const auto end_offset = program_image.size(); |
| 161 | sizeof(NSOArgumentHeader)); | 161 | program_image.resize(static_cast<u32>(program_image.size()) + |
| 162 | std::memcpy(program_image.data() + program_image.size() - 0x8FE0, arg_data.data(), | 162 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE); |
| 163 | std::memcpy(program_image.data() + end_offset, &args_header, sizeof(NSOArgumentHeader)); | ||
| 164 | std::memcpy(program_image.data() + end_offset + sizeof(NSOArgumentHeader), arg_data.data(), | ||
| 163 | arg_data.size()); | 165 | arg_data.size()); |
| 164 | } | 166 | } |
| 165 | 167 | ||
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index c225e2d24..28c6dd9b7 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -129,12 +129,14 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | |||
| 129 | 129 | ||
| 130 | if (should_pass_arguments && !Settings::values.program_args.empty()) { | 130 | if (should_pass_arguments && !Settings::values.program_args.empty()) { |
| 131 | const auto arg_data = Settings::values.program_args; | 131 | const auto arg_data = Settings::values.program_args; |
| 132 | codeset->DataSegment().size += 0x9000; | 132 | codeset->DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; |
| 133 | NSOArgumentHeader args_header{0x9000, static_cast<u32_le>(arg_data.size()), {}}; | 133 | NSOArgumentHeader args_header{ |
| 134 | program_image.resize(static_cast<u32>(program_image.size()) + 0x9000); | 134 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; |
| 135 | std::memcpy(program_image.data() + program_image.size() - 0x9000, &args_header, | 135 | const auto end_offset = program_image.size(); |
| 136 | sizeof(NSOArgumentHeader)); | 136 | program_image.resize(static_cast<u32>(program_image.size()) + |
| 137 | std::memcpy(program_image.data() + program_image.size() - 0x8FE0, arg_data.data(), | 137 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE); |
| 138 | std::memcpy(program_image.data() + end_offset, &args_header, sizeof(NSOArgumentHeader)); | ||
| 139 | std::memcpy(program_image.data() + end_offset + sizeof(NSOArgumentHeader), arg_data.data(), | ||
| 138 | arg_data.size()); | 140 | arg_data.size()); |
| 139 | } | 141 | } |
| 140 | 142 | ||
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index 7833af6ee..70ab3b718 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | 11 | ||
| 12 | namespace Loader { | 12 | namespace Loader { |
| 13 | 13 | ||
| 14 | constexpr u64 NSO_ARGUMENT_DATA_ALLOCATION_SIZE = 0x9000; | ||
| 15 | |||
| 14 | struct NSOArgumentHeader { | 16 | struct NSOArgumentHeader { |
| 15 | u32_le allocated_size; | 17 | u32_le allocated_size; |
| 16 | u32_le actual_size; | 18 | u32_le actual_size; |