diff options
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 42 |
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 | ||
| 472 | static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { | 472 | static 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 | ||