From 7ff92c36ed70e75a54d8a15a7806ab9be34b3168 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 5 Jul 2014 10:22:03 -0400 Subject: SharedMemory: Updated MapSharedMemory to use an enum for permissions. - Also added some safety checks to MapSharedMemory. --- src/core/hle/kernel/shared_memory.cpp | 21 ++++++++++++++++----- src/core/hle/kernel/shared_memory.h | 12 +++++++++++- src/core/hle/svc.cpp | 19 +++++++++---------- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index 3030d66f..52823048 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp @@ -27,10 +27,10 @@ public: return 0; } - u32 base_address; ///< Address of shared memory block in RAM - u32 permissions; ///< Permissions of shared memory block (specified by SVC field) - u32 other_permissions; ///< Other permissions of shared memory block (specified by SVC field) - std::string name; ///< Name of shared memory object (optional) + u32 base_address; ///< Address of shared memory block in RAM + MemoryPermission permissions; ///< Permissions of shared memory block (SVC field) + MemoryPermission other_permissions; ///< Other permissions of shared memory block (SVC field) + std::string name; ///< Name of shared memory object (optional) }; //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -67,11 +67,21 @@ Handle CreateSharedMemory(const std::string& name) { * @param other_permissions Memory block map other permissions (specified by SVC field) * @return Result of operation, 0 on success, otherwise error code */ -Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions) { +Result MapSharedMemory(u32 handle, u32 address, MemoryPermission permissions, + MemoryPermission other_permissions) { + + if (address < Memory::SHARED_MEMORY_VADDR || address >= Memory::SHARED_MEMORY_VADDR_END) { + ERROR_LOG(KERNEL, "cannot map handle=0x%08X, address=0x%08X outside of shared mem bounds!", + handle); + return -1; + } SharedMemory* shared_memory = Kernel::g_object_pool.GetFast(handle); + _assert_msg_(KERNEL, (shared_memory != nullptr), "handle 0x%08X is not valid!", handle); + shared_memory->base_address = address; shared_memory->permissions = permissions; shared_memory->other_permissions = other_permissions; + return 0; } @@ -84,6 +94,7 @@ Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permi u8* GetSharedMemoryPointer(Handle handle, u32 offset) { SharedMemory* shared_memory = Kernel::g_object_pool.GetFast(handle); _assert_msg_(KERNEL, (shared_memory != nullptr), "handle 0x%08X is not valid!", handle); + if (0 != shared_memory->base_address) return Memory::GetPointer(shared_memory->base_address + offset); diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index 4e235f60..5312b885 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h @@ -10,6 +10,15 @@ namespace Kernel { +/// Permissions for mapped shared memory blocks +enum class MemoryPermission : u32 { + None = 0, + Read = (1u << 0), + Write = (1u << 1), + ReadWrite = (Read | Write), + DontCare = (1u << 28) +}; + /** * Creates a shared memory object * @param name Optional name of shared memory object @@ -25,7 +34,8 @@ Handle CreateSharedMemory(const std::string& name="Unknown"); * @param other_permissions Memory block map other permissions (specified by SVC field) * @return Result of operation, 0 on success, otherwise error code */ -Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions); +Result MapSharedMemory(u32 handle, u32 address, MemoryPermission permissions, + MemoryPermission other_permissions); /** * Gets a pointer to the shared memory block diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index 746d24a7..9130d77e 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp @@ -29,11 +29,6 @@ enum ControlMemoryOperation { MEMORY_OPERATION_GSP_HEAP = 0x00010003, }; -enum MapMemoryPermission { - MEMORY_PERMISSION_UNMAP = 0x00000000, - MEMORY_PERMISSION_NORMAL = 0x00000001, -}; - /// Map application or GSP heap memory Result ControlMemory(u32* out_addr, u32 operation, u32 addr0, u32 addr1, u32 size, u32 permissions) { DEBUG_LOG(SVC,"called operation=0x%08X, addr0=0x%08X, addr1=0x%08X, size=%08X, permissions=0x%08X", @@ -62,11 +57,15 @@ Result ControlMemory(u32* out_addr, u32 operation, u32 addr0, u32 addr1, u32 siz Result MapMemoryBlock(Handle handle, u32 addr, u32 permissions, u32 other_permissions) { DEBUG_LOG(SVC, "called memblock=0x08X, addr=0x%08X, mypermissions=0x%08X, otherpermission=%d", handle, addr, permissions, other_permissions); - switch (permissions) { - case MEMORY_PERMISSION_NORMAL: - case MEMORY_PERMISSION_NORMAL + 1: - case MEMORY_PERMISSION_NORMAL + 2: - Kernel::MapSharedMemory(handle, addr, permissions, other_permissions); + + Kernel::MemoryPermission permissions_type = static_cast(permissions); + switch (permissions_type) { + case Kernel::MemoryPermission::Read: + case Kernel::MemoryPermission::Write: + case Kernel::MemoryPermission::ReadWrite: + case Kernel::MemoryPermission::DontCare: + Kernel::MapSharedMemory(handle, addr, permissions_type, + static_cast(other_permissions)); break; default: ERROR_LOG(OSHLE, "unknown permissions=0x%08X", permissions); -- cgit v1.2.3