core: hle: kernel: Add KPageTableManager.
This commit is contained in:
parent
6d4f411c08
commit
0897f4f96c
|
@ -224,6 +224,7 @@ add_library(core STATIC
|
||||||
hle/kernel/k_page_group.h
|
hle/kernel/k_page_group.h
|
||||||
hle/kernel/k_page_table.cpp
|
hle/kernel/k_page_table.cpp
|
||||||
hle/kernel/k_page_table.h
|
hle/kernel/k_page_table.h
|
||||||
|
hle/kernel/k_page_table_manager.h
|
||||||
hle/kernel/k_page_table_slab_heap.h
|
hle/kernel/k_page_table_slab_heap.h
|
||||||
hle/kernel/k_port.cpp
|
hle/kernel/k_port.cpp
|
||||||
hle/kernel/k_port.h
|
hle/kernel/k_port.h
|
||||||
|
|
55
src/core/hle/kernel/k_page_table_manager.h
Normal file
55
src/core/hle/kernel/k_page_table_manager.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
#include "core/hle/kernel/k_dynamic_resource_manager.h"
|
||||||
|
#include "core/hle/kernel/k_page_table_slab_heap.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
class KPageTableManager : public KDynamicResourceManager<impl::PageTablePage, true> {
|
||||||
|
public:
|
||||||
|
using RefCount = KPageTableSlabHeap::RefCount;
|
||||||
|
static constexpr size_t PageTableSize = KPageTableSlabHeap::PageTableSize;
|
||||||
|
|
||||||
|
public:
|
||||||
|
KPageTableManager() = default;
|
||||||
|
|
||||||
|
void Initialize(KDynamicPageManager* page_allocator, KPageTableSlabHeap* pt_heap) {
|
||||||
|
m_pt_heap = pt_heap;
|
||||||
|
|
||||||
|
static_assert(std::derived_from<KPageTableSlabHeap, DynamicSlabType>);
|
||||||
|
BaseHeap::Initialize(page_allocator, pt_heap);
|
||||||
|
}
|
||||||
|
|
||||||
|
VAddr Allocate() {
|
||||||
|
return VAddr(BaseHeap::Allocate());
|
||||||
|
}
|
||||||
|
|
||||||
|
RefCount GetRefCount(VAddr addr) const {
|
||||||
|
return m_pt_heap->GetRefCount(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Open(VAddr addr, int count) {
|
||||||
|
return m_pt_heap->Open(addr, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Close(VAddr addr, int count) {
|
||||||
|
return m_pt_heap->Close(addr, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsInPageTableHeap(VAddr addr) const {
|
||||||
|
return m_pt_heap->IsInRange(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
using BaseHeap = KDynamicResourceManager<impl::PageTablePage, true>;
|
||||||
|
|
||||||
|
KPageTableSlabHeap* m_pt_heap{};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Kernel
|
Loading…
Reference in a new issue