mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	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.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user