2020-04-05 21:26:25 +02:00
|
|
|
// Copyright 2020 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
2021-02-13 02:02:51 +01:00
|
|
|
#include "core/hle/kernel/k_memory_block.h"
|
2020-04-05 21:26:25 +02:00
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
namespace Kernel {
|
2020-04-05 21:26:25 +02:00
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
class KMemoryBlockManager final {
|
2020-04-05 21:26:25 +02:00
|
|
|
public:
|
2021-02-13 02:02:51 +01:00
|
|
|
using MemoryBlockTree = std::list<KMemoryBlock>;
|
2020-04-05 21:26:25 +02:00
|
|
|
using iterator = MemoryBlockTree::iterator;
|
|
|
|
using const_iterator = MemoryBlockTree::const_iterator;
|
|
|
|
|
|
|
|
public:
|
2021-05-16 07:46:30 +02:00
|
|
|
KMemoryBlockManager(VAddr start_addr_, VAddr end_addr_);
|
2020-04-05 21:26:25 +02:00
|
|
|
|
|
|
|
iterator end() {
|
|
|
|
return memory_block_tree.end();
|
|
|
|
}
|
|
|
|
const_iterator end() const {
|
|
|
|
return memory_block_tree.end();
|
|
|
|
}
|
|
|
|
const_iterator cend() const {
|
|
|
|
return memory_block_tree.cend();
|
|
|
|
}
|
|
|
|
|
|
|
|
iterator FindIterator(VAddr addr);
|
|
|
|
|
|
|
|
VAddr FindFreeArea(VAddr region_start, std::size_t region_num_pages, std::size_t num_pages,
|
|
|
|
std::size_t align, std::size_t offset, std::size_t guard_pages);
|
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
void Update(VAddr addr, std::size_t num_pages, KMemoryState prev_state,
|
|
|
|
KMemoryPermission prev_perm, KMemoryAttribute prev_attribute, KMemoryState state,
|
|
|
|
KMemoryPermission perm, KMemoryAttribute attribute);
|
2020-04-05 21:26:25 +02:00
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
void Update(VAddr addr, std::size_t num_pages, KMemoryState state,
|
|
|
|
KMemoryPermission perm = KMemoryPermission::None,
|
|
|
|
KMemoryAttribute attribute = KMemoryAttribute::None);
|
2020-04-05 21:26:25 +02:00
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
using LockFunc = std::function<void(iterator, KMemoryPermission)>;
|
|
|
|
void UpdateLock(VAddr addr, std::size_t num_pages, LockFunc&& lock_func,
|
|
|
|
KMemoryPermission perm);
|
2020-04-23 17:37:12 +02:00
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
using IterateFunc = std::function<void(const KMemoryInfo&)>;
|
2020-04-05 21:26:25 +02:00
|
|
|
void IterateForRange(VAddr start, VAddr end, IterateFunc&& func);
|
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
KMemoryBlock& FindBlock(VAddr addr) {
|
2020-04-05 21:26:25 +02:00
|
|
|
return *FindIterator(addr);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
void MergeAdjacent(iterator it, iterator& next_it);
|
|
|
|
|
2020-11-14 23:57:51 +01:00
|
|
|
[[maybe_unused]] const VAddr start_addr;
|
|
|
|
[[maybe_unused]] const VAddr end_addr;
|
2020-04-05 21:26:25 +02:00
|
|
|
|
|
|
|
MemoryBlockTree memory_block_tree;
|
|
|
|
};
|
|
|
|
|
2021-02-13 02:02:51 +01:00
|
|
|
} // namespace Kernel
|