diff options
| author | Subv <subv2112@gmail.com> | 2015-12-31 09:46:32 -0500 |
|---|---|---|
| committer | Subv <subv2112@gmail.com> | 2016-01-14 11:29:19 -0500 |
| commit | d90d5a0ee6b9c08baacd56cb88159d20bbfdb2f0 (patch) | |
| tree | 7d0c54fee5790a5c5071d8441ec7cb6d88e0e527 /src/core/hle/kernel/shared_memory.cpp | |
| parent | 82087672b7eba5a42e081c29b8e7b79cb4f77a25 (diff) | |
HLE/SVC: Implement UnmapMemoryBlock.
This implementation will need to be (almost completely) changed when we implement multiprocess support.
Diffstat (limited to 'src/core/hle/kernel/shared_memory.cpp')
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 21 |
1 files changed, 21 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); |
