diff options
author | Subv <subv2112@gmail.com> | 2015-12-31 15:46:32 +0100 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2016-01-14 17:29:19 +0100 |
commit | d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0 (patch) | |
tree | 7d0c54fee5790a5c5071d8441ec7cb6d88e0e527 /src/core/hle/kernel | |
parent | Merge pull request #1309 from lioncash/render (diff) | |
download | yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.tar yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.tar.gz yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.tar.bz2 yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.tar.lz yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.tar.xz yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.tar.zst yuzu-d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0.zip |
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 | 7 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index 1f477664b..d90f0f00f 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp @@ -39,6 +39,12 @@ ResultCode SharedMemory::Map(VAddr address, MemoryPermission permissions, ErrorSummary::InvalidArgument, ErrorLevel::Permanent); } + // TODO(Subv): Return E0E01BEE when permissions and other_permissions don't + // match what was specified when the memory block was created. + + // TODO(Subv): Return E0E01BEE when address should be 0. + // Note: Find out when that's the case. + if (fixed_address != 0) { if (address != 0 && address != fixed_address) { LOG_ERROR(Kernel, "cannot map id=%u, address=0x%08X name=%s: fixed_addres is 0x%08X!", @@ -74,6 +80,21 @@ ResultCode SharedMemory::Map(VAddr address, MemoryPermission permissions, return RESULT_SUCCESS; } +ResultCode SharedMemory::Unmap(VAddr address) { + if (base_address == 0) { + // TODO(Subv): Verify what actually happens when you want to unmap a memory block that + // was originally mapped with address = 0 + return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::OS, ErrorSummary::InvalidArgument, ErrorLevel::Usage); + } + + if (base_address != address) + return ResultCode(ErrorDescription::WrongAddress, ErrorModule::OS, ErrorSummary::InvalidState, ErrorLevel::Usage); + + base_address = 0; + + return RESULT_SUCCESS; +} + u8* SharedMemory::GetPointer(u32 offset) { if (base_address != 0) return Memory::GetPointer(base_address + offset); diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index 35b550d12..b51049ad0 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h @@ -53,6 +53,13 @@ public: ResultCode Map(VAddr address, MemoryPermission permissions, MemoryPermission other_permissions); /** + * Unmaps a shared memory block from the specified address in system memory + * @param address Address in system memory where the shared memory block is mapped + * @return Result code of the unmap operation + */ + ResultCode Unmap(VAddr address); + + /** * Gets a pointer to the shared memory block * @param offset Offset from the start of the shared memory block to get pointer * @return Pointer to the shared memory block from the specified offset |