diff options
| author | 2018-12-12 13:26:33 -0500 | |
|---|---|---|
| committer | 2018-12-12 15:08:06 -0500 | |
| commit | eb5f3f67f62534126e9598e9ea3e165238590b93 (patch) | |
| tree | db2132c09e41aa886851138f4887a4bfc2d1c958 /src/core | |
| parent | vm_manager: Migrate memory querying to the VMManager interface (diff) | |
| download | yuzu-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.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 3 |
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 | ||