summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Morph2021-11-20 20:23:59 -0500
committerGravatar Morph2021-11-20 22:18:56 -0500
commit2726d705f8dde6d8fcbcfcd55e065a0598e10969 (patch)
tree84c8803da6e2755a25f2396b55eea3ce9eaad2da
parentkernel: KPageTable: Rename SetCodeMemoryPermission to SetProcessMemoryPermission (diff)
downloadyuzu-2726d705f8dde6d8fcbcfcd55e065a0598e10969.tar.gz
yuzu-2726d705f8dde6d8fcbcfcd55e065a0598e10969.tar.xz
yuzu-2726d705f8dde6d8fcbcfcd55e065a0598e10969.zip
kernel: svc: Implement SetProcessMemoryPermission
- Used by Skyline modding framework
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/svc.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index f9d99bc51..23dc44780 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1183,6 +1183,18 @@ constexpr bool IsValidRemoteSharedMemoryPermission(Svc::MemoryPermission perm) {
1183 return IsValidSharedMemoryPermission(perm) || perm == Svc::MemoryPermission::DontCare; 1183 return IsValidSharedMemoryPermission(perm) || perm == Svc::MemoryPermission::DontCare;
1184} 1184}
1185 1185
1186constexpr bool IsValidProcessMemoryPermission(Svc::MemoryPermission perm) {
1187 switch (perm) {
1188 case Svc::MemoryPermission::None:
1189 case Svc::MemoryPermission::Read:
1190 case Svc::MemoryPermission::ReadWrite:
1191 case Svc::MemoryPermission::ReadExecute:
1192 return true;
1193 default:
1194 return false;
1195 }
1196}
1197
1186static ResultCode MapSharedMemory(Core::System& system, Handle shmem_handle, VAddr address, 1198static ResultCode MapSharedMemory(Core::System& system, Handle shmem_handle, VAddr address,
1187 u64 size, Svc::MemoryPermission map_perm) { 1199 u64 size, Svc::MemoryPermission map_perm) {
1188 LOG_TRACE(Kernel_SVC, 1200 LOG_TRACE(Kernel_SVC,
@@ -1262,6 +1274,34 @@ static ResultCode UnmapSharedMemory32(Core::System& system, Handle shmem_handle,
1262 return UnmapSharedMemory(system, shmem_handle, address, size); 1274 return UnmapSharedMemory(system, shmem_handle, address, size);
1263} 1275}
1264 1276
1277static ResultCode SetProcessMemoryPermission(Core::System& system, Handle process_handle,
1278 VAddr address, u64 size, Svc::MemoryPermission perm) {
1279 LOG_TRACE(Kernel_SVC,
1280 "called, process_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}",
1281 process_handle, address, size, perm);
1282
1283 // Validate the address/size.
1284 R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress);
1285 R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
1286 R_UNLESS(size > 0, ResultInvalidSize);
1287 R_UNLESS((address < address + size), ResultInvalidCurrentMemory);
1288
1289 // Validate the memory permission.
1290 R_UNLESS(IsValidProcessMemoryPermission(perm), ResultInvalidNewMemoryPermission);
1291
1292 // Get the process from its handle.
1293 KScopedAutoObject process =
1294 system.CurrentProcess()->GetHandleTable().GetObject<KProcess>(process_handle);
1295 R_UNLESS(process.IsNotNull(), ResultInvalidHandle);
1296
1297 // Validate that the address is in range.
1298 auto& page_table = process->PageTable();
1299 R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory);
1300
1301 // Set the memory permission.
1302 return page_table.SetProcessMemoryPermission(address, size, ConvertToKMemoryPermission(perm));
1303}
1304
1265static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address, 1305static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address,
1266 VAddr page_info_address, Handle process_handle, 1306 VAddr page_info_address, Handle process_handle,
1267 VAddr address) { 1307 VAddr address) {
@@ -2588,7 +2628,7 @@ static const FunctionDef SVC_Table_64[] = {
2588 {0x70, nullptr, "CreatePort"}, 2628 {0x70, nullptr, "CreatePort"},
2589 {0x71, nullptr, "ManageNamedPort"}, 2629 {0x71, nullptr, "ManageNamedPort"},
2590 {0x72, nullptr, "ConnectToPort"}, 2630 {0x72, nullptr, "ConnectToPort"},
2591 {0x73, nullptr, "SetProcessMemoryPermission"}, 2631 {0x73, SvcWrap64<SetProcessMemoryPermission>, "SetProcessMemoryPermission"},
2592 {0x74, nullptr, "MapProcessMemory"}, 2632 {0x74, nullptr, "MapProcessMemory"},
2593 {0x75, nullptr, "UnmapProcessMemory"}, 2633 {0x75, nullptr, "UnmapProcessMemory"},
2594 {0x76, SvcWrap64<QueryProcessMemory>, "QueryProcessMemory"}, 2634 {0x76, SvcWrap64<QueryProcessMemory>, "QueryProcessMemory"},