summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-12-14 15:30:02 -0500
committerGravatar GitHub2018-12-14 15:30:02 -0500
commit1a23970d172602497af57969824551e77ae9dfe7 (patch)
treeeb5c6849e4c83f70779b4f67ee6e1094421ac8e3 /src/core/hle/kernel/svc.cpp
parentMerge pull request #1871 from lioncash/move (diff)
parentsvc: Enable svcQueryProcessMemory (diff)
downloadyuzu-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.cpp52
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
39namespace Kernel { 40namespace Kernel {
40namespace { 41namespace {
@@ -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 1070static ResultCode QueryProcessMemory(VAddr memory_info_address, VAddr page_info_address,
1070static 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 1099static ResultCode QueryMemory(VAddr memory_info_address, VAddr page_info_address,
1101static 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"},