summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Boot/ElfReader.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/Source/Core/Core/Boot/ElfReader.cpp b/Source/Core/Core/Boot/ElfReader.cpp
index f667387ab3..1ef3cd6f6d 100644
--- a/Source/Core/Core/Boot/ElfReader.cpp
+++ b/Source/Core/Core/Boot/ElfReader.cpp
@@ -143,17 +143,23 @@ bool ElfReader::LoadIntoMemory(Core::System& system, bool only_in_mem1) const
{
Elf32_Phdr* p = segments + i;
- INFO_LOG_FMT(BOOT, "Type: {} Vaddr: {:08x} Filesz: {} Memsz: {}", p->p_type, p->p_vaddr,
- p->p_filesz, p->p_memsz);
+ INFO_LOG_FMT(BOOT, "Type: {} Vaddr: {:08x} Paddr: {:08x} Filesz: {} Memsz: {}", p->p_type,
+ p->p_vaddr, p->p_paddr, p->p_filesz, p->p_memsz);
if (p->p_type == PT_LOAD)
{
- u32 writeAddr = p->p_vaddr;
+ // Check LMA (paddr) first - some are nonsense, so fall back to VMA (vaddr) if invalid
+ u32 writeAddr = p->p_paddr;
+ if (writeAddr)
+ writeAddr |= 0x80000000; // map to virtual address
+ else
+ writeAddr = p->p_vaddr; // LMA is empty, fall back to VMA
+
const u8* src = GetSegmentPtr(i);
u32 srcSize = p->p_filesz;
u32 dstSize = p->p_memsz;
- if (only_in_mem1 && p->p_vaddr >= memory.GetRamSizeReal())
+ if (only_in_mem1 && writeAddr >= memory.GetRamSizeReal())
continue;
memory.CopyToEmu(writeAddr, src, srcSize);