diff options
| author | 2021-11-20 20:23:59 -0500 | |
|---|---|---|
| committer | 2021-11-20 22:18:56 -0500 | |
| commit | 2726d705f8dde6d8fcbcfcd55e065a0598e10969 (patch) | |
| tree | 84c8803da6e2755a25f2396b55eea3ce9eaad2da | |
| parent | kernel: KPageTable: Rename SetCodeMemoryPermission to SetProcessMemoryPermission (diff) | |
| download | yuzu-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.cpp | 42 |
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 | ||
| 1186 | constexpr 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 | |||
| 1186 | static ResultCode MapSharedMemory(Core::System& system, Handle shmem_handle, VAddr address, | 1198 | static 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 | ||
| 1277 | static 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 | |||
| 1265 | static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address, | 1305 | static 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"}, |