summaryrefslogtreecommitdiff
path: root/src/core/loader/nro.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-10-12 22:52:12 -0400
committerGravatar GitHub2018-10-12 22:52:12 -0400
commitc2aa4293ec647a3712299c5b53f3ca592aaf9c0e (patch)
tree08a703b6913733042091e16c7c90cc34d991f537 /src/core/loader/nro.cpp
parentMerge pull request #1484 from FernandoS27/calculate-size (diff)
parentkernel/process: Make CodeSet a regular non-inherited object (diff)
downloadyuzu-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.cpp21
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}