diff options
| author | 2018-11-20 16:13:30 -0800 | |
|---|---|---|
| committer | 2018-11-20 16:13:30 -0800 | |
| commit | aa7e53ab5c21be5960c8c4430a493e0016de6679 (patch) | |
| tree | 8a1889793c810770c9d7bb84be085f8296a4c502 /src | |
| parent | Merge pull request #1733 from lioncash/ldr (diff) | |
| parent | kernel/shared_memory: Make Map() and Unmap() take the target process by refer... (diff) | |
| download | yuzu-aa7e53ab5c21be5960c8c4430a493e0016de6679.tar.gz yuzu-aa7e53ab5c21be5960c8c4430a493e0016de6679.tar.xz yuzu-aa7e53ab5c21be5960c8c4430a493e0016de6679.zip | |
Merge pull request #1734 from lioncash/shared
kernel/shared_memory: Make data members private, plus minor interface changes
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.h | 48 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 4 |
3 files changed, 45 insertions, 29 deletions
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index a016a86b6..0494581f5 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp | |||
| @@ -61,7 +61,7 @@ SharedPtr<SharedMemory> SharedMemory::Create(KernelCore& kernel, SharedPtr<Proce | |||
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | SharedPtr<SharedMemory> SharedMemory::CreateForApplet( | 63 | SharedPtr<SharedMemory> SharedMemory::CreateForApplet( |
| 64 | KernelCore& kernel, std::shared_ptr<std::vector<u8>> heap_block, u32 offset, u32 size, | 64 | KernelCore& kernel, std::shared_ptr<std::vector<u8>> heap_block, std::size_t offset, u64 size, |
| 65 | MemoryPermission permissions, MemoryPermission other_permissions, std::string name) { | 65 | MemoryPermission permissions, MemoryPermission other_permissions, std::string name) { |
| 66 | SharedPtr<SharedMemory> shared_memory(new SharedMemory(kernel)); | 66 | SharedPtr<SharedMemory> shared_memory(new SharedMemory(kernel)); |
| 67 | 67 | ||
| @@ -78,10 +78,10 @@ SharedPtr<SharedMemory> SharedMemory::CreateForApplet( | |||
| 78 | return shared_memory; | 78 | return shared_memory; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | ResultCode SharedMemory::Map(Process* target_process, VAddr address, MemoryPermission permissions, | 81 | ResultCode SharedMemory::Map(Process& target_process, VAddr address, MemoryPermission permissions, |
| 82 | MemoryPermission other_permissions) { | 82 | MemoryPermission other_permissions) { |
| 83 | const MemoryPermission own_other_permissions = | 83 | const MemoryPermission own_other_permissions = |
| 84 | target_process == owner_process ? this->permissions : this->other_permissions; | 84 | &target_process == owner_process ? this->permissions : this->other_permissions; |
| 85 | 85 | ||
| 86 | // Automatically allocated memory blocks can only be mapped with other_permissions = DontCare | 86 | // Automatically allocated memory blocks can only be mapped with other_permissions = DontCare |
| 87 | if (base_address == 0 && other_permissions != MemoryPermission::DontCare) { | 87 | if (base_address == 0 && other_permissions != MemoryPermission::DontCare) { |
| @@ -106,7 +106,7 @@ ResultCode SharedMemory::Map(Process* target_process, VAddr address, MemoryPermi | |||
| 106 | VAddr target_address = address; | 106 | VAddr target_address = address; |
| 107 | 107 | ||
| 108 | // Map the memory block into the target process | 108 | // Map the memory block into the target process |
| 109 | auto result = target_process->VMManager().MapMemoryBlock( | 109 | auto result = target_process.VMManager().MapMemoryBlock( |
| 110 | target_address, backing_block, backing_block_offset, size, MemoryState::Shared); | 110 | target_address, backing_block, backing_block_offset, size, MemoryState::Shared); |
| 111 | if (result.Failed()) { | 111 | if (result.Failed()) { |
| 112 | LOG_ERROR( | 112 | LOG_ERROR( |
| @@ -116,14 +116,14 @@ ResultCode SharedMemory::Map(Process* target_process, VAddr address, MemoryPermi | |||
| 116 | return result.Code(); | 116 | return result.Code(); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | return target_process->VMManager().ReprotectRange(target_address, size, | 119 | return target_process.VMManager().ReprotectRange(target_address, size, |
| 120 | ConvertPermissions(permissions)); | 120 | ConvertPermissions(permissions)); |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | ResultCode SharedMemory::Unmap(Process* target_process, VAddr address) { | 123 | ResultCode SharedMemory::Unmap(Process& target_process, VAddr address) { |
| 124 | // TODO(Subv): Verify what happens if the application tries to unmap an address that is not | 124 | // TODO(Subv): Verify what happens if the application tries to unmap an address that is not |
| 125 | // mapped to a SharedMemory. | 125 | // mapped to a SharedMemory. |
| 126 | return target_process->VMManager().UnmapRange(address, size); | 126 | return target_process.VMManager().UnmapRange(address, size); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | VMAPermission SharedMemory::ConvertPermissions(MemoryPermission permission) { | 129 | VMAPermission SharedMemory::ConvertPermissions(MemoryPermission permission) { |
| @@ -132,7 +132,11 @@ VMAPermission SharedMemory::ConvertPermissions(MemoryPermission permission) { | |||
| 132 | return static_cast<VMAPermission>(masked_permissions); | 132 | return static_cast<VMAPermission>(masked_permissions); |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | u8* SharedMemory::GetPointer(u32 offset) { | 135 | u8* SharedMemory::GetPointer(std::size_t offset) { |
| 136 | return backing_block->data() + backing_block_offset + offset; | ||
| 137 | } | ||
| 138 | |||
| 139 | const u8* SharedMemory::GetPointer(std::size_t offset) const { | ||
| 136 | return backing_block->data() + backing_block_offset + offset; | 140 | return backing_block->data() + backing_block_offset + offset; |
| 137 | } | 141 | } |
| 138 | 142 | ||
diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index 2c06bb7ce..0b48db699 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h | |||
| @@ -64,7 +64,7 @@ public: | |||
| 64 | */ | 64 | */ |
| 65 | static SharedPtr<SharedMemory> CreateForApplet(KernelCore& kernel, | 65 | static SharedPtr<SharedMemory> CreateForApplet(KernelCore& kernel, |
| 66 | std::shared_ptr<std::vector<u8>> heap_block, | 66 | std::shared_ptr<std::vector<u8>> heap_block, |
| 67 | u32 offset, u32 size, | 67 | std::size_t offset, u64 size, |
| 68 | MemoryPermission permissions, | 68 | MemoryPermission permissions, |
| 69 | MemoryPermission other_permissions, | 69 | MemoryPermission other_permissions, |
| 70 | std::string name = "Unknown Applet"); | 70 | std::string name = "Unknown Applet"); |
| @@ -81,6 +81,11 @@ public: | |||
| 81 | return HANDLE_TYPE; | 81 | return HANDLE_TYPE; |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | /// Gets the size of the underlying memory block in bytes. | ||
| 85 | u64 GetSize() const { | ||
| 86 | return size; | ||
| 87 | } | ||
| 88 | |||
| 84 | /** | 89 | /** |
| 85 | * Converts the specified MemoryPermission into the equivalent VMAPermission. | 90 | * Converts the specified MemoryPermission into the equivalent VMAPermission. |
| 86 | * @param permission The MemoryPermission to convert. | 91 | * @param permission The MemoryPermission to convert. |
| @@ -94,44 +99,51 @@ public: | |||
| 94 | * @param permissions Memory block map permissions (specified by SVC field) | 99 | * @param permissions Memory block map permissions (specified by SVC field) |
| 95 | * @param other_permissions Memory block map other permissions (specified by SVC field) | 100 | * @param other_permissions Memory block map other permissions (specified by SVC field) |
| 96 | */ | 101 | */ |
| 97 | ResultCode Map(Process* target_process, VAddr address, MemoryPermission permissions, | 102 | ResultCode Map(Process& target_process, VAddr address, MemoryPermission permissions, |
| 98 | MemoryPermission other_permissions); | 103 | MemoryPermission other_permissions); |
| 99 | 104 | ||
| 100 | /** | 105 | /** |
| 101 | * Unmaps a shared memory block from the specified address in system memory | 106 | * Unmaps a shared memory block from the specified address in system memory |
| 102 | * @param target_process Process from which to umap the memory block. | 107 | * @param target_process Process from which to unmap the memory block. |
| 103 | * @param address Address in system memory where the shared memory block is mapped | 108 | * @param address Address in system memory where the shared memory block is mapped |
| 104 | * @return Result code of the unmap operation | 109 | * @return Result code of the unmap operation |
| 105 | */ | 110 | */ |
| 106 | ResultCode Unmap(Process* target_process, VAddr address); | 111 | ResultCode Unmap(Process& target_process, VAddr address); |
| 107 | 112 | ||
| 108 | /** | 113 | /** |
| 109 | * Gets a pointer to the shared memory block | 114 | * Gets a pointer to the shared memory block |
| 110 | * @param offset Offset from the start of the shared memory block to get pointer | 115 | * @param offset Offset from the start of the shared memory block to get pointer |
| 111 | * @return Pointer to the shared memory block from the specified offset | 116 | * @return A pointer to the shared memory block from the specified offset |
| 112 | */ | 117 | */ |
| 113 | u8* GetPointer(u32 offset = 0); | 118 | u8* GetPointer(std::size_t offset = 0); |
| 119 | |||
| 120 | /** | ||
| 121 | * Gets a constant pointer to the shared memory block | ||
| 122 | * @param offset Offset from the start of the shared memory block to get pointer | ||
| 123 | * @return A constant pointer to the shared memory block from the specified offset | ||
| 124 | */ | ||
| 125 | const u8* GetPointer(std::size_t offset = 0) const; | ||
| 126 | |||
| 127 | private: | ||
| 128 | explicit SharedMemory(KernelCore& kernel); | ||
| 129 | ~SharedMemory() override; | ||
| 114 | 130 | ||
| 115 | /// Process that created this shared memory block. | ||
| 116 | SharedPtr<Process> owner_process; | ||
| 117 | /// Address of shared memory block in the owner process if specified. | ||
| 118 | VAddr base_address; | ||
| 119 | /// Backing memory for this shared memory block. | 131 | /// Backing memory for this shared memory block. |
| 120 | std::shared_ptr<std::vector<u8>> backing_block; | 132 | std::shared_ptr<std::vector<u8>> backing_block; |
| 121 | /// Offset into the backing block for this shared memory. | 133 | /// Offset into the backing block for this shared memory. |
| 122 | std::size_t backing_block_offset; | 134 | std::size_t backing_block_offset = 0; |
| 123 | /// Size of the memory block. Page-aligned. | 135 | /// Size of the memory block. Page-aligned. |
| 124 | u64 size; | 136 | u64 size = 0; |
| 125 | /// Permission restrictions applied to the process which created the block. | 137 | /// Permission restrictions applied to the process which created the block. |
| 126 | MemoryPermission permissions; | 138 | MemoryPermission permissions{}; |
| 127 | /// Permission restrictions applied to other processes mapping the block. | 139 | /// Permission restrictions applied to other processes mapping the block. |
| 128 | MemoryPermission other_permissions; | 140 | MemoryPermission other_permissions{}; |
| 141 | /// Process that created this shared memory block. | ||
| 142 | SharedPtr<Process> owner_process; | ||
| 143 | /// Address of shared memory block in the owner process if specified. | ||
| 144 | VAddr base_address = 0; | ||
| 129 | /// Name of shared memory object. | 145 | /// Name of shared memory object. |
| 130 | std::string name; | 146 | std::string name; |
| 131 | |||
| 132 | private: | ||
| 133 | explicit SharedMemory(KernelCore& kernel); | ||
| 134 | ~SharedMemory() override; | ||
| 135 | }; | 147 | }; |
| 136 | 148 | ||
| 137 | } // namespace Kernel | 149 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 51c367de7..b8b6b4d49 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -789,7 +789,7 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s | |||
| 789 | return ERR_INVALID_MEMORY_RANGE; | 789 | return ERR_INVALID_MEMORY_RANGE; |
| 790 | } | 790 | } |
| 791 | 791 | ||
| 792 | return shared_memory->Map(current_process, addr, permissions_type, MemoryPermission::DontCare); | 792 | return shared_memory->Map(*current_process, addr, permissions_type, MemoryPermission::DontCare); |
| 793 | } | 793 | } |
| 794 | 794 | ||
| 795 | static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { | 795 | static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { |
| @@ -819,7 +819,7 @@ static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 | |||
| 819 | return ERR_INVALID_MEMORY_RANGE; | 819 | return ERR_INVALID_MEMORY_RANGE; |
| 820 | } | 820 | } |
| 821 | 821 | ||
| 822 | return shared_memory->Unmap(current_process, addr); | 822 | return shared_memory->Unmap(*current_process, addr); |
| 823 | } | 823 | } |
| 824 | 824 | ||
| 825 | /// Query process memory | 825 | /// Query process memory |