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