diff options
| author | 2019-04-15 21:43:56 -0400 | |
|---|---|---|
| committer | 2019-04-15 21:43:56 -0400 | |
| commit | fc64156533488e73b814c00bb42b5b6079ac8fa8 (patch) | |
| tree | 36bf55884fdcd294f5318c44931e755fb23d6894 /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #2398 from lioncash/boost (diff) | |
| parent | kernel/svc: Implement svcUnmapProcessCodeMemory (diff) | |
| download | yuzu-fc64156533488e73b814c00bb42b5b6079ac8fa8.tar.gz yuzu-fc64156533488e73b814c00bb42b5b6079ac8fa8.tar.xz yuzu-fc64156533488e73b814c00bb42b5b6079ac8fa8.zip | |
Merge pull request #2393 from lioncash/svc
kernel/svc: Implement svcMapProcessCodeMemory/svcUnmapProcessCodeMemory
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 140 |
1 files changed, 138 insertions, 2 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index e5d4d6b55..d48a2203a 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1189,6 +1189,142 @@ static ResultCode QueryMemory(Core::System& system, VAddr memory_info_address, | |||
| 1189 | query_address); | 1189 | query_address); |
| 1190 | } | 1190 | } |
| 1191 | 1191 | ||
| 1192 | static ResultCode MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst_address, | ||
| 1193 | u64 src_address, u64 size) { | ||
| 1194 | LOG_DEBUG(Kernel_SVC, | ||
| 1195 | "called. process_handle=0x{:08X}, dst_address=0x{:016X}, " | ||
| 1196 | "src_address=0x{:016X}, size=0x{:016X}", | ||
| 1197 | process_handle, dst_address, src_address, size); | ||
| 1198 | |||
| 1199 | if (!Common::Is4KBAligned(src_address)) { | ||
| 1200 | LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).", | ||
| 1201 | src_address); | ||
| 1202 | return ERR_INVALID_ADDRESS; | ||
| 1203 | } | ||
| 1204 | |||
| 1205 | if (!Common::Is4KBAligned(dst_address)) { | ||
| 1206 | LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).", | ||
| 1207 | dst_address); | ||
| 1208 | return ERR_INVALID_ADDRESS; | ||
| 1209 | } | ||
| 1210 | |||
| 1211 | if (size == 0 || !Common::Is4KBAligned(size)) { | ||
| 1212 | LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X})", size); | ||
| 1213 | return ERR_INVALID_SIZE; | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | if (!IsValidAddressRange(dst_address, size)) { | ||
| 1217 | LOG_ERROR(Kernel_SVC, | ||
| 1218 | "Destination address range overflows the address space (dst_address=0x{:016X}, " | ||
| 1219 | "size=0x{:016X}).", | ||
| 1220 | dst_address, size); | ||
| 1221 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1222 | } | ||
| 1223 | |||
| 1224 | if (!IsValidAddressRange(src_address, size)) { | ||
| 1225 | LOG_ERROR(Kernel_SVC, | ||
| 1226 | "Source address range overflows the address space (src_address=0x{:016X}, " | ||
| 1227 | "size=0x{:016X}).", | ||
| 1228 | src_address, size); | ||
| 1229 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1230 | } | ||
| 1231 | |||
| 1232 | const auto& handle_table = system.Kernel().CurrentProcess()->GetHandleTable(); | ||
| 1233 | auto process = handle_table.Get<Process>(process_handle); | ||
| 1234 | if (!process) { | ||
| 1235 | LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).", | ||
| 1236 | process_handle); | ||
| 1237 | return ERR_INVALID_HANDLE; | ||
| 1238 | } | ||
| 1239 | |||
| 1240 | auto& vm_manager = process->VMManager(); | ||
| 1241 | if (!vm_manager.IsWithinAddressSpace(src_address, size)) { | ||
| 1242 | LOG_ERROR(Kernel_SVC, | ||
| 1243 | "Source address range is not within the address space (src_address=0x{:016X}, " | ||
| 1244 | "size=0x{:016X}).", | ||
| 1245 | src_address, size); | ||
| 1246 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1247 | } | ||
| 1248 | |||
| 1249 | if (!vm_manager.IsWithinASLRRegion(dst_address, size)) { | ||
| 1250 | LOG_ERROR(Kernel_SVC, | ||
| 1251 | "Destination address range is not within the ASLR region (dst_address=0x{:016X}, " | ||
| 1252 | "size=0x{:016X}).", | ||
| 1253 | dst_address, size); | ||
| 1254 | return ERR_INVALID_MEMORY_RANGE; | ||
| 1255 | } | ||
| 1256 | |||
| 1257 | return vm_manager.MapCodeMemory(dst_address, src_address, size); | ||
| 1258 | } | ||
| 1259 | |||
| 1260 | ResultCode UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst_address, | ||
| 1261 | u64 src_address, u64 size) { | ||
| 1262 | LOG_DEBUG(Kernel_SVC, | ||
| 1263 | "called. process_handle=0x{:08X}, dst_address=0x{:016X}, src_address=0x{:016X}, " | ||
| 1264 | "size=0x{:016X}", | ||
| 1265 | process_handle, dst_address, src_address, size); | ||
| 1266 | |||
| 1267 | if (!Common::Is4KBAligned(dst_address)) { | ||
| 1268 | LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).", | ||
| 1269 | dst_address); | ||
| 1270 | return ERR_INVALID_ADDRESS; | ||
| 1271 | } | ||
| 1272 | |||
| 1273 | if (!Common::Is4KBAligned(src_address)) { | ||
| 1274 | LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).", | ||
| 1275 | src_address); | ||
| 1276 | return ERR_INVALID_ADDRESS; | ||
| 1277 | } | ||
| 1278 | |||
| 1279 | if (size == 0 || Common::Is4KBAligned(size)) { | ||
| 1280 | LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X}).", size); | ||
| 1281 | return ERR_INVALID_SIZE; | ||
| 1282 | } | ||
| 1283 | |||
| 1284 | if (!IsValidAddressRange(dst_address, size)) { | ||
| 1285 | LOG_ERROR(Kernel_SVC, | ||
| 1286 | "Destination address range overflows the address space (dst_address=0x{:016X}, " | ||
| 1287 | "size=0x{:016X}).", | ||
| 1288 | dst_address, size); | ||
| 1289 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1290 | } | ||
| 1291 | |||
| 1292 | if (!IsValidAddressRange(src_address, size)) { | ||
| 1293 | LOG_ERROR(Kernel_SVC, | ||
| 1294 | "Source address range overflows the address space (src_address=0x{:016X}, " | ||
| 1295 | "size=0x{:016X}).", | ||
| 1296 | src_address, size); | ||
| 1297 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1298 | } | ||
| 1299 | |||
| 1300 | const auto& handle_table = system.Kernel().CurrentProcess()->GetHandleTable(); | ||
| 1301 | auto process = handle_table.Get<Process>(process_handle); | ||
| 1302 | if (!process) { | ||
| 1303 | LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).", | ||
| 1304 | process_handle); | ||
| 1305 | return ERR_INVALID_HANDLE; | ||
| 1306 | } | ||
| 1307 | |||
| 1308 | auto& vm_manager = process->VMManager(); | ||
| 1309 | if (!vm_manager.IsWithinAddressSpace(src_address, size)) { | ||
| 1310 | LOG_ERROR(Kernel_SVC, | ||
| 1311 | "Source address range is not within the address space (src_address=0x{:016X}, " | ||
| 1312 | "size=0x{:016X}).", | ||
| 1313 | src_address, size); | ||
| 1314 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1315 | } | ||
| 1316 | |||
| 1317 | if (!vm_manager.IsWithinASLRRegion(dst_address, size)) { | ||
| 1318 | LOG_ERROR(Kernel_SVC, | ||
| 1319 | "Destination address range is not within the ASLR region (dst_address=0x{:016X}, " | ||
| 1320 | "size=0x{:016X}).", | ||
| 1321 | dst_address, size); | ||
| 1322 | return ERR_INVALID_MEMORY_RANGE; | ||
| 1323 | } | ||
| 1324 | |||
| 1325 | return vm_manager.UnmapCodeMemory(dst_address, src_address, size); | ||
| 1326 | } | ||
| 1327 | |||
| 1192 | /// Exits the current process | 1328 | /// Exits the current process |
| 1193 | static void ExitProcess(Core::System& system) { | 1329 | static void ExitProcess(Core::System& system) { |
| 1194 | auto* current_process = system.Kernel().CurrentProcess(); | 1330 | auto* current_process = system.Kernel().CurrentProcess(); |
| @@ -2217,8 +2353,8 @@ static const FunctionDef SVC_Table[] = { | |||
| 2217 | {0x74, nullptr, "MapProcessMemory"}, | 2353 | {0x74, nullptr, "MapProcessMemory"}, |
| 2218 | {0x75, nullptr, "UnmapProcessMemory"}, | 2354 | {0x75, nullptr, "UnmapProcessMemory"}, |
| 2219 | {0x76, SvcWrap<QueryProcessMemory>, "QueryProcessMemory"}, | 2355 | {0x76, SvcWrap<QueryProcessMemory>, "QueryProcessMemory"}, |
| 2220 | {0x77, nullptr, "MapProcessCodeMemory"}, | 2356 | {0x77, SvcWrap<MapProcessCodeMemory>, "MapProcessCodeMemory"}, |
| 2221 | {0x78, nullptr, "UnmapProcessCodeMemory"}, | 2357 | {0x78, SvcWrap<UnmapProcessCodeMemory>, "UnmapProcessCodeMemory"}, |
| 2222 | {0x79, nullptr, "CreateProcess"}, | 2358 | {0x79, nullptr, "CreateProcess"}, |
| 2223 | {0x7A, nullptr, "StartProcess"}, | 2359 | {0x7A, nullptr, "StartProcess"}, |
| 2224 | {0x7B, nullptr, "TerminateProcess"}, | 2360 | {0x7B, nullptr, "TerminateProcess"}, |