|
|
|
@ -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 |