diff options
| author | 2014-07-05 10:22:03 -0400 | |
|---|---|---|
| committer | 2014-07-05 10:24:54 -0400 | |
| commit | 7ff92c36ed70e75a54d8a15a7806ab9be34b3168 (patch) | |
| tree | fe2d322dc00edc55786956e5c94588205ae332b6 /src | |
| parent | Memory: Removed deprecated MapBlock_Shared function. (diff) | |
| download | yuzu-7ff92c36ed70e75a54d8a15a7806ab9be34b3168.tar.gz yuzu-7ff92c36ed70e75a54d8a15a7806ab9be34b3168.tar.xz yuzu-7ff92c36ed70e75a54d8a15a7806ab9be34b3168.zip | |
SharedMemory: Updated MapSharedMemory to use an enum for permissions.
- Also added some safety checks to MapSharedMemory.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.h | 12 | ||||
| -rw-r--r-- | 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 3030d66fa..52823048f 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp | |||
| @@ -27,10 +27,10 @@ public: | |||
| 27 | return 0; | 27 | return 0; |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | u32 base_address; ///< Address of shared memory block in RAM | 30 | u32 base_address; ///< Address of shared memory block in RAM |
| 31 | u32 permissions; ///< Permissions of shared memory block (specified by SVC field) | 31 | MemoryPermission permissions; ///< Permissions of shared memory block (SVC field) |
| 32 | u32 other_permissions; ///< Other permissions of shared memory block (specified by SVC field) | 32 | MemoryPermission other_permissions; ///< Other permissions of shared memory block (SVC field) |
| 33 | std::string name; ///< Name of shared memory object (optional) | 33 | std::string name; ///< Name of shared memory object (optional) |
| 34 | }; | 34 | }; |
| 35 | 35 | ||
| 36 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 36 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
| @@ -67,11 +67,21 @@ Handle CreateSharedMemory(const std::string& name) { | |||
| 67 | * @param other_permissions Memory block map other permissions (specified by SVC field) | 67 | * @param other_permissions Memory block map other permissions (specified by SVC field) |
| 68 | * @return Result of operation, 0 on success, otherwise error code | 68 | * @return Result of operation, 0 on success, otherwise error code |
| 69 | */ | 69 | */ |
| 70 | Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions) { | 70 | Result MapSharedMemory(u32 handle, u32 address, MemoryPermission permissions, |
| 71 | MemoryPermission other_permissions) { | ||
| 72 | |||
| 73 | if (address < Memory::SHARED_MEMORY_VADDR || address >= Memory::SHARED_MEMORY_VADDR_END) { | ||
| 74 | ERROR_LOG(KERNEL, "cannot map handle=0x%08X, address=0x%08X outside of shared mem bounds!", | ||
| 75 | handle); | ||
| 76 | return -1; | ||
| 77 | } | ||
| 71 | SharedMemory* shared_memory = Kernel::g_object_pool.GetFast<SharedMemory>(handle); | 78 | SharedMemory* shared_memory = Kernel::g_object_pool.GetFast<SharedMemory>(handle); |
| 79 | _assert_msg_(KERNEL, (shared_memory != nullptr), "handle 0x%08X is not valid!", handle); | ||
| 80 | |||
| 72 | shared_memory->base_address = address; | 81 | shared_memory->base_address = address; |
| 73 | shared_memory->permissions = permissions; | 82 | shared_memory->permissions = permissions; |
| 74 | shared_memory->other_permissions = other_permissions; | 83 | shared_memory->other_permissions = other_permissions; |
| 84 | |||
| 75 | return 0; | 85 | return 0; |
| 76 | } | 86 | } |
| 77 | 87 | ||
| @@ -84,6 +94,7 @@ Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permi | |||
| 84 | u8* GetSharedMemoryPointer(Handle handle, u32 offset) { | 94 | u8* GetSharedMemoryPointer(Handle handle, u32 offset) { |
| 85 | SharedMemory* shared_memory = Kernel::g_object_pool.GetFast<SharedMemory>(handle); | 95 | SharedMemory* shared_memory = Kernel::g_object_pool.GetFast<SharedMemory>(handle); |
| 86 | _assert_msg_(KERNEL, (shared_memory != nullptr), "handle 0x%08X is not valid!", handle); | 96 | _assert_msg_(KERNEL, (shared_memory != nullptr), "handle 0x%08X is not valid!", handle); |
| 97 | |||
| 87 | if (0 != shared_memory->base_address) | 98 | if (0 != shared_memory->base_address) |
| 88 | return Memory::GetPointer(shared_memory->base_address + offset); | 99 | return Memory::GetPointer(shared_memory->base_address + offset); |
| 89 | 100 | ||
diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index 4e235f605..5312b8854 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h | |||
| @@ -10,6 +10,15 @@ | |||
| 10 | 10 | ||
| 11 | namespace Kernel { | 11 | namespace Kernel { |
| 12 | 12 | ||
| 13 | /// Permissions for mapped shared memory blocks | ||
| 14 | enum class MemoryPermission : u32 { | ||
| 15 | None = 0, | ||
| 16 | Read = (1u << 0), | ||
| 17 | Write = (1u << 1), | ||
| 18 | ReadWrite = (Read | Write), | ||
| 19 | DontCare = (1u << 28) | ||
| 20 | }; | ||
| 21 | |||
| 13 | /** | 22 | /** |
| 14 | * Creates a shared memory object | 23 | * Creates a shared memory object |
| 15 | * @param name Optional name of shared memory object | 24 | * @param name Optional name of shared memory object |
| @@ -25,7 +34,8 @@ Handle CreateSharedMemory(const std::string& name="Unknown"); | |||
| 25 | * @param other_permissions Memory block map other permissions (specified by SVC field) | 34 | * @param other_permissions Memory block map other permissions (specified by SVC field) |
| 26 | * @return Result of operation, 0 on success, otherwise error code | 35 | * @return Result of operation, 0 on success, otherwise error code |
| 27 | */ | 36 | */ |
| 28 | Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions); | 37 | Result MapSharedMemory(u32 handle, u32 address, MemoryPermission permissions, |
| 38 | MemoryPermission other_permissions); | ||
| 29 | 39 | ||
| 30 | /** | 40 | /** |
| 31 | * Gets a pointer to the shared memory block | 41 | * Gets a pointer to the shared memory block |
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index 746d24a70..9130d77ec 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp | |||
| @@ -29,11 +29,6 @@ enum ControlMemoryOperation { | |||
| 29 | MEMORY_OPERATION_GSP_HEAP = 0x00010003, | 29 | MEMORY_OPERATION_GSP_HEAP = 0x00010003, |
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | enum MapMemoryPermission { | ||
| 33 | MEMORY_PERMISSION_UNMAP = 0x00000000, | ||
| 34 | MEMORY_PERMISSION_NORMAL = 0x00000001, | ||
| 35 | }; | ||
| 36 | |||
| 37 | /// Map application or GSP heap memory | 32 | /// Map application or GSP heap memory |
| 38 | Result ControlMemory(u32* out_addr, u32 operation, u32 addr0, u32 addr1, u32 size, u32 permissions) { | 33 | Result ControlMemory(u32* out_addr, u32 operation, u32 addr0, u32 addr1, u32 size, u32 permissions) { |
| 39 | DEBUG_LOG(SVC,"called operation=0x%08X, addr0=0x%08X, addr1=0x%08X, size=%08X, permissions=0x%08X", | 34 | 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 | |||
| 62 | Result MapMemoryBlock(Handle handle, u32 addr, u32 permissions, u32 other_permissions) { | 57 | Result MapMemoryBlock(Handle handle, u32 addr, u32 permissions, u32 other_permissions) { |
| 63 | DEBUG_LOG(SVC, "called memblock=0x08X, addr=0x%08X, mypermissions=0x%08X, otherpermission=%d", | 58 | DEBUG_LOG(SVC, "called memblock=0x08X, addr=0x%08X, mypermissions=0x%08X, otherpermission=%d", |
| 64 | handle, addr, permissions, other_permissions); | 59 | handle, addr, permissions, other_permissions); |
| 65 | switch (permissions) { | 60 | |
| 66 | case MEMORY_PERMISSION_NORMAL: | 61 | Kernel::MemoryPermission permissions_type = static_cast<Kernel::MemoryPermission>(permissions); |
| 67 | case MEMORY_PERMISSION_NORMAL + 1: | 62 | switch (permissions_type) { |
| 68 | case MEMORY_PERMISSION_NORMAL + 2: | 63 | case Kernel::MemoryPermission::Read: |
| 69 | Kernel::MapSharedMemory(handle, addr, permissions, other_permissions); | 64 | case Kernel::MemoryPermission::Write: |
| 65 | case Kernel::MemoryPermission::ReadWrite: | ||
| 66 | case Kernel::MemoryPermission::DontCare: | ||
| 67 | Kernel::MapSharedMemory(handle, addr, permissions_type, | ||
| 68 | static_cast<Kernel::MemoryPermission>(other_permissions)); | ||
| 70 | break; | 69 | break; |
| 71 | default: | 70 | default: |
| 72 | ERROR_LOG(OSHLE, "unknown permissions=0x%08X", permissions); | 71 | ERROR_LOG(OSHLE, "unknown permissions=0x%08X", permissions); |