diff options
| author | bunnei <bunneidev@gmail.com> | 2018-10-25 21:54:35 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-25 21:54:35 -0400 |
| commit | a94831f2a99360a7dbc2602affc34bfaa8b048d5 (patch) | |
| tree | e9bfa2d0d7a1fa0ade7ad8c0c34bba7068e6fe9f /src/core/hle/kernel/vm_manager.cpp | |
| parent | a141b46b5c6713952ecd31c591c59f99b898d395 (diff) | |
| parent | cebce2a93adb1c24c3ff14c62f9c052d93886707 (diff) | |
Merge pull request #1557 from bunnei/ldr_ro
Implement the LoadNro functions from the ldr:ro service.
Diffstat (limited to 'src/core/hle/kernel/vm_manager.cpp')
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index e1a34eef1..1a92c8f70 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -143,6 +143,26 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me return MakeResult<VMAHandle>(MergeAdjacent(vma_handle)); } +ResultVal<VAddr> VMManager::FindFreeRegion(u64 size) const { + // Find the first Free VMA. + const VAddr base = GetASLRRegionBaseAddress(); + const VMAHandle vma_handle = std::find_if(vma_map.begin(), vma_map.end(), [&](const auto& vma) { + if (vma.second.type != VMAType::Free) + return false; + + const VAddr vma_end = vma.second.base + vma.second.size; + return vma_end > base && vma_end >= base + size; + }); + + if (vma_handle == vma_map.end()) { + // TODO(Subv): Find the correct error code here. + return ResultCode(-1); + } + + const VAddr target = std::max(base, vma_handle->second.base); + return MakeResult<VAddr>(target); +} + ResultVal<VMManager::VMAHandle> VMManager::MapMMIO(VAddr target, PAddr paddr, u64 size, MemoryState state, Memory::MemoryHookPointer mmio_handler) { |
