summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2022-10-29 13:38:45 -0700
committerGravatar bunnei2022-11-03 21:17:06 -0700
commit0897f4f96c2d463976e7a28ac0b69c449bcd9624 (patch)
treed461ac2c010490d10c1ccca037c450ed57c4aaeb /src
parentcore: hle: kernel: Add KPageTableSlabHeap. (diff)
downloadyuzu-0897f4f96c2d463976e7a28ac0b69c449bcd9624.tar.gz
yuzu-0897f4f96c2d463976e7a28ac0b69c449bcd9624.tar.xz
yuzu-0897f4f96c2d463976e7a28ac0b69c449bcd9624.zip
core: hle: kernel: Add KPageTableManager.
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt1
-rw-r--r--src/core/hle/kernel/k_page_table_manager.h55
2 files changed, 56 insertions, 0 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 199e0e69f..f0d5b0887 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -224,6 +224,7 @@ add_library(core STATIC
224 hle/kernel/k_page_group.h 224 hle/kernel/k_page_group.h
225 hle/kernel/k_page_table.cpp 225 hle/kernel/k_page_table.cpp
226 hle/kernel/k_page_table.h 226 hle/kernel/k_page_table.h
227 hle/kernel/k_page_table_manager.h
227 hle/kernel/k_page_table_slab_heap.h 228 hle/kernel/k_page_table_slab_heap.h
228 hle/kernel/k_port.cpp 229 hle/kernel/k_port.cpp
229 hle/kernel/k_port.h 230 hle/kernel/k_port.h
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