From fbab9524726f378be6e194007f528f7347d48249 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Thu, 15 May 2025 13:37:34 -0500 Subject: [PATCH] Attempt to handle MemoryMapFlags::NoOverwrite Based on my interpretation of red_prig's descriptions. These changes are untested, as I'm not able to test right now. --- src/core/memory.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 0778fe47d..f97023421 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -376,11 +376,17 @@ int MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, size_t size, M // To account for this, unmap any reserved areas within this mapping range first. auto unmap_addr = mapped_addr; auto unmap_size = size; - while (!vma.IsMapped() && unmap_addr < mapped_addr + size && remaining_size < size) { + // If flag NoOverwrite is provided, allow overwriting mapped VMAs. + // Otherwise, we can only overwrite unmapped or reserved VMAs. + auto should_overwrite = False(flags & MemoryMapFlags::NoOverwrite) || !vma.IsMapped(); + while (should_overwrite && unmap_addr < mapped_addr + size && remaining_size < size) { auto unmapped = UnmapBytesFromEntry(unmap_addr, vma, unmap_size); unmap_addr += unmapped; unmap_size -= unmapped; + // Unmap addr should be the address of the next VMA + // if the previous VMA is fully unmapped. vma = FindVMA(unmap_addr)->second; + should_overwrite = False(flags & MemoryMapFlags::NoOverwrite) || !vma.IsMapped(); } vma = FindVMA(mapped_addr)->second;