diff options
| author | 2014-07-05 10:22:03 -0400 | |
|---|---|---|
| committer | 2014-07-05 10:24:54 -0400 | |
| commit | 7ff92c36ed70e75a54d8a15a7806ab9be34b3168 (patch) | |
| tree | fe2d322dc00edc55786956e5c94588205ae332b6 /src/core/hle/kernel | |
| 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/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.h | 12 |
2 files changed, 27 insertions, 6 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 |