From 5325388e24547a68328791ec271c1ceee8985e6b Mon Sep 17 00:00:00 2001 From: Weiyi Wang Date: Thu, 8 Nov 2018 20:42:21 -0500 Subject: [PATCH] SVC: QueryMemory merges similar VMA --- src/core/hle/kernel/svc.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 16bbddb24..8e75fb236 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -964,10 +964,27 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* page_inf if (vma == process->vm_manager.vma_map.end()) return ERR_INVALID_ADDRESS; - memory_info->base_address = vma->second.base; - memory_info->permission = static_cast(vma->second.permissions); - memory_info->size = vma->second.size; - memory_info->state = static_cast(vma->second.meminfo_state); + auto permissions = vma->second.permissions; + auto state = vma->second.meminfo_state; + + // Query(Process)Memory merges vma with neighbours when they share the same state and + // permissions, regardless of their physical mapping. + + auto mismatch = [permissions, state](const std::pair& v) { + return v.second.permissions != permissions || v.second.meminfo_state != state; + }; + + std::reverse_iterator rvma(vma); + + auto lower = std::find_if(rvma, process->vm_manager.vma_map.crend(), mismatch); + --lower; + auto upper = std::find_if(vma, process->vm_manager.vma_map.cend(), mismatch); + --upper; + + memory_info->base_address = lower->second.base; + memory_info->permission = static_cast(permissions); + memory_info->size = upper->second.base + upper->second.size - lower->second.base; + memory_info->state = static_cast(state); page_info->flags = 0; LOG_TRACE(Kernel_SVC, "called process=0x{:08X} addr=0x{:08X}", process_handle, addr);