1 // Copyright 2020 yuzu Emulator Project 2 // Licensed under GPLv2 or any later version 3 // Refer to the license.txt file included. 4 5 #pragma once 6 7 #include <functional> 8 #include <list> 9 10 #include "common/common_types.h" 11 #include "core/hle/kernel/memory/memory_block.h" 12 13 namespace Kernel::Memory { 14 15 class MemoryBlockManager final { 16 public: 17 using MemoryBlockTree = std::list<MemoryBlock>; 18 using iterator = MemoryBlockTree::iterator; 19 using const_iterator = MemoryBlockTree::const_iterator; 20 21 public: 22 MemoryBlockManager(VAddr start_addr, VAddr end_addr); 23 end()24 iterator end() { 25 return memory_block_tree.end(); 26 } end()27 const_iterator end() const { 28 return memory_block_tree.end(); 29 } cend()30 const_iterator cend() const { 31 return memory_block_tree.cend(); 32 } 33 34 iterator FindIterator(VAddr addr); 35 36 VAddr FindFreeArea(VAddr region_start, std::size_t region_num_pages, std::size_t num_pages, 37 std::size_t align, std::size_t offset, std::size_t guard_pages); 38 39 void Update(VAddr addr, std::size_t num_pages, MemoryState prev_state, 40 MemoryPermission prev_perm, MemoryAttribute prev_attribute, MemoryState state, 41 MemoryPermission perm, MemoryAttribute attribute); 42 43 void Update(VAddr addr, std::size_t num_pages, MemoryState state, 44 MemoryPermission perm = MemoryPermission::None, 45 MemoryAttribute attribute = MemoryAttribute::None); 46 47 using LockFunc = std::function<void(iterator, MemoryPermission)>; 48 void UpdateLock(VAddr addr, std::size_t num_pages, LockFunc&& lock_func, MemoryPermission perm); 49 50 using IterateFunc = std::function<void(const MemoryInfo&)>; 51 void IterateForRange(VAddr start, VAddr end, IterateFunc&& func); 52 FindBlock(VAddr addr)53 MemoryBlock& FindBlock(VAddr addr) { 54 return *FindIterator(addr); 55 } 56 57 private: 58 void MergeAdjacent(iterator it, iterator& next_it); 59 60 [[maybe_unused]] const VAddr start_addr; 61 [[maybe_unused]] const VAddr end_addr; 62 63 MemoryBlockTree memory_block_tree; 64 }; 65 66 } // namespace Kernel::Memory 67