mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-05 22:47:03 +00:00
LV2/Loader: Fix kernel regions addresses
This commit is contained in:
parent
7a0185dbcc
commit
1843a27c2a
3 changed files with 31 additions and 10 deletions
|
|
@ -1860,15 +1860,30 @@ bool ppu_load_exec(const ppu_exec_object& elf, bool virtual_load, const std::str
|
|||
else if (already_loaded)
|
||||
{
|
||||
}
|
||||
else if (!vm::falloc(addr, size, vm::main))
|
||||
else if (![&]() -> bool
|
||||
{
|
||||
ppu_loader.error("vm::falloc(vm::main) failed (addr=0x%x, memsz=0x%x)", addr, size); // TODO
|
||||
// 1M pages if it is RSX shared
|
||||
const u32 area_flags = (_seg.flags >> 28) ? vm::page_size_1m : vm::page_size_64k;
|
||||
const u32 alloc_at = std::max<u32>(addr & -0x10000000, 0x10000);
|
||||
|
||||
if (!vm::falloc(addr, size))
|
||||
const auto area = vm::reserve_map(vm::any, std::max<u32>(addr & -0x10000000, 0x10000), 0x10000000, area_flags);
|
||||
|
||||
if (!area)
|
||||
{
|
||||
ppu_loader.error("ppu_load_exec(): vm::falloc() failed (addr=0x%x, memsz=0x%x)", addr, size);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (area->addr != alloc_at || (area->flags & 0xf00) != area_flags)
|
||||
{
|
||||
ppu_loader.error("Failed to allocate memory at 0x%x - conflicting memory area exists: area->addr=0x%x, area->flags=0x%x", addr, area->addr, area->flags);
|
||||
return false;
|
||||
}
|
||||
|
||||
return area->falloc(addr, size);
|
||||
}())
|
||||
{
|
||||
ppu_loader.error("ppu_load_exec(): vm::falloc() failed (addr=0x%x, memsz=0x%x)", addr, size);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Store only LOAD segments (TODO)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue