summaryrefslogtreecommitdiffstats
path: root/src/common/page_table.h
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2022-02-21 21:39:05 +0100
committerGitHub <noreply@github.com>2022-02-21 21:39:05 +0100
commit21f5912ec935968df50c68742f1b7476e8ca3e0d (patch)
tree4f03caa991cc56521ca09a3e96584ffe226ff227 /src/common/page_table.h
parentMerge pull request #7920 from bunnei/fix-unmap-pages (diff)
parentfixup! core: hle: kernel: KPageTable: Improve Un/MapPhysicalMemory. (diff)
downloadyuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.tar
yuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.tar.gz
yuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.tar.bz2
yuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.tar.lz
yuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.tar.xz
yuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.tar.zst
yuzu-21f5912ec935968df50c68742f1b7476e8ca3e0d.zip
Diffstat (limited to '')
-rw-r--r--src/common/page_table.h24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/common/page_table.h b/src/common/page_table.h
index 8267e8b4d..82d91e9f3 100644
--- a/src/common/page_table.h
+++ b/src/common/page_table.h
@@ -27,6 +27,16 @@ enum class PageType : u8 {
* mimics the way a real CPU page table works.
*/
struct PageTable {
+ struct TraversalEntry {
+ u64 phys_addr{};
+ std::size_t block_size{};
+ };
+
+ struct TraversalContext {
+ u64 next_page{};
+ u64 next_offset{};
+ };
+
/// Number of bits reserved for attribute tagging.
/// This can be at most the guaranteed alignment of the pointers in the page table.
static constexpr int ATTRIBUTE_BITS = 2;
@@ -89,6 +99,10 @@ struct PageTable {
PageTable(PageTable&&) noexcept = default;
PageTable& operator=(PageTable&&) noexcept = default;
+ bool BeginTraversal(TraversalEntry& out_entry, TraversalContext& out_context,
+ u64 address) const;
+ bool ContinueTraversal(TraversalEntry& out_entry, TraversalContext& context) const;
+
/**
* Resizes the page table to be able to accommodate enough pages within
* a given address space.
@@ -96,9 +110,9 @@ struct PageTable {
* @param address_space_width_in_bits The address size width in bits.
* @param page_size_in_bits The page size in bits.
*/
- void Resize(size_t address_space_width_in_bits, size_t page_size_in_bits);
+ void Resize(std::size_t address_space_width_in_bits, std::size_t page_size_in_bits);
- size_t GetAddressSpaceBits() const {
+ std::size_t GetAddressSpaceBits() const {
return current_address_space_width_in_bits;
}
@@ -110,9 +124,11 @@ struct PageTable {
VirtualBuffer<u64> backing_addr;
- size_t current_address_space_width_in_bits;
+ std::size_t current_address_space_width_in_bits{};
+
+ u8* fastmem_arena{};
- u8* fastmem_arena;
+ std::size_t page_size{};
};
} // namespace Common