diff options
| author | Zach Hilman <DarkLordZach@users.noreply.github.com> | 2019-07-04 15:32:32 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-04 15:32:32 -0400 |
| commit | 54a02d14fd38282e446a56892a1c45f558ee0e42 (patch) | |
| tree | 79a86a51973712ee8307071a6c5dc471289746eb /src/core/hle/kernel/vm_manager.cpp | |
| parent | cca663792f93b03382c62392655b01a21e8e388b (diff) | |
| parent | e23110bd9fce557ee9ad8542866bc552eda8713f (diff) | |
Merge pull request #2555 from lioncash/tls
kernel/process: Decouple TLS handling from threads
Diffstat (limited to 'src/core/hle/kernel/vm_manager.cpp')
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index c929c2a52..3df5ccb7f 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -152,22 +152,33 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me } 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; + return FindFreeRegion(GetASLRRegionBaseAddress(), GetASLRRegionEndAddress(), size); +} - const VAddr vma_end = vma.second.base + vma.second.size; - return vma_end > base && vma_end >= base + size; - }); +ResultVal<VAddr> VMManager::FindFreeRegion(VAddr begin, VAddr end, u64 size) const { + ASSERT(begin < end); + ASSERT(size <= end - begin); - if (vma_handle == vma_map.end()) { + const VMAHandle vma_handle = + std::find_if(vma_map.begin(), vma_map.end(), [begin, end, size](const auto& vma) { + if (vma.second.type != VMAType::Free) { + return false; + } + const VAddr vma_base = vma.second.base; + const VAddr vma_end = vma_base + vma.second.size; + const VAddr assumed_base = (begin < vma_base) ? vma_base : begin; + const VAddr used_range = assumed_base + size; + + return vma_base <= assumed_base && assumed_base < used_range && used_range < end && + used_range <= vma_end; + }); + + if (vma_handle == vma_map.cend()) { // TODO(Subv): Find the correct error code here. return ResultCode(-1); } - const VAddr target = std::max(base, vma_handle->second.base); + const VAddr target = std::max(begin, vma_handle->second.base); return MakeResult<VAddr>(target); } |
