diff options
| author | 2018-12-14 15:30:02 -0500 | |
|---|---|---|
| committer | 2018-12-14 15:30:02 -0500 | |
| commit | 1a23970d172602497af57969824551e77ae9dfe7 (patch) | |
| tree | eb5c6849e4c83f70779b4f67ee6e1094421ac8e3 /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #1871 from lioncash/move (diff) | |
| parent | svc: Enable svcQueryProcessMemory (diff) | |
| download | yuzu-1a23970d172602497af57969824551e77ae9dfe7.tar.gz yuzu-1a23970d172602497af57969824551e77ae9dfe7.tar.xz yuzu-1a23970d172602497af57969824551e77ae9dfe7.zip | |
Merge pull request #1899 from lioncash/state
vm_manager/svc: Modify MemoryState enum, and correct error handling for svcQueryMemory
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 8b0b3671a..5d36792ca 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include "core/hle/lock.h" | 35 | #include "core/hle/lock.h" |
| 36 | #include "core/hle/result.h" | 36 | #include "core/hle/result.h" |
| 37 | #include "core/hle/service/service.h" | 37 | #include "core/hle/service/service.h" |
| 38 | #include "core/memory.h" | ||
| 38 | 39 | ||
| 39 | namespace Kernel { | 40 | namespace Kernel { |
| 40 | namespace { | 41 | namespace { |
| @@ -273,7 +274,7 @@ static ResultCode MapMemory(VAddr dst_addr, VAddr src_addr, u64 size) { | |||
| 273 | return result; | 274 | return result; |
| 274 | } | 275 | } |
| 275 | 276 | ||
| 276 | return current_process->MirrorMemory(dst_addr, src_addr, size); | 277 | return current_process->MirrorMemory(dst_addr, src_addr, size, MemoryState::Stack); |
| 277 | } | 278 | } |
| 278 | 279 | ||
| 279 | /// Unmaps a region that was previously mapped with svcMapMemory | 280 | /// Unmaps a region that was previously mapped with svcMapMemory |
| @@ -1066,10 +1067,9 @@ static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 | |||
| 1066 | return shared_memory->Unmap(*current_process, addr); | 1067 | return shared_memory->Unmap(*current_process, addr); |
| 1067 | } | 1068 | } |
| 1068 | 1069 | ||
| 1069 | /// Query process memory | 1070 | static ResultCode QueryProcessMemory(VAddr memory_info_address, VAddr page_info_address, |
| 1070 | static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_info*/, | 1071 | Handle process_handle, VAddr address) { |
| 1071 | Handle process_handle, u64 addr) { | 1072 | LOG_TRACE(Kernel_SVC, "called process=0x{:08X} address={:X}", process_handle, address); |
| 1072 | LOG_TRACE(Kernel_SVC, "called process=0x{:08X} addr={:X}", process_handle, addr); | ||
| 1073 | const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); | 1073 | const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); |
| 1074 | SharedPtr<Process> process = handle_table.Get<Process>(process_handle); | 1074 | SharedPtr<Process> process = handle_table.Get<Process>(process_handle); |
| 1075 | if (!process) { | 1075 | if (!process) { |
| @@ -1079,28 +1079,32 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_i | |||
| 1079 | } | 1079 | } |
| 1080 | 1080 | ||
| 1081 | const auto& vm_manager = process->VMManager(); | 1081 | const auto& vm_manager = process->VMManager(); |
| 1082 | const auto vma = vm_manager.FindVMA(addr); | 1082 | const MemoryInfo memory_info = vm_manager.QueryMemory(address); |
| 1083 | 1083 | ||
| 1084 | memory_info->attributes = 0; | 1084 | Memory::Write64(memory_info_address, memory_info.base_address); |
| 1085 | if (vm_manager.IsValidHandle(vma)) { | 1085 | Memory::Write64(memory_info_address + 8, memory_info.size); |
| 1086 | memory_info->base_address = vma->second.base; | 1086 | Memory::Write32(memory_info_address + 16, memory_info.state); |
| 1087 | memory_info->permission = static_cast<u32>(vma->second.permissions); | 1087 | Memory::Write32(memory_info_address + 20, memory_info.attributes); |
| 1088 | memory_info->size = vma->second.size; | 1088 | Memory::Write32(memory_info_address + 24, memory_info.permission); |
| 1089 | memory_info->type = static_cast<u32>(vma->second.meminfo_state); | 1089 | Memory::Write32(memory_info_address + 32, memory_info.ipc_ref_count); |
| 1090 | } else { | 1090 | Memory::Write32(memory_info_address + 28, memory_info.device_ref_count); |
| 1091 | memory_info->base_address = 0; | 1091 | Memory::Write32(memory_info_address + 36, 0); |
| 1092 | memory_info->permission = static_cast<u32>(VMAPermission::None); | 1092 | |
| 1093 | memory_info->size = 0; | 1093 | // Page info appears to be currently unused by the kernel and is always set to zero. |
| 1094 | memory_info->type = static_cast<u32>(MemoryState::Unmapped); | 1094 | Memory::Write32(page_info_address, 0); |
| 1095 | } | ||
| 1096 | 1095 | ||
| 1097 | return RESULT_SUCCESS; | 1096 | return RESULT_SUCCESS; |
| 1098 | } | 1097 | } |
| 1099 | 1098 | ||
| 1100 | /// Query memory | 1099 | static ResultCode QueryMemory(VAddr memory_info_address, VAddr page_info_address, |
| 1101 | static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, VAddr addr) { | 1100 | VAddr query_address) { |
| 1102 | LOG_TRACE(Kernel_SVC, "called, addr={:X}", addr); | 1101 | LOG_TRACE(Kernel_SVC, |
| 1103 | return QueryProcessMemory(memory_info, page_info, CurrentProcess, addr); | 1102 | "called, memory_info_address=0x{:016X}, page_info_address=0x{:016X}, " |
| 1103 | "query_address=0x{:016X}", | ||
| 1104 | memory_info_address, page_info_address, query_address); | ||
| 1105 | |||
| 1106 | return QueryProcessMemory(memory_info_address, page_info_address, CurrentProcess, | ||
| 1107 | query_address); | ||
| 1104 | } | 1108 | } |
| 1105 | 1109 | ||
| 1106 | /// Exits the current process | 1110 | /// Exits the current process |
| @@ -1907,7 +1911,7 @@ static const FunctionDef SVC_Table[] = { | |||
| 1907 | {0x73, nullptr, "SetProcessMemoryPermission"}, | 1911 | {0x73, nullptr, "SetProcessMemoryPermission"}, |
| 1908 | {0x74, nullptr, "MapProcessMemory"}, | 1912 | {0x74, nullptr, "MapProcessMemory"}, |
| 1909 | {0x75, nullptr, "UnmapProcessMemory"}, | 1913 | {0x75, nullptr, "UnmapProcessMemory"}, |
| 1910 | {0x76, nullptr, "QueryProcessMemory"}, | 1914 | {0x76, SvcWrap<QueryProcessMemory>, "QueryProcessMemory"}, |
| 1911 | {0x77, nullptr, "MapProcessCodeMemory"}, | 1915 | {0x77, nullptr, "MapProcessCodeMemory"}, |
| 1912 | {0x78, nullptr, "UnmapProcessCodeMemory"}, | 1916 | {0x78, nullptr, "UnmapProcessCodeMemory"}, |
| 1913 | {0x79, nullptr, "CreateProcess"}, | 1917 | {0x79, nullptr, "CreateProcess"}, |