Kernel/Memory: Added a function to first a suitable guest address at which to allocate a region of a given size.
This commit is contained in:
parent
ef7b2237d9
commit
a609b6907a
|
@ -143,6 +143,26 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me
|
||||||
return MakeResult<VMAHandle>(MergeAdjacent(vma_handle));
|
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,
|
ResultVal<VMManager::VMAHandle> VMManager::MapMMIO(VAddr target, PAddr paddr, u64 size,
|
||||||
MemoryState state,
|
MemoryState state,
|
||||||
Memory::MemoryHookPointer mmio_handler) {
|
Memory::MemoryHookPointer mmio_handler) {
|
||||||
|
|
|
@ -157,6 +157,14 @@ public:
|
||||||
*/
|
*/
|
||||||
ResultVal<VMAHandle> MapBackingMemory(VAddr target, u8* memory, u64 size, MemoryState state);
|
ResultVal<VMAHandle> MapBackingMemory(VAddr target, u8* memory, u64 size, MemoryState state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the first free address that can hold a region of the desired size.
|
||||||
|
*
|
||||||
|
* @param size Size of the desired region.
|
||||||
|
* @return The found free address.
|
||||||
|
*/
|
||||||
|
ResultVal<VAddr> FindFreeRegion(u64 size) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maps a memory-mapped IO region at a given address.
|
* Maps a memory-mapped IO region at a given address.
|
||||||
*
|
*
|
||||||
|
|
Reference in New Issue