summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Lioncash2018-12-12 13:26:33 -0500
committerGravatar Lioncash2018-12-12 15:08:06 -0500
commiteb5f3f67f62534126e9598e9ea3e165238590b93 (patch)
treedb2132c09e41aa886851138f4887a4bfc2d1c958 /src/core
parentvm_manager: Migrate memory querying to the VMManager interface (diff)
downloadyuzu-eb5f3f67f62534126e9598e9ea3e165238590b93.tar.gz
yuzu-eb5f3f67f62534126e9598e9ea3e165238590b93.tar.xz
yuzu-eb5f3f67f62534126e9598e9ea3e165238590b93.zip
vm_manager: Amend the returned values for invalid memory queries in QueryMemory()
The kernel returns a memory info instance with the base address set to the end of the address space, and the size of said block as 0 - address_space_end, it doesn't set both of said members to zero.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/vm_manager.cpp8
-rw-r--r--src/core/hle/kernel/vm_manager.h3
2 files changed, 7 insertions, 4 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index 21bcee192..d3b55a51e 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -28,7 +28,7 @@ static const char* GetMemoryStateName(MemoryState state) {
28 "IpcBuffer0", "Stack", 28 "IpcBuffer0", "Stack",
29 "ThreadLocal", "TransferMemoryIsolated", 29 "ThreadLocal", "TransferMemoryIsolated",
30 "TransferMemory", "ProcessMemory", 30 "TransferMemory", "ProcessMemory",
31 "Unknown2", "IpcBuffer1", 31 "Inaccessible", "IpcBuffer1",
32 "IpcBuffer3", "KernelStack", 32 "IpcBuffer3", "KernelStack",
33 }; 33 };
34 34
@@ -312,10 +312,10 @@ MemoryInfo VMManager::QueryMemory(VAddr address) const {
312 memory_info.size = vma->second.size; 312 memory_info.size = vma->second.size;
313 memory_info.state = ToSvcMemoryState(vma->second.meminfo_state); 313 memory_info.state = ToSvcMemoryState(vma->second.meminfo_state);
314 } else { 314 } else {
315 memory_info.base_address = 0; 315 memory_info.base_address = address_space_end;
316 memory_info.permission = static_cast<u32>(VMAPermission::None); 316 memory_info.permission = static_cast<u32>(VMAPermission::None);
317 memory_info.size = 0; 317 memory_info.size = 0 - address_space_end;
318 memory_info.state = static_cast<u32>(MemoryState::Unmapped); 318 memory_info.state = static_cast<u32>(MemoryState::Inaccessible);
319 } 319 }
320 320
321 return memory_info; 321 return memory_info;
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h
index 91e8e8c8c..7befa3526 100644
--- a/src/core/hle/kernel/vm_manager.h
+++ b/src/core/hle/kernel/vm_manager.h
@@ -105,6 +105,9 @@ enum class MemoryState : u32 {
105 105
106 ProcessMemory = 0x0F | FlagIPC3 | FlagIPC1 | FlagMapped | FlagMemoryPoolAllocated, 106 ProcessMemory = 0x0F | FlagIPC3 | FlagIPC1 | FlagMapped | FlagMemoryPoolAllocated,
107 107
108 // Used to signify an inaccessible or invalid memory region with memory queries
109 Inaccessible = 0x10,
110
108 IpcBuffer1 = 0x11 | FlagIPC3 | FlagIPC1 | FlagMapped | FlagQueryPhysicalAddressAllowed | 111 IpcBuffer1 = 0x11 | FlagIPC3 | FlagIPC1 | FlagMapped | FlagQueryPhysicalAddressAllowed |
109 FlagSharedDevice | FlagSharedDeviceAligned | FlagMemoryPoolAllocated, 112 FlagSharedDevice | FlagSharedDeviceAligned | FlagMemoryPoolAllocated,
110 113