summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar bunnei2014-07-05 10:22:03 -0400
committerGravatar bunnei2014-07-05 10:24:54 -0400
commit7ff92c36ed70e75a54d8a15a7806ab9be34b3168 (patch)
treefe2d322dc00edc55786956e5c94588205ae332b6 /src/core/hle/kernel
parentMemory: Removed deprecated MapBlock_Shared function. (diff)
downloadyuzu-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.cpp21
-rw-r--r--src/core/hle/kernel/shared_memory.h12
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 */
70Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions) { 70Result 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
84u8* GetSharedMemoryPointer(Handle handle, u32 offset) { 94u8* 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
11namespace Kernel { 11namespace Kernel {
12 12
13/// Permissions for mapped shared memory blocks
14enum 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 */
28Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions); 37Result 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