summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2020-04-24 23:22:26 -0400
committerGravatar GitHub2020-04-24 23:22:26 -0400
commitd1e7cf3bdce16d09b3219053e96d11a509a45c8a (patch)
treebbec0b0e00bc23b66f07b94119b8eca67ca43183 /src
parentMerge pull request #3749 from ReinUsesLisp/lea-imm (diff)
parentsvc: Re-add MapProcessCodeMemory/UnmapProcessCodeMemory (diff)
downloadyuzu-d1e7cf3bdce16d09b3219053e96d11a509a45c8a.tar.gz
yuzu-d1e7cf3bdce16d09b3219053e96d11a509a45c8a.tar.xz
yuzu-d1e7cf3bdce16d09b3219053e96d11a509a45c8a.zip
Merge pull request #3780 from lioncash/process
svc: Re-add MapProcessCodeMemory/UnmapProcessCodeMemory
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/svc.cpp140
1 files changed, 138 insertions, 2 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index dc5bcc2e5..25b4a23b4 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1226,6 +1226,142 @@ static ResultCode QueryMemory32(Core::System& system, u32 memory_info_address,
1226 return QueryMemory(system, memory_info_address, page_info_address, query_address); 1226 return QueryMemory(system, memory_info_address, page_info_address, query_address);
1227} 1227}
1228 1228
1229static ResultCode MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst_address,
1230 u64 src_address, u64 size) {
1231 LOG_DEBUG(Kernel_SVC,
1232 "called. process_handle=0x{:08X}, dst_address=0x{:016X}, "
1233 "src_address=0x{:016X}, size=0x{:016X}",
1234 process_handle, dst_address, src_address, size);
1235
1236 if (!Common::Is4KBAligned(src_address)) {
1237 LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).",
1238 src_address);
1239 return ERR_INVALID_ADDRESS;
1240 }
1241
1242 if (!Common::Is4KBAligned(dst_address)) {
1243 LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).",
1244 dst_address);
1245 return ERR_INVALID_ADDRESS;
1246 }
1247
1248 if (size == 0 || !Common::Is4KBAligned(size)) {
1249 LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X})", size);
1250 return ERR_INVALID_SIZE;
1251 }
1252
1253 if (!IsValidAddressRange(dst_address, size)) {
1254 LOG_ERROR(Kernel_SVC,
1255 "Destination address range overflows the address space (dst_address=0x{:016X}, "
1256 "size=0x{:016X}).",
1257 dst_address, size);
1258 return ERR_INVALID_ADDRESS_STATE;
1259 }
1260
1261 if (!IsValidAddressRange(src_address, size)) {
1262 LOG_ERROR(Kernel_SVC,
1263 "Source address range overflows the address space (src_address=0x{:016X}, "
1264 "size=0x{:016X}).",
1265 src_address, size);
1266 return ERR_INVALID_ADDRESS_STATE;
1267 }
1268
1269 const auto& handle_table = system.Kernel().CurrentProcess()->GetHandleTable();
1270 auto process = handle_table.Get<Process>(process_handle);
1271 if (!process) {
1272 LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).",
1273 process_handle);
1274 return ERR_INVALID_HANDLE;
1275 }
1276
1277 auto& page_table = process->PageTable();
1278 if (!page_table.IsInsideAddressSpace(src_address, size)) {
1279 LOG_ERROR(Kernel_SVC,
1280 "Source address range is not within the address space (src_address=0x{:016X}, "
1281 "size=0x{:016X}).",
1282 src_address, size);
1283 return ERR_INVALID_ADDRESS_STATE;
1284 }
1285
1286 if (!page_table.IsInsideASLRRegion(dst_address, size)) {
1287 LOG_ERROR(Kernel_SVC,
1288 "Destination address range is not within the ASLR region (dst_address=0x{:016X}, "
1289 "size=0x{:016X}).",
1290 dst_address, size);
1291 return ERR_INVALID_MEMORY_RANGE;
1292 }
1293
1294 return page_table.MapProcessCodeMemory(dst_address, src_address, size);
1295}
1296
1297static ResultCode UnmapProcessCodeMemory(Core::System& system, Handle process_handle,
1298 u64 dst_address, u64 src_address, u64 size) {
1299 LOG_DEBUG(Kernel_SVC,
1300 "called. process_handle=0x{:08X}, dst_address=0x{:016X}, src_address=0x{:016X}, "
1301 "size=0x{:016X}",
1302 process_handle, dst_address, src_address, size);
1303
1304 if (!Common::Is4KBAligned(dst_address)) {
1305 LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).",
1306 dst_address);
1307 return ERR_INVALID_ADDRESS;
1308 }
1309
1310 if (!Common::Is4KBAligned(src_address)) {
1311 LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).",
1312 src_address);
1313 return ERR_INVALID_ADDRESS;
1314 }
1315
1316 if (size == 0 || Common::Is4KBAligned(size)) {
1317 LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X}).", size);
1318 return ERR_INVALID_SIZE;
1319 }
1320
1321 if (!IsValidAddressRange(dst_address, size)) {
1322 LOG_ERROR(Kernel_SVC,
1323 "Destination address range overflows the address space (dst_address=0x{:016X}, "
1324 "size=0x{:016X}).",
1325 dst_address, size);
1326 return ERR_INVALID_ADDRESS_STATE;
1327 }
1328
1329 if (!IsValidAddressRange(src_address, size)) {
1330 LOG_ERROR(Kernel_SVC,
1331 "Source address range overflows the address space (src_address=0x{:016X}, "
1332 "size=0x{:016X}).",
1333 src_address, size);
1334 return ERR_INVALID_ADDRESS_STATE;
1335 }
1336
1337 const auto& handle_table = system.Kernel().CurrentProcess()->GetHandleTable();
1338 auto process = handle_table.Get<Process>(process_handle);
1339 if (!process) {
1340 LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).",
1341 process_handle);
1342 return ERR_INVALID_HANDLE;
1343 }
1344
1345 auto& page_table = process->PageTable();
1346 if (!page_table.IsInsideAddressSpace(src_address, size)) {
1347 LOG_ERROR(Kernel_SVC,
1348 "Source address range is not within the address space (src_address=0x{:016X}, "
1349 "size=0x{:016X}).",
1350 src_address, size);
1351 return ERR_INVALID_ADDRESS_STATE;
1352 }
1353
1354 if (!page_table.IsInsideASLRRegion(dst_address, size)) {
1355 LOG_ERROR(Kernel_SVC,
1356 "Destination address range is not within the ASLR region (dst_address=0x{:016X}, "
1357 "size=0x{:016X}).",
1358 dst_address, size);
1359 return ERR_INVALID_MEMORY_RANGE;
1360 }
1361
1362 return page_table.UnmapProcessCodeMemory(dst_address, src_address, size);
1363}
1364
1229/// Exits the current process 1365/// Exits the current process
1230static void ExitProcess(Core::System& system) { 1366static void ExitProcess(Core::System& system) {
1231 auto* current_process = system.Kernel().CurrentProcess(); 1367 auto* current_process = system.Kernel().CurrentProcess();
@@ -2253,8 +2389,8 @@ static const FunctionDef SVC_Table_64[] = {
2253 {0x74, nullptr, "MapProcessMemory"}, 2389 {0x74, nullptr, "MapProcessMemory"},
2254 {0x75, nullptr, "UnmapProcessMemory"}, 2390 {0x75, nullptr, "UnmapProcessMemory"},
2255 {0x76, SvcWrap64<QueryProcessMemory>, "QueryProcessMemory"}, 2391 {0x76, SvcWrap64<QueryProcessMemory>, "QueryProcessMemory"},
2256 {0x77, nullptr, "MapProcessCodeMemory"}, 2392 {0x77, SvcWrap64<MapProcessCodeMemory>, "MapProcessCodeMemory"},
2257 {0x78, nullptr, "UnmapProcessCodeMemory"}, 2393 {0x78, SvcWrap64<UnmapProcessCodeMemory>, "UnmapProcessCodeMemory"},
2258 {0x79, nullptr, "CreateProcess"}, 2394 {0x79, nullptr, "CreateProcess"},
2259 {0x7A, nullptr, "StartProcess"}, 2395 {0x7A, nullptr, "StartProcess"},
2260 {0x7B, nullptr, "TerminateProcess"}, 2396 {0x7B, nullptr, "TerminateProcess"},