Kernel/VMManager: Added a function to map a block of memory into the first available address after a given base.
This commit is contained in:
parent
44d07574b1
commit
928202f744
2 changed files with 39 additions and 0 deletions
|
@ -93,6 +93,33 @@ ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target,
|
||||||
return MakeResult<VMAHandle>(MergeAdjacent(vma_handle));
|
return MakeResult<VMAHandle>(MergeAdjacent(vma_handle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResultVal<VAddr> VMManager::MapMemoryBlockToBase(VAddr base, std::shared_ptr<std::vector<u8>> block,
|
||||||
|
size_t offset, u32 size, MemoryState state) {
|
||||||
|
|
||||||
|
// Find the first Free VMA.
|
||||||
|
VMAHandle vma_handle = std::find_if(vma_map.begin(), vma_map.end(), [&](const auto& vma) {
|
||||||
|
if (vma.second.type != VMAType::Free)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
VAddr vma_end = vma.second.base + vma.second.size;
|
||||||
|
return vma_end > base && vma_end >= base + size;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (vma_handle == vma_map.end()) {
|
||||||
|
return ResultCode(ErrorDescription::OutOfMemory, ErrorModule::Kernel,
|
||||||
|
ErrorSummary::OutOfResource, ErrorLevel::Permanent);
|
||||||
|
}
|
||||||
|
|
||||||
|
VAddr target = std::max(base, vma_handle->second.base);
|
||||||
|
|
||||||
|
auto result = MapMemoryBlock(target, block, offset, size, state);
|
||||||
|
|
||||||
|
if (result.Failed())
|
||||||
|
return result.Code();
|
||||||
|
|
||||||
|
return MakeResult<VAddr>(target);
|
||||||
|
}
|
||||||
|
|
||||||
ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* memory, u32 size,
|
ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* memory, u32 size,
|
||||||
MemoryState state) {
|
MemoryState state) {
|
||||||
ASSERT(memory != nullptr);
|
ASSERT(memory != nullptr);
|
||||||
|
|
|
@ -144,6 +144,18 @@ public:
|
||||||
ResultVal<VMAHandle> MapMemoryBlock(VAddr target, std::shared_ptr<std::vector<u8>> block,
|
ResultVal<VMAHandle> MapMemoryBlock(VAddr target, std::shared_ptr<std::vector<u8>> block,
|
||||||
size_t offset, u32 size, MemoryState state);
|
size_t offset, u32 size, MemoryState state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps part of a ref-counted block of memory at the first free address after the given base.
|
||||||
|
*
|
||||||
|
* @param base The base address to start the mapping at.
|
||||||
|
* @param block The block to be mapped.
|
||||||
|
* @param offset Offset into `block` to map from.
|
||||||
|
* @param size Size of the mapping.
|
||||||
|
* @param state MemoryState tag to attach to the VMA.
|
||||||
|
* @returns The address at which the memory was mapped.
|
||||||
|
*/
|
||||||
|
ResultVal<VAddr> MapMemoryBlockToBase(VAddr base, std::shared_ptr<std::vector<u8>> block,
|
||||||
|
size_t offset, u32 size, MemoryState state);
|
||||||
/**
|
/**
|
||||||
* Maps an unmanaged host memory pointer at a given address.
|
* Maps an unmanaged host memory pointer at a given address.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue