diff options
| -rw-r--r-- | src/core/hle/kernel/object.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/object.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 24 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 28 | ||||
| -rw-r--r-- | src/core/loader/elf.cpp | 32 | ||||
| -rw-r--r-- | src/core/loader/nro.cpp | 21 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 21 |
7 files changed, 45 insertions, 83 deletions
diff --git a/src/core/hle/kernel/object.cpp b/src/core/hle/kernel/object.cpp index d51562d92..d87a62bb9 100644 --- a/src/core/hle/kernel/object.cpp +++ b/src/core/hle/kernel/object.cpp | |||
| @@ -25,7 +25,6 @@ bool Object::IsWaitable() const { | |||
| 25 | case HandleType::Process: | 25 | case HandleType::Process: |
| 26 | case HandleType::AddressArbiter: | 26 | case HandleType::AddressArbiter: |
| 27 | case HandleType::ResourceLimit: | 27 | case HandleType::ResourceLimit: |
| 28 | case HandleType::CodeSet: | ||
| 29 | case HandleType::ClientPort: | 28 | case HandleType::ClientPort: |
| 30 | case HandleType::ClientSession: | 29 | case HandleType::ClientSession: |
| 31 | return false; | 30 | return false; |
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index 9eb72315c..c9f4d0bb3 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h | |||
| @@ -26,7 +26,6 @@ enum class HandleType : u32 { | |||
| 26 | AddressArbiter, | 26 | AddressArbiter, |
| 27 | Timer, | 27 | Timer, |
| 28 | ResourceLimit, | 28 | ResourceLimit, |
| 29 | CodeSet, | ||
| 30 | ClientPort, | 29 | ClientPort, |
| 31 | ServerPort, | 30 | ServerPort, |
| 32 | ClientSession, | 31 | ClientSession, |
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index fb0027a71..c80b2c507 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -20,13 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | namespace Kernel { | 21 | namespace Kernel { |
| 22 | 22 | ||
| 23 | SharedPtr<CodeSet> CodeSet::Create(KernelCore& kernel, std::string name) { | 23 | CodeSet::CodeSet() = default; |
| 24 | SharedPtr<CodeSet> codeset(new CodeSet(kernel)); | ||
| 25 | codeset->name = std::move(name); | ||
| 26 | return codeset; | ||
| 27 | } | ||
| 28 | |||
| 29 | CodeSet::CodeSet(KernelCore& kernel) : Object{kernel} {} | ||
| 30 | CodeSet::~CodeSet() = default; | 24 | CodeSet::~CodeSet() = default; |
| 31 | 25 | ||
| 32 | SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) { | 26 | SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) { |
| @@ -224,20 +218,20 @@ void Process::FreeTLSSlot(VAddr tls_address) { | |||
| 224 | tls_slots[tls_page].reset(tls_slot); | 218 | tls_slots[tls_page].reset(tls_slot); |
| 225 | } | 219 | } |
| 226 | 220 | ||
| 227 | void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { | 221 | void Process::LoadModule(CodeSet module_, VAddr base_addr) { |
| 228 | const auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, | 222 | const auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, |
| 229 | MemoryState memory_state) { | 223 | MemoryState memory_state) { |
| 230 | auto vma = vm_manager | 224 | const auto vma = vm_manager |
| 231 | .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset, | 225 | .MapMemoryBlock(segment.addr + base_addr, module_.memory, |
| 232 | segment.size, memory_state) | 226 | segment.offset, segment.size, memory_state) |
| 233 | .Unwrap(); | 227 | .Unwrap(); |
| 234 | vm_manager.Reprotect(vma, permissions); | 228 | vm_manager.Reprotect(vma, permissions); |
| 235 | }; | 229 | }; |
| 236 | 230 | ||
| 237 | // Map CodeSet segments | 231 | // Map CodeSet segments |
| 238 | MapSegment(module_->CodeSegment(), VMAPermission::ReadExecute, MemoryState::CodeStatic); | 232 | MapSegment(module_.CodeSegment(), VMAPermission::ReadExecute, MemoryState::CodeStatic); |
| 239 | MapSegment(module_->RODataSegment(), VMAPermission::Read, MemoryState::CodeMutable); | 233 | MapSegment(module_.RODataSegment(), VMAPermission::Read, MemoryState::CodeMutable); |
| 240 | MapSegment(module_->DataSegment(), VMAPermission::ReadWrite, MemoryState::CodeMutable); | 234 | MapSegment(module_.DataSegment(), VMAPermission::ReadWrite, MemoryState::CodeMutable); |
| 241 | } | 235 | } |
| 242 | 236 | ||
| 243 | ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { | 237 | ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { |
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index 590e0c73d..73ec01e11 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h | |||
| @@ -61,26 +61,15 @@ enum class ProcessStatus { Created, Running, Exited }; | |||
| 61 | 61 | ||
| 62 | class ResourceLimit; | 62 | class ResourceLimit; |
| 63 | 63 | ||
| 64 | struct CodeSet final : public Object { | 64 | struct CodeSet final { |
| 65 | struct Segment { | 65 | struct Segment { |
| 66 | std::size_t offset = 0; | 66 | std::size_t offset = 0; |
| 67 | VAddr addr = 0; | 67 | VAddr addr = 0; |
| 68 | u32 size = 0; | 68 | u32 size = 0; |
| 69 | }; | 69 | }; |
| 70 | 70 | ||
| 71 | static SharedPtr<CodeSet> Create(KernelCore& kernel, std::string name); | 71 | explicit CodeSet(); |
| 72 | 72 | ~CodeSet(); | |
| 73 | std::string GetTypeName() const override { | ||
| 74 | return "CodeSet"; | ||
| 75 | } | ||
| 76 | std::string GetName() const override { | ||
| 77 | return name; | ||
| 78 | } | ||
| 79 | |||
| 80 | static const HandleType HANDLE_TYPE = HandleType::CodeSet; | ||
| 81 | HandleType GetHandleType() const override { | ||
| 82 | return HANDLE_TYPE; | ||
| 83 | } | ||
| 84 | 73 | ||
| 85 | Segment& CodeSegment() { | 74 | Segment& CodeSegment() { |
| 86 | return segments[0]; | 75 | return segments[0]; |
| @@ -109,14 +98,7 @@ struct CodeSet final : public Object { | |||
| 109 | std::shared_ptr<std::vector<u8>> memory; | 98 | std::shared_ptr<std::vector<u8>> memory; |
| 110 | 99 | ||
| 111 | std::array<Segment, 3> segments; | 100 | std::array<Segment, 3> segments; |
| 112 | VAddr entrypoint; | 101 | VAddr entrypoint = 0; |
| 113 | |||
| 114 | /// Name of the process | ||
| 115 | std::string name; | ||
| 116 | |||
| 117 | private: | ||
| 118 | explicit CodeSet(KernelCore& kernel); | ||
| 119 | ~CodeSet() override; | ||
| 120 | }; | 102 | }; |
| 121 | 103 | ||
| 122 | class Process final : public Object { | 104 | class Process final : public Object { |
| @@ -219,7 +201,7 @@ public: | |||
| 219 | */ | 201 | */ |
| 220 | void PrepareForTermination(); | 202 | void PrepareForTermination(); |
| 221 | 203 | ||
| 222 | void LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr); | 204 | void LoadModule(CodeSet module_, VAddr base_addr); |
| 223 | 205 | ||
| 224 | /////////////////////////////////////////////////////////////////////////////////////////////// | 206 | /////////////////////////////////////////////////////////////////////////////////////////////// |
| 225 | // Memory Management | 207 | // Memory Management |
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index e67b49fc9..6057c7f26 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp | |||
| @@ -9,16 +9,11 @@ | |||
| 9 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
| 10 | #include "common/file_util.h" | 10 | #include "common/file_util.h" |
| 11 | #include "common/logging/log.h" | 11 | #include "common/logging/log.h" |
| 12 | #include "core/core.h" | ||
| 13 | #include "core/hle/kernel/kernel.h" | ||
| 14 | #include "core/hle/kernel/process.h" | 12 | #include "core/hle/kernel/process.h" |
| 15 | #include "core/hle/kernel/vm_manager.h" | 13 | #include "core/hle/kernel/vm_manager.h" |
| 16 | #include "core/loader/elf.h" | 14 | #include "core/loader/elf.h" |
| 17 | #include "core/memory.h" | 15 | #include "core/memory.h" |
| 18 | 16 | ||
| 19 | using Kernel::CodeSet; | ||
| 20 | using Kernel::SharedPtr; | ||
| 21 | |||
| 22 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 17 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
| 23 | // ELF Header Constants | 18 | // ELF Header Constants |
| 24 | 19 | ||
| @@ -211,7 +206,7 @@ public: | |||
| 211 | u32 GetFlags() const { | 206 | u32 GetFlags() const { |
| 212 | return (u32)(header->e_flags); | 207 | return (u32)(header->e_flags); |
| 213 | } | 208 | } |
| 214 | SharedPtr<CodeSet> LoadInto(VAddr vaddr); | 209 | Kernel::CodeSet LoadInto(VAddr vaddr); |
| 215 | 210 | ||
| 216 | int GetNumSegments() const { | 211 | int GetNumSegments() const { |
| 217 | return (int)(header->e_phnum); | 212 | return (int)(header->e_phnum); |
| @@ -274,7 +269,7 @@ const char* ElfReader::GetSectionName(int section) const { | |||
| 274 | return nullptr; | 269 | return nullptr; |
| 275 | } | 270 | } |
| 276 | 271 | ||
| 277 | SharedPtr<CodeSet> ElfReader::LoadInto(VAddr vaddr) { | 272 | Kernel::CodeSet ElfReader::LoadInto(VAddr vaddr) { |
| 278 | LOG_DEBUG(Loader, "String section: {}", header->e_shstrndx); | 273 | LOG_DEBUG(Loader, "String section: {}", header->e_shstrndx); |
| 279 | 274 | ||
| 280 | // Should we relocate? | 275 | // Should we relocate? |
| @@ -302,8 +297,7 @@ SharedPtr<CodeSet> ElfReader::LoadInto(VAddr vaddr) { | |||
| 302 | std::vector<u8> program_image(total_image_size); | 297 | std::vector<u8> program_image(total_image_size); |
| 303 | std::size_t current_image_position = 0; | 298 | std::size_t current_image_position = 0; |
| 304 | 299 | ||
| 305 | auto& kernel = Core::System::GetInstance().Kernel(); | 300 | Kernel::CodeSet codeset; |
| 306 | SharedPtr<CodeSet> codeset = CodeSet::Create(kernel, ""); | ||
| 307 | 301 | ||
| 308 | for (unsigned int i = 0; i < header->e_phnum; ++i) { | 302 | for (unsigned int i = 0; i < header->e_phnum; ++i) { |
| 309 | const Elf32_Phdr* p = &segments[i]; | 303 | const Elf32_Phdr* p = &segments[i]; |
| @@ -311,14 +305,14 @@ SharedPtr<CodeSet> ElfReader::LoadInto(VAddr vaddr) { | |||
| 311 | p->p_vaddr, p->p_filesz, p->p_memsz); | 305 | p->p_vaddr, p->p_filesz, p->p_memsz); |
| 312 | 306 | ||
| 313 | if (p->p_type == PT_LOAD) { | 307 | if (p->p_type == PT_LOAD) { |
| 314 | CodeSet::Segment* codeset_segment; | 308 | Kernel::CodeSet::Segment* codeset_segment; |
| 315 | u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X); | 309 | u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X); |
| 316 | if (permission_flags == (PF_R | PF_X)) { | 310 | if (permission_flags == (PF_R | PF_X)) { |
| 317 | codeset_segment = &codeset->CodeSegment(); | 311 | codeset_segment = &codeset.CodeSegment(); |
| 318 | } else if (permission_flags == (PF_R)) { | 312 | } else if (permission_flags == (PF_R)) { |
| 319 | codeset_segment = &codeset->RODataSegment(); | 313 | codeset_segment = &codeset.RODataSegment(); |
| 320 | } else if (permission_flags == (PF_R | PF_W)) { | 314 | } else if (permission_flags == (PF_R | PF_W)) { |
| 321 | codeset_segment = &codeset->DataSegment(); | 315 | codeset_segment = &codeset.DataSegment(); |
| 322 | } else { | 316 | } else { |
| 323 | LOG_ERROR(Loader, "Unexpected ELF PT_LOAD segment id {} with flags {:X}", i, | 317 | LOG_ERROR(Loader, "Unexpected ELF PT_LOAD segment id {} with flags {:X}", i, |
| 324 | p->p_flags); | 318 | p->p_flags); |
| @@ -345,8 +339,8 @@ SharedPtr<CodeSet> ElfReader::LoadInto(VAddr vaddr) { | |||
| 345 | } | 339 | } |
| 346 | } | 340 | } |
| 347 | 341 | ||
| 348 | codeset->entrypoint = base_addr + header->e_entry; | 342 | codeset.entrypoint = base_addr + header->e_entry; |
| 349 | codeset->memory = std::make_shared<std::vector<u8>>(std::move(program_image)); | 343 | codeset.memory = std::make_shared<std::vector<u8>>(std::move(program_image)); |
| 350 | 344 | ||
| 351 | LOG_DEBUG(Loader, "Done loading."); | 345 | LOG_DEBUG(Loader, "Done loading."); |
| 352 | 346 | ||
| @@ -397,11 +391,11 @@ ResultStatus AppLoader_ELF::Load(Kernel::Process& process) { | |||
| 397 | 391 | ||
| 398 | const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress(); | 392 | const VAddr base_address = process.VMManager().GetCodeRegionBaseAddress(); |
| 399 | ElfReader elf_reader(&buffer[0]); | 393 | ElfReader elf_reader(&buffer[0]); |
| 400 | SharedPtr<CodeSet> codeset = elf_reader.LoadInto(base_address); | 394 | Kernel::CodeSet codeset = elf_reader.LoadInto(base_address); |
| 401 | codeset->name = file->GetName(); | 395 | const VAddr entry_point = codeset.entrypoint; |
| 402 | 396 | ||
| 403 | process.LoadModule(codeset, codeset->entrypoint); | 397 | process.LoadModule(std::move(codeset), entry_point); |
| 404 | process.Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE); | 398 | process.Run(entry_point, 48, Memory::DEFAULT_STACK_SIZE); |
| 405 | 399 | ||
| 406 | is_loaded = true; | 400 | is_loaded = true; |
| 407 | return ResultStatus::Success; | 401 | return ResultStatus::Success; |
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 | } |
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 28c6dd9b7..ba57db9bf 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include "core/core.h" | 12 | #include "core/core.h" |
| 13 | #include "core/file_sys/patch_manager.h" | 13 | #include "core/file_sys/patch_manager.h" |
| 14 | #include "core/gdbstub/gdbstub.h" | 14 | #include "core/gdbstub/gdbstub.h" |
| 15 | #include "core/hle/kernel/kernel.h" | ||
| 16 | #include "core/hle/kernel/process.h" | 15 | #include "core/hle/kernel/process.h" |
| 17 | #include "core/hle/kernel/vm_manager.h" | 16 | #include "core/hle/kernel/vm_manager.h" |
| 18 | #include "core/loader/nso.h" | 17 | #include "core/loader/nso.h" |
| @@ -111,8 +110,7 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | |||
| 111 | return {}; | 110 | return {}; |
| 112 | 111 | ||
| 113 | // Build program image | 112 | // Build program image |
| 114 | auto& kernel = Core::System::GetInstance().Kernel(); | 113 | Kernel::CodeSet codeset; |
| 115 | Kernel::SharedPtr<Kernel::CodeSet> codeset = Kernel::CodeSet::Create(kernel, ""); | ||
| 116 | std::vector<u8> program_image; | 114 | std::vector<u8> program_image; |
| 117 | for (std::size_t i = 0; i < nso_header.segments.size(); ++i) { | 115 | for (std::size_t i = 0; i < nso_header.segments.size(); ++i) { |
| 118 | std::vector<u8> data = | 116 | std::vector<u8> data = |
| @@ -122,14 +120,14 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | |||
| 122 | } | 120 | } |
| 123 | program_image.resize(nso_header.segments[i].location); | 121 | program_image.resize(nso_header.segments[i].location); |
| 124 | program_image.insert(program_image.end(), data.begin(), data.end()); | 122 | program_image.insert(program_image.end(), data.begin(), data.end()); |
| 125 | codeset->segments[i].addr = nso_header.segments[i].location; | 123 | codeset.segments[i].addr = nso_header.segments[i].location; |
| 126 | codeset->segments[i].offset = nso_header.segments[i].location; | 124 | codeset.segments[i].offset = nso_header.segments[i].location; |
| 127 | codeset->segments[i].size = PageAlignSize(static_cast<u32>(data.size())); | 125 | codeset.segments[i].size = PageAlignSize(static_cast<u32>(data.size())); |
| 128 | } | 126 | } |
| 129 | 127 | ||
| 130 | if (should_pass_arguments && !Settings::values.program_args.empty()) { | 128 | if (should_pass_arguments && !Settings::values.program_args.empty()) { |
| 131 | const auto arg_data = Settings::values.program_args; | 129 | const auto arg_data = Settings::values.program_args; |
| 132 | codeset->DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; | 130 | codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE; |
| 133 | NSOArgumentHeader args_header{ | 131 | NSOArgumentHeader args_header{ |
| 134 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; | 132 | NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}}; |
| 135 | const auto end_offset = program_image.size(); | 133 | const auto end_offset = program_image.size(); |
| @@ -154,7 +152,7 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | |||
| 154 | // Resize program image to include .bss section and page align each section | 152 | // Resize program image to include .bss section and page align each section |
| 155 | bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); | 153 | bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); |
| 156 | } | 154 | } |
| 157 | codeset->DataSegment().size += bss_size; | 155 | codeset.DataSegment().size += bss_size; |
| 158 | const u32 image_size{PageAlignSize(static_cast<u32>(program_image.size()) + bss_size)}; | 156 | const u32 image_size{PageAlignSize(static_cast<u32>(program_image.size()) + bss_size)}; |
| 159 | program_image.resize(image_size); | 157 | program_image.resize(image_size); |
| 160 | 158 | ||
| @@ -170,12 +168,11 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, | |||
| 170 | } | 168 | } |
| 171 | 169 | ||
| 172 | // Load codeset for current process | 170 | // Load codeset for current process |
| 173 | codeset->name = file->GetName(); | 171 | codeset.memory = std::make_shared<std::vector<u8>>(std::move(program_image)); |
| 174 | codeset->memory = std::make_shared<std::vector<u8>>(std::move(program_image)); | 172 | Core::CurrentProcess()->LoadModule(std::move(codeset), load_base); |
| 175 | Core::CurrentProcess()->LoadModule(codeset, load_base); | ||
| 176 | 173 | ||
| 177 | // Register module with GDBStub | 174 | // Register module with GDBStub |
| 178 | GDBStub::RegisterModule(codeset->name, load_base, load_base); | 175 | GDBStub::RegisterModule(file->GetName(), load_base, load_base); |
| 179 | 176 | ||
| 180 | return load_base + image_size; | 177 | return load_base + image_size; |
| 181 | } | 178 | } |