diff options
Diffstat (limited to 'src/core/loader/elf.cpp')
| -rw-r--r-- | src/core/loader/elf.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 00d8a82b8..ff1221574 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "core/core.h" | 12 | #include "core/core.h" |
| 13 | #include "core/hle/kernel/kernel.h" | 13 | #include "core/hle/kernel/kernel.h" |
| 14 | #include "core/hle/kernel/process.h" | 14 | #include "core/hle/kernel/process.h" |
| 15 | #include "core/hle/kernel/vm_manager.h" | ||
| 15 | #include "core/loader/elf.h" | 16 | #include "core/loader/elf.h" |
| 16 | #include "core/memory.h" | 17 | #include "core/memory.h" |
| 17 | 18 | ||
| @@ -188,7 +189,7 @@ private: | |||
| 188 | 189 | ||
| 189 | u32* sectionAddrs; | 190 | u32* sectionAddrs; |
| 190 | bool relocate; | 191 | bool relocate; |
| 191 | u32 entryPoint; | 192 | VAddr entryPoint; |
| 192 | 193 | ||
| 193 | public: | 194 | public: |
| 194 | explicit ElfReader(void* ptr); | 195 | explicit ElfReader(void* ptr); |
| @@ -204,13 +205,13 @@ public: | |||
| 204 | ElfMachine GetMachine() const { | 205 | ElfMachine GetMachine() const { |
| 205 | return (ElfMachine)(header->e_machine); | 206 | return (ElfMachine)(header->e_machine); |
| 206 | } | 207 | } |
| 207 | u32 GetEntryPoint() const { | 208 | VAddr GetEntryPoint() const { |
| 208 | return entryPoint; | 209 | return entryPoint; |
| 209 | } | 210 | } |
| 210 | u32 GetFlags() const { | 211 | u32 GetFlags() const { |
| 211 | return (u32)(header->e_flags); | 212 | return (u32)(header->e_flags); |
| 212 | } | 213 | } |
| 213 | SharedPtr<CodeSet> LoadInto(u32 vaddr); | 214 | SharedPtr<CodeSet> LoadInto(VAddr vaddr); |
| 214 | 215 | ||
| 215 | int GetNumSegments() const { | 216 | int GetNumSegments() const { |
| 216 | return (int)(header->e_phnum); | 217 | return (int)(header->e_phnum); |
| @@ -273,7 +274,7 @@ const char* ElfReader::GetSectionName(int section) const { | |||
| 273 | return nullptr; | 274 | return nullptr; |
| 274 | } | 275 | } |
| 275 | 276 | ||
| 276 | SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) { | 277 | SharedPtr<CodeSet> ElfReader::LoadInto(VAddr vaddr) { |
| 277 | LOG_DEBUG(Loader, "String section: {}", header->e_shstrndx); | 278 | LOG_DEBUG(Loader, "String section: {}", header->e_shstrndx); |
| 278 | 279 | ||
| 279 | // Should we relocate? | 280 | // Should we relocate? |
| @@ -288,11 +289,11 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) { | |||
| 288 | LOG_DEBUG(Loader, "{} segments:", header->e_phnum); | 289 | LOG_DEBUG(Loader, "{} segments:", header->e_phnum); |
| 289 | 290 | ||
| 290 | // First pass : Get the bits into RAM | 291 | // First pass : Get the bits into RAM |
| 291 | u32 base_addr = relocate ? vaddr : 0; | 292 | const VAddr base_addr = relocate ? vaddr : 0; |
| 292 | 293 | ||
| 293 | u32 total_image_size = 0; | 294 | u64 total_image_size = 0; |
| 294 | for (unsigned int i = 0; i < header->e_phnum; ++i) { | 295 | for (unsigned int i = 0; i < header->e_phnum; ++i) { |
| 295 | Elf32_Phdr* p = &segments[i]; | 296 | const Elf32_Phdr* p = &segments[i]; |
| 296 | if (p->p_type == PT_LOAD) { | 297 | if (p->p_type == PT_LOAD) { |
| 297 | total_image_size += (p->p_memsz + 0xFFF) & ~0xFFF; | 298 | total_image_size += (p->p_memsz + 0xFFF) & ~0xFFF; |
| 298 | } | 299 | } |
| @@ -305,7 +306,7 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) { | |||
| 305 | SharedPtr<CodeSet> codeset = CodeSet::Create(kernel, ""); | 306 | SharedPtr<CodeSet> codeset = CodeSet::Create(kernel, ""); |
| 306 | 307 | ||
| 307 | for (unsigned int i = 0; i < header->e_phnum; ++i) { | 308 | for (unsigned int i = 0; i < header->e_phnum; ++i) { |
| 308 | Elf32_Phdr* p = &segments[i]; | 309 | const Elf32_Phdr* p = &segments[i]; |
| 309 | LOG_DEBUG(Loader, "Type: {} Vaddr: {:08X} Filesz: {:08X} Memsz: {:08X} ", p->p_type, | 310 | LOG_DEBUG(Loader, "Type: {} Vaddr: {:08X} Filesz: {:08X} Memsz: {:08X} ", p->p_type, |
| 310 | p->p_vaddr, p->p_filesz, p->p_memsz); | 311 | p->p_vaddr, p->p_filesz, p->p_memsz); |
| 311 | 312 | ||
| @@ -332,8 +333,8 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) { | |||
| 332 | continue; | 333 | continue; |
| 333 | } | 334 | } |
| 334 | 335 | ||
| 335 | u32 segment_addr = base_addr + p->p_vaddr; | 336 | const VAddr segment_addr = base_addr + p->p_vaddr; |
| 336 | u32 aligned_size = (p->p_memsz + 0xFFF) & ~0xFFF; | 337 | const u32 aligned_size = (p->p_memsz + 0xFFF) & ~0xFFF; |
| 337 | 338 | ||
| 338 | codeset_segment->offset = current_image_position; | 339 | codeset_segment->offset = current_image_position; |
| 339 | codeset_segment->addr = segment_addr; | 340 | codeset_segment->addr = segment_addr; |
| @@ -394,8 +395,9 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 394 | if (buffer.size() != file->GetSize()) | 395 | if (buffer.size() != file->GetSize()) |
| 395 | return ResultStatus::ErrorIncorrectELFFileSize; | 396 | return ResultStatus::ErrorIncorrectELFFileSize; |
| 396 | 397 | ||
| 398 | const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); | ||
| 397 | ElfReader elf_reader(&buffer[0]); | 399 | ElfReader elf_reader(&buffer[0]); |
| 398 | SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR); | 400 | SharedPtr<CodeSet> codeset = elf_reader.LoadInto(base_address); |
| 399 | codeset->name = file->GetName(); | 401 | codeset->name = file->GetName(); |
| 400 | 402 | ||
| 401 | process->LoadModule(codeset, codeset->entrypoint); | 403 | process->LoadModule(codeset, codeset->entrypoint); |