summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/core/hle/kernel/shared_memory.cpp21
-rw-r--r--src/core/hle/kernel/shared_memory.h12
-rw-r--r--src/core/hle/svc.cpp19
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 */
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
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
32enum 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
38Result ControlMemory(u32* out_addr, u32 operation, u32 addr0, u32 addr1, u32 size, u32 permissions) { 33Result 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
62Result MapMemoryBlock(Handle handle, u32 addr, u32 permissions, u32 other_permissions) { 57Result 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);