mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	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)); | ||||
| } | ||||
| 
 | ||||
| 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, | ||||
|                                                             MemoryState state) { | ||||
|     ASSERT(memory != nullptr); | ||||
|  |  | |||
|  | @ -144,6 +144,18 @@ public: | |||
|     ResultVal<VMAHandle> MapMemoryBlock(VAddr target, std::shared_ptr<std::vector<u8>> block, | ||||
|                                         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. | ||||
|      * | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue