diff options
| author | 2018-10-12 22:52:12 -0400 | |
|---|---|---|
| committer | 2018-10-12 22:52:12 -0400 | |
| commit | c2aa4293ec647a3712299c5b53f3ca592aaf9c0e (patch) | |
| tree | 08a703b6913733042091e16c7c90cc34d991f537 /src/core/loader/nro.cpp | |
| parent | Merge pull request #1484 from FernandoS27/calculate-size (diff) | |
| parent | kernel/process: Make CodeSet a regular non-inherited object (diff) | |
| download | yuzu-c2aa4293ec647a3712299c5b53f3ca592aaf9c0e.tar.gz yuzu-c2aa4293ec647a3712299c5b53f3ca592aaf9c0e.tar.xz yuzu-c2aa4293ec647a3712299c5b53f3ca592aaf9c0e.zip | |
Merge pull request #1483 from lioncash/codeset
kernel/process: Make CodeSet a regular non-inherited object
Diffstat (limited to 'src/core/loader/nro.cpp')
| -rw-r--r-- | src/core/loader/nro.cpp | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 25dd3f04e..576fe692a 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #include "core/file_sys/control_metadata.h" | 14 | #include "core/file_sys/control_metadata.h" |
| 15 | #include "core/file_sys/vfs_offset.h" | 15 | #include "core/file_sys/vfs_offset.h" |
| 16 | #include "core/gdbstub/gdbstub.h" | 16 | #include "core/gdbstub/gdbstub.h" |
| 17 | #include "core/hle/kernel/kernel.h" | ||
| 18 | #include "core/hle/kernel/process.h" | 17 | #include "core/hle/kernel/process.h" |
| 19 | #include "core/hle/kernel/vm_manager.h" | 18 | #include "core/hle/kernel/vm_manager.h" |
| 20 | #include "core/loader/nro.h" | 19 | #include "core/loader/nro.h" |
| @@ -139,22 +138,21 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) { | |||
| 139 | } | 138 | } |
| 140 | 139 | ||
| 141 | // Build program image | 140 | // Build program image |
| 142 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 143 | Kernel::SharedPtr<Kernel::CodeSet> codeset = Kernel::CodeSet::Create(kernel, ""); | ||
| 144 | std::vector<u8> program_image = file->ReadBytes(PageAlignSize(nro_header.file_size)); | 141 | std::vector<u8> program_image = file->ReadBytes(PageAlignSize(nro_header.file_size)); |
| 145 | if (program_image.size() != PageAlignSize(nro_header.file_size)) { | 142 | if (program_image.size() != PageAlignSize(nro_header.file_size)) { |
| 146 | return {}; | 143 | return {}; |
| 147 | } | 144 | } |
| 148 | 145 | ||
| 146 | Kernel::CodeSet codeset; | ||
| 149 | for (std::size_t i = 0; i < nro_header.segments.size(); ++i) { | 147 | for (std::size_t i = 0; i < nro_header.segments.size(); ++i) { |
| 150 | codeset->segments[i].addr = nro_header.segments[i].offset; | 148 | codeset.segments[i].addr = nro_header.segments[i].offset; |
| 151 | codeset->segments[i].offset = nro_header.segments[i].offset; | 149 | codeset.segments[i].offset = nro_header.segments[i].offset; |
| 152 | codeset->segments[i].size = PageAlignSize(nro_header.segments[i].size); | 150 | codeset.segments[i].size = PageAlignSize(nro_header.segments[i].size); |
| 153 | } | 151 | } |
| 154 | 152 | ||
| 155 | if (!Settings::values.program_args.empty()) { | 153 | if (!Settings::values.program_args.empty()) { |
| 156 | const auto arg_data = Settings::values.program_args; | 154 | const auto arg_data = Settings::values.program_args; |
| 157 | codeset->DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; | 155 | codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; |
| 158 | NSOArgumentHeader args_header{ | 156 | NSOArgumentHeader args_header{ |
| 159 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; | 157 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; |
| 160 | const auto end_offset = program_image.size(); | 158 | const auto end_offset = program_image.size(); |
| @@ -176,16 +174,15 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) { | |||
| 176 | // Resize program image to include .bss section and page align each section | 174 | // Resize program image to include .bss section and page align each section |
| 177 | bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); | 175 | bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); |
| 178 | } | 176 | } |
| 179 | codeset->DataSegment().size += bss_size; | 177 | codeset.DataSegment().size += bss_size; |
| 180 | program_image.resize(static_cast<u32>(program_image.size()) + bss_size); | 178 | program_image.resize(static_cast<u32>(program_image.size()) + bss_size); |
| 181 | 179 | ||
| 182 | // Load codeset for current process | 180 | // Load codeset for current process |
| 183 | codeset->name = file->GetName(); | 181 | codeset.memory = std::make_shared<std::vector<u8>>(std::move(program_image)); |
| 184 | codeset->memory = std::make_shared<std::vector<u8>>(std::move(program_image)); | 182 | Core::CurrentProcess()->LoadModule(std::move(codeset), load_base); |
| 185 | Core::CurrentProcess()->LoadModule(codeset, load_base); | ||
| 186 | 183 | ||
| 187 | // Register module with GDBStub | 184 | // Register module with GDBStub |
| 188 | GDBStub::RegisterModule(codeset->name, load_base, load_base); | 185 | GDBStub::RegisterModule(file->GetName(), load_base, load_base); |
| 189 | 186 | ||
| 190 | return true; | 187 | return true; |
| 191 | } | 188 | } |