summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2019-04-15 21:43:56 -0400
committerGravatar GitHub2019-04-15 21:43:56 -0400
commitfc64156533488e73b814c00bb42b5b6079ac8fa8 (patch)
tree36bf55884fdcd294f5318c44931e755fb23d6894 /src/core/hle/kernel/svc.cpp
parentMerge pull request #2398 from lioncash/boost (diff)
parentkernel/svc: Implement svcUnmapProcessCodeMemory (diff)
downloadyuzu-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.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 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
1192static 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
1260ResultCode 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
1193static void ExitProcess(Core::System& system) { 1329static 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"},