summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 3eb77812e..d19182639 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -444,35 +444,43 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s
444 "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", 444 "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}",
445 shared_memory_handle, addr, size, permissions); 445 shared_memory_handle, addr, size, permissions);
446 446
447 if (!Is4KBAligned(addr)) {
448 return ERR_INVALID_ADDRESS;
449 }
450
451 if (size == 0 || !Is4KBAligned(size)) {
452 return ERR_INVALID_SIZE;
453 }
454
455 const auto permissions_type = static_cast<MemoryPermission>(permissions);
456 if (permissions_type != MemoryPermission::Read &&
457 permissions_type != MemoryPermission::ReadWrite) {
458 LOG_ERROR(Kernel_SVC, "Invalid permissions=0x{:08X}", permissions);
459 return ERR_INVALID_MEMORY_PERMISSIONS;
460 }
461
447 auto& kernel = Core::System::GetInstance().Kernel(); 462 auto& kernel = Core::System::GetInstance().Kernel();
448 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle); 463 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle);
449 if (!shared_memory) { 464 if (!shared_memory) {
450 return ERR_INVALID_HANDLE; 465 return ERR_INVALID_HANDLE;
451 } 466 }
452 467
453 MemoryPermission permissions_type = static_cast<MemoryPermission>(permissions); 468 return shared_memory->Map(Core::CurrentProcess().get(), addr, permissions_type,
454 switch (permissions_type) { 469 MemoryPermission::DontCare);
455 case MemoryPermission::Read:
456 case MemoryPermission::Write:
457 case MemoryPermission::ReadWrite:
458 case MemoryPermission::Execute:
459 case MemoryPermission::ReadExecute:
460 case MemoryPermission::WriteExecute:
461 case MemoryPermission::ReadWriteExecute:
462 case MemoryPermission::DontCare:
463 return shared_memory->Map(Core::CurrentProcess().get(), addr, permissions_type,
464 MemoryPermission::DontCare);
465 default:
466 LOG_ERROR(Kernel_SVC, "unknown permissions=0x{:08X}", permissions);
467 }
468
469 return RESULT_SUCCESS;
470} 470}
471 471
472static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { 472static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) {
473 LOG_WARNING(Kernel_SVC, "called, shared_memory_handle=0x{:08X}, addr=0x{:X}, size=0x{:X}", 473 LOG_WARNING(Kernel_SVC, "called, shared_memory_handle=0x{:08X}, addr=0x{:X}, size=0x{:X}",
474 shared_memory_handle, addr, size); 474 shared_memory_handle, addr, size);
475 475
476 if (!Is4KBAligned(addr)) {
477 return ERR_INVALID_ADDRESS;
478 }
479
480 if (size == 0 || !Is4KBAligned(size)) {
481 return ERR_INVALID_SIZE;
482 }
483
476 auto& kernel = Core::System::GetInstance().Kernel(); 484 auto& kernel = Core::System::GetInstance().Kernel();
477 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle); 485 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle);
478 486