mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 20:44:28 +00:00
Fix fix
Avoid running the code path if it's unnecessary, since there are many additional edge cases to handle when the VMA map is small.
This commit is contained in:
parent
deb02db7bc
commit
a8b865e783
@ -347,11 +347,12 @@ int MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, size_t size, M
|
|||||||
// Fixed mapping means the virtual address must exactly match the provided one.
|
// Fixed mapping means the virtual address must exactly match the provided one.
|
||||||
if (True(flags & MemoryMapFlags::Fixed)) {
|
if (True(flags & MemoryMapFlags::Fixed)) {
|
||||||
auto vma = FindVMA(mapped_addr)->second;
|
auto vma = FindVMA(mapped_addr)->second;
|
||||||
|
size_t remaining_size = vma.base + vma.size - mapped_addr;
|
||||||
// There's a possible edge case where we're mapping to a partially reserved range.
|
// There's a possible edge case where we're mapping to a partially reserved range.
|
||||||
// To account for this, unmap any reserved areas within this mapping range first.
|
// To account for this, unmap any reserved areas within this mapping range first.
|
||||||
auto unmap_addr = mapped_addr;
|
auto unmap_addr = mapped_addr;
|
||||||
auto unmap_size = size;
|
auto unmap_size = size;
|
||||||
while (!vma.IsMapped() && vma.base < mapped_addr + size) {
|
while (!vma.IsMapped() && vma.base < mapped_addr + size && remaining_size < size) {
|
||||||
auto unmapped = UnmapBytesFromEntry(unmap_addr, vma, unmap_size);
|
auto unmapped = UnmapBytesFromEntry(unmap_addr, vma, unmap_size);
|
||||||
unmap_addr += unmapped;
|
unmap_addr += unmapped;
|
||||||
unmap_size -= unmapped;
|
unmap_size -= unmapped;
|
||||||
@ -360,7 +361,7 @@ int MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, size_t size, M
|
|||||||
|
|
||||||
// This should return SCE_KERNEL_ERROR_ENOMEM but rarely happens.
|
// This should return SCE_KERNEL_ERROR_ENOMEM but rarely happens.
|
||||||
vma = FindVMA(mapped_addr)->second;
|
vma = FindVMA(mapped_addr)->second;
|
||||||
size_t remaining_size = vma.base + vma.size - mapped_addr;
|
remaining_size = vma.base + vma.size - mapped_addr;
|
||||||
ASSERT_MSG(!vma.IsMapped() && remaining_size >= size,
|
ASSERT_MSG(!vma.IsMapped() && remaining_size >= size,
|
||||||
"Memory region {:#x} to {:#x} isn't free enough to map region {:#x} to {:#x}",
|
"Memory region {:#x} to {:#x} isn't free enough to map region {:#x} to {:#x}",
|
||||||
vma.base, vma.base + vma.size, virtual_addr, virtual_addr + size);
|
vma.base, vma.base + vma.size, virtual_addr, virtual_addr + size);
|
||||||
|
Loading…
Reference in New Issue
Block a user