summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/k_page_table_manager.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_page_table_manager.h b/src/core/hle/kernel/k_page_table_manager.h
new file mode 100644
index 000000000..91a45cde3
--- /dev/null
+++ b/src/core/hle/kernel/k_page_table_manager.h
@@ -0,0 +1,55 @@
1// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <atomic>
7
8#include "common/common_types.h"
9#include "core/hle/kernel/k_dynamic_resource_manager.h"
10#include "core/hle/kernel/k_page_table_slab_heap.h"
11
12namespace Kernel {
13
14class KPageTableManager : public KDynamicResourceManager<impl::PageTablePage, true> {
15public:
16 using RefCount = KPageTableSlabHeap::RefCount;
17 static constexpr size_t PageTableSize = KPageTableSlabHeap::PageTableSize;
18
19public:
20 KPageTableManager() = default;
21
22 void Initialize(KDynamicPageManager* page_allocator, KPageTableSlabHeap* pt_heap) {
23 m_pt_heap = pt_heap;
24
25 static_assert(std::derived_from<KPageTableSlabHeap, DynamicSlabType>);
26 BaseHeap::Initialize(page_allocator, pt_heap);
27 }
28
29 VAddr Allocate() {
30 return VAddr(BaseHeap::Allocate());
31 }
32
33 RefCount GetRefCount(VAddr addr) const {
34 return m_pt_heap->GetRefCount(addr);
35 }
36
37 void Open(VAddr addr, int count) {
38 return m_pt_heap->Open(addr, count);
39 }
40
41 bool Close(VAddr addr, int count) {
42 return m_pt_heap->Close(addr, count);
43 }
44
45 bool IsInPageTableHeap(VAddr addr) const {
46 return m_pt_heap->IsInRange(addr);
47 }
48
49private:
50 using BaseHeap = KDynamicResourceManager<impl::PageTablePage, true>;
51
52 KPageTableSlabHeap* m_pt_heap{};
53};
54
55} // namespace Kernel